import { faBookmark as farBookmark } from "@fortawesome/free-regular-svg-icons"; import { faBookmark, faBriefcase, faHistory, faUser, } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { useShowOnlyDesired } from "@redux/hooks"; import { useDownloadEpisodeSubtitles } from "apis/hooks"; import { ActionButton, EpisodeHistoryModal, GroupTable, SubtitleToolModal, TextPopover, useShowModal, } from "components"; import { ManualSearchModal } from "components/modals/ManualSearchModal"; import React, { FunctionComponent, useCallback, useMemo } from "react"; import { Badge, ButtonGroup } from "react-bootstrap"; import { Column, TableUpdater } from "react-table"; import { BuildKey, filterSubtitleBy } from "utilities"; import { useProfileItemsToLanguages } from "utilities/languages"; import { SubtitleAction } from "./components"; interface Props { series?: Item.Series; episodes: Item.Episode[]; disabled?: boolean; profile?: Language.Profile; } const Table: FunctionComponent = ({ series, episodes, profile, disabled, }) => { const showModal = useShowModal(); const onlyDesired = useShowOnlyDesired(); const profileItems = useProfileItemsToLanguages(profile); const { mutateAsync } = useDownloadEpisodeSubtitles(); const download = useCallback( (item: Item.Episode, result: SearchResultType) => { const { language, hearing_impaired: hi, forced, provider, subtitle, original_format, } = result; const { sonarrSeriesId: seriesId, sonarrEpisodeId: episodeId } = item; return mutateAsync({ seriesId, episodeId, form: { language, hi, forced, provider, subtitle, original_format: original_format, }, }); }, [mutateAsync] ); const columns: Column[] = useMemo[]>( () => [ { accessor: "monitored", Cell: (row) => { return ( ); }, }, { accessor: "season", Cell: (row) => { return `Season ${row.value}`; }, }, { Header: "Episode", accessor: "episode", }, { Header: "Title", accessor: "title", className: "text-nowrap", Cell: ({ value, row }) => ( {value} ), }, { Header: "Audio", accessor: "audio_language", Cell: (row) => { return row.value.map((v) => ( {v.name} )); }, }, { Header: "Subtitles", accessor: "missing_subtitles", Cell: ({ row }) => { const episode = row.original; const seriesid = episode.sonarrSeriesId; const elements = useMemo(() => { const episodeid = episode.sonarrEpisodeId; const missing = episode.missing_subtitles.map((val, idx) => ( )); let raw_subtitles = episode.subtitles; if (onlyDesired) { raw_subtitles = filterSubtitleBy(raw_subtitles, profileItems); } const subtitles = raw_subtitles.map((val, idx) => ( )); return [...missing, ...subtitles]; }, [episode, seriesid]); return elements; }, }, { Header: "Actions", accessor: "sonarrEpisodeId", Cell: ({ row, update }) => { return ( { update && update(row, "manual-search"); }} > { update && update(row, "history"); }} > { update && update(row, "tools"); }} > ); }, }, ], [onlyDesired, profileItems, series, disabled] ); const updateRow = useCallback>( (row, modalKey: string) => { if (modalKey === "tools") { showModal(modalKey, [row.original]); } else { showModal(modalKey, row.original); } }, [showModal] ); const maxSeason = useMemo( () => episodes.reduce((prev, curr) => Math.max(prev, curr.season), 0), [episodes] ); return ( ); }; export default Table;