mirror of
https://github.com/zoriya/flood.git
synced 2026-06-03 19:21:48 +00:00
Add stores
This commit is contained in:
@@ -0,0 +1,172 @@
|
||||
import _ from 'lodash';
|
||||
|
||||
import ActionTypes from '../constants/ActionTypes';
|
||||
import AppDispatcher from '../dispatcher/AppDispatcher';
|
||||
import BaseStore from './BaseStore';
|
||||
import EventTypes from '../constants/EventTypes';
|
||||
import {filterTorrents} from '../util/filterTorrents';
|
||||
import {searchTorrents} from '../util/searchTorrents';
|
||||
import {selectTorrents} from '../util/selectTorrents';
|
||||
import {sortTorrents} from '../util/sortTorrents';
|
||||
import TorrentActions from '../actions/TorrentActions';
|
||||
import TorrentFilterStore from './TorrentFilterStore';
|
||||
import UIStore from './UIStore';
|
||||
|
||||
const pollInterval = 5000;
|
||||
|
||||
class TorrentStoreClass extends BaseStore {
|
||||
constructor() {
|
||||
super();
|
||||
|
||||
this.pollTorrentDetailsIntervalID = null;
|
||||
this.pollTorrentsIntervalID = null;
|
||||
this.isPollingTorrentDetails = false;
|
||||
this.isPollingTorrents = false;
|
||||
this.selectedTorrents = [];
|
||||
this.torrentDetails = {};
|
||||
this.torrents = [];
|
||||
}
|
||||
|
||||
fetchTorrentDetails() {
|
||||
TorrentActions.fetchTorrentDetails(UIStore.getTorrentDetailsHash());
|
||||
if (!this.isPollingTorrentDetails) {
|
||||
this.stopPollingTorrentDetails();
|
||||
this.startPollingTorrentDetails();
|
||||
}
|
||||
}
|
||||
|
||||
fetchTorrents() {
|
||||
TorrentActions.fetchTorrents();
|
||||
|
||||
if (!this.isPollingTorrents) {
|
||||
this.startPollingTorrents();
|
||||
}
|
||||
}
|
||||
|
||||
getTorrentDetails(hash) {
|
||||
return this.torrentDetails[hash] || {};
|
||||
}
|
||||
|
||||
setTorrentDetails(hash, torrentDetails) {
|
||||
this.torrentDetails[hash] = torrentDetails;
|
||||
this.emit(EventTypes.CLIENT_TORRENT_DETAILS_CHANGE);
|
||||
}
|
||||
|
||||
getSelectedTorrents() {
|
||||
return this.selectedTorrents;
|
||||
}
|
||||
|
||||
setSelectedTorrents(event, hash) {
|
||||
this.selectedTorrents = selectTorrents({
|
||||
event,
|
||||
hash,
|
||||
selectedTorrents: this.selectedTorrents,
|
||||
torrentList: this.torrents
|
||||
});
|
||||
this.emit(EventTypes.UI_TORRENT_SELECTION_CHANGE);
|
||||
}
|
||||
|
||||
getTorrent(hash) {
|
||||
return _.find(this.torrents, (torrent) => {
|
||||
return torrent.hash === hash;
|
||||
});
|
||||
}
|
||||
|
||||
getTorrents() {
|
||||
if (TorrentFilterStore.getStatusFilter() ||
|
||||
TorrentFilterStore.getSearchFilter()) {
|
||||
return this.filteredTorrents;
|
||||
}
|
||||
|
||||
return this.torrents;
|
||||
}
|
||||
|
||||
setTorrents(torrents) {
|
||||
this.torrents = sortTorrents(
|
||||
Object.assign([], torrents),
|
||||
TorrentFilterStore.getTorrentsSort()
|
||||
);
|
||||
|
||||
let statusFilter = TorrentFilterStore.getStatusFilter();
|
||||
let searchFilter = TorrentFilterStore.getSearchFilter();
|
||||
|
||||
if (statusFilter || searchFilter) {
|
||||
let filteredTorrents = Object.assign([], this.torrents);
|
||||
|
||||
if (statusFilter && statusFilter !== 'all') {
|
||||
filteredTorrents = filterTorrents(filteredTorrents, statusFilter);
|
||||
}
|
||||
|
||||
if (searchFilter && searchFilter !== '') {
|
||||
filteredTorrents = searchTorrents(filteredTorrents, searchFilter);
|
||||
}
|
||||
|
||||
this.filteredTorrents = filteredTorrents;
|
||||
}
|
||||
|
||||
this.emit(EventTypes.CLIENT_TORRENTS_REQUEST_SUCCESS);
|
||||
}
|
||||
|
||||
startPollingTorrentDetails() {
|
||||
this.isPollingTorrentDetails = true;
|
||||
this.pollTorrentDetailsIntervalID = setInterval(
|
||||
this.fetchTorrentDetails.bind(this),
|
||||
pollInterval
|
||||
);
|
||||
}
|
||||
|
||||
startPollingTorrents() {
|
||||
this.isPollingTorrents = true;
|
||||
this.pollTorrentsIntervalID = setInterval(
|
||||
this.fetchTorrents.bind(this),
|
||||
pollInterval
|
||||
);
|
||||
}
|
||||
|
||||
stopPollingTorrentDetails() {
|
||||
clearInterval(this.pollTorrentDetailsIntervalID);
|
||||
this.isPollingTorrents = false;
|
||||
}
|
||||
|
||||
stopPollingTorrents() {
|
||||
clearInterval(this.pollTorrentsIntervalID);
|
||||
this.isPollingTorrentDetails = false;
|
||||
}
|
||||
|
||||
triggerTorrentsFilter() {
|
||||
this.setTorrents(this.torrents);
|
||||
}
|
||||
}
|
||||
|
||||
const TorrentStore = new TorrentStoreClass();
|
||||
|
||||
AppDispatcher.register((payload) => {
|
||||
const {action, source} = payload;
|
||||
|
||||
switch (action.type) {
|
||||
case ActionTypes.CLIENT_FETCH_TORRENT_DETAILS_SUCCESS:
|
||||
TorrentStore.setTorrentDetails(action.data.hash, action.data.torrentDetails);
|
||||
break;
|
||||
case ActionTypes.CLIENT_FETCH_TORRENTS_SUCCESS:
|
||||
TorrentStore.setTorrents(action.data.torrents);
|
||||
break;
|
||||
case ActionTypes.CLIENT_FETCH_TORRENTS_ERROR:
|
||||
console.log(action);
|
||||
break;
|
||||
case ActionTypes.UI_CLICK_TORRENT:
|
||||
TorrentStore.setSelectedTorrents(action.data.event, action.data.hash);
|
||||
break;
|
||||
case ActionTypes.UI_SET_TORRENT_STATUS_FILTER:
|
||||
case ActionTypes.UI_SET_TORRENT_SEARCH_FILTER:
|
||||
case ActionTypes.UI_SET_TORRENT_SORT:
|
||||
TorrentStore.triggerTorrentsFilter();
|
||||
break;
|
||||
case ActionTypes.CLIENT_ADD_TORRENT_SUCCESS:
|
||||
case ActionTypes.CLIENT_START_TORRENT_SUCCESS:
|
||||
case ActionTypes.CLIENT_STOP_TORRENT_SUCCESS:
|
||||
TorrentStore.fetchTorrents();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
export default TorrentStore;
|
||||
Reference in New Issue
Block a user