import React, { useCallback, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import AppState from 'App/State/AppState'; import Alert from 'Components/Alert'; import LoadingIndicator from 'Components/Loading/LoadingIndicator'; import FilterMenu from 'Components/Menu/FilterMenu'; import PageContent from 'Components/Page/PageContent'; import PageContentBody from 'Components/Page/PageContentBody'; import PageToolbar from 'Components/Page/Toolbar/PageToolbar'; import PageToolbarButton from 'Components/Page/Toolbar/PageToolbarButton'; import PageToolbarSection from 'Components/Page/Toolbar/PageToolbarSection'; import Table from 'Components/Table/Table'; import TableBody from 'Components/Table/TableBody'; import TableOptionsModalWrapper from 'Components/Table/TableOptions/TableOptionsModalWrapper'; import TablePager from 'Components/Table/TablePager'; import usePaging from 'Components/Table/usePaging'; import createEpisodesFetchingSelector from 'Episode/createEpisodesFetchingSelector'; import useCurrentPage from 'Helpers/Hooks/useCurrentPage'; import { align, icons, kinds } from 'Helpers/Props'; import { clearEpisodes, fetchEpisodes } from 'Store/Actions/episodeActions'; import { clearEpisodeFiles } from 'Store/Actions/episodeFileActions'; import { clearHistory, fetchHistory, gotoHistoryPage, setHistoryFilter, setHistorySort, setHistoryTableOption, } from 'Store/Actions/historyActions'; import { createCustomFiltersSelector } from 'Store/Selectors/createClientSideCollectionSelector'; import HistoryItem from 'typings/History'; import { TableOptionsChangePayload } from 'typings/Table'; import selectUniqueIds from 'Utilities/Object/selectUniqueIds'; import { registerPagePopulator, unregisterPagePopulator, } from 'Utilities/pagePopulator'; import translate from 'Utilities/String/translate'; import HistoryFilterModal from './HistoryFilterModal'; import HistoryRow from './HistoryRow'; function History() { const requestCurrentPage = useCurrentPage(); const { isFetching, isPopulated, error, items, columns, selectedFilterKey, filters, sortKey, sortDirection, page, pageSize, totalPages, totalRecords, } = useSelector((state: AppState) => state.history); const { isEpisodesFetching, isEpisodesPopulated, episodesError } = useSelector(createEpisodesFetchingSelector()); const customFilters = useSelector(createCustomFiltersSelector('history')); const dispatch = useDispatch(); const isFetchingAny = isFetching || isEpisodesFetching; const isAllPopulated = isPopulated && (isEpisodesPopulated || !items.length); const hasError = error || episodesError; const { handleFirstPagePress, handlePreviousPagePress, handleNextPagePress, handleLastPagePress, handlePageSelect, } = usePaging({ page, totalPages, gotoPage: gotoHistoryPage, }); const handleFilterSelect = useCallback( (selectedFilterKey: string) => { dispatch(setHistoryFilter({ selectedFilterKey })); }, [dispatch] ); const handleSortPress = useCallback( (sortKey: string) => { dispatch(setHistorySort({ sortKey })); }, [dispatch] ); const handleTableOptionChange = useCallback( (payload: TableOptionsChangePayload) => { dispatch(setHistoryTableOption(payload)); if (payload.pageSize) { dispatch(gotoHistoryPage({ page: 1 })); } }, [dispatch] ); useEffect(() => { if (requestCurrentPage) { dispatch(fetchHistory()); } else { dispatch(gotoHistoryPage({ page: 1 })); } return () => { dispatch(clearHistory()); dispatch(clearEpisodes()); dispatch(clearEpisodeFiles()); }; }, [requestCurrentPage, dispatch]); useEffect(() => { const episodeIds = selectUniqueIds(items, 'episodeId'); if (episodeIds.length) { dispatch(fetchEpisodes({ episodeIds })); } else { dispatch(clearEpisodes()); } }, [items, dispatch]); useEffect(() => { const repopulate = () => { dispatch(fetchHistory()); }; registerPagePopulator(repopulate); return () => { unregisterPagePopulator(repopulate); }; }, [dispatch]); return ( {isFetchingAny && !isAllPopulated ? : null} {!isFetchingAny && hasError ? ( {translate('HistoryLoadError')} ) : null} { // If history isPopulated and it's empty show no history found and don't // wait for the episodes to populate because they are never coming. isPopulated && !hasError && !items.length ? ( {translate('NoHistoryFound')} ) : null } {isAllPopulated && !hasError && items.length ? (
{items.map((item) => { return ( ); })}
) : null}
); } export default History;