Move download subtitle action to background

pull/1515/head
LASER-Yi 3 years ago
parent 42f5be9ae3
commit 4795ac4c77

@ -31,8 +31,7 @@ import { RouterEmptyPath } from "../../special-pages/404";
import { useOnLoadedOnce } from "../../utilites"; import { useOnLoadedOnce } from "../../utilites";
import Table from "./table"; import Table from "./table";
const download = (item: any, result: SearchResultType) => { const download = (item: Item.Movie, result: SearchResultType) => {
item = item as Item.Movie;
const { language, hearing_impaired, forced, provider, subtitle } = result; const { language, hearing_impaired, forced, provider, subtitle } = result;
return ProvidersApi.downloadMovieSubtitle(item.radarrId, { return ProvidersApi.downloadMovieSubtitle(item.radarrId, {
language, language,
@ -182,7 +181,7 @@ const MovieDetailView: FunctionComponent<Props> = ({ match }) => {
<MovieUploadModal modalKey="upload" size="lg"></MovieUploadModal> <MovieUploadModal modalKey="upload" size="lg"></MovieUploadModal>
<ManualSearchModal <ManualSearchModal
modalKey="manual-search" modalKey="manual-search"
onSelect={download} download={download}
></ManualSearchModal> ></ManualSearchModal>
</Container> </Container>
); );

@ -32,8 +32,7 @@ interface Props {
profile?: Language.Profile; profile?: Language.Profile;
} }
const download = (item: any, result: SearchResultType) => { const download = (item: Item.Episode, result: SearchResultType) => {
item = item as Item.Episode;
const { language, hearing_impaired, forced, provider, subtitle } = result; const { language, hearing_impaired, forced, provider, subtitle } = result;
return ProvidersApi.downloadEpisodeSubtitle( return ProvidersApi.downloadEpisodeSubtitle(
item.sonarrSeriesId, item.sonarrSeriesId,
@ -226,7 +225,7 @@ const Table: FunctionComponent<Props> = ({
<EpisodeHistoryModal modalKey="history" size="lg"></EpisodeHistoryModal> <EpisodeHistoryModal modalKey="history" size="lg"></EpisodeHistoryModal>
<ManualSearchModal <ManualSearchModal
modalKey="manual-search" modalKey="manual-search"
onSelect={download} download={download}
></ManualSearchModal> ></ManualSearchModal>
</React.Fragment> </React.Fragment>
); );

@ -25,7 +25,6 @@ import {
} from "react-bootstrap"; } from "react-bootstrap";
import { Column } from "react-table"; import { Column } from "react-table";
import { import {
AsyncButton,
BaseModal, BaseModal,
BaseModalProps, BaseModalProps,
LanguageText, LanguageText,
@ -33,8 +32,10 @@ import {
PageTable, PageTable,
useModalPayload, useModalPayload,
} from ".."; } from "..";
import { dispatchTask } from "../../@modules/task";
import { createTask } from "../../@modules/task/utilites";
import { ProvidersApi } from "../../apis"; import { ProvidersApi } from "../../apis";
import { isMovie } from "../../utilites"; import { GetItemId, isMovie } from "../../utilites";
import "./msmStyle.scss"; import "./msmStyle.scss";
type SupportType = Item.Movie | Item.Episode; type SupportType = Item.Movie | Item.Episode;
@ -45,20 +46,19 @@ enum SearchState {
Finished, Finished,
} }
interface Props { interface Props<T extends SupportType> {
onSelect: (item: SupportType, result: SearchResultType) => Promise<void>; download: (item: T, result: SearchResultType) => Promise<void>;
onDownload?: () => void;
} }
export const ManualSearchModal: FunctionComponent<Props & BaseModalProps> = ( export function ManualSearchModal<T extends SupportType>(
props props: Props<T> & BaseModalProps
) => { ) {
const { onSelect, onDownload, ...modal } = props; const { download, ...modal } = props;
const [result, setResult] = useState<SearchResultType[]>([]); const [result, setResult] = useState<SearchResultType[]>([]);
const [searchState, setSearchState] = useState(SearchState.Ready); const [searchState, setSearchState] = useState(SearchState.Ready);
const item = useModalPayload<SupportType>(modal.modalKey); const item = useModalPayload<T>(modal.modalKey);
const search = useCallback(async () => { const search = useCallback(async () => {
if (item) { if (item) {
@ -186,23 +186,32 @@ export const ManualSearchModal: FunctionComponent<Props & BaseModalProps> = (
}, },
{ {
accessor: "subtitle", accessor: "subtitle",
Cell: ({ row, externalUpdate }) => { Cell: ({ row }) => {
const result = row.original; const result = row.original;
return ( return (
<AsyncButton <Button
size="sm" size="sm"
variant="light" variant="light"
noReset disabled={item === null}
promise={() => onSelect(item!, result)} onClick={() => {
onSuccess={() => externalUpdate && externalUpdate(row)} if (!item) return;
const id = GetItemId(item);
const task = createTask(item.title, id, download, item, result);
dispatchTask(
"Downloading subtitles...",
[task],
"Downloading..."
);
}}
> >
<FontAwesomeIcon icon={faDownload}></FontAwesomeIcon> <FontAwesomeIcon icon={faDownload}></FontAwesomeIcon>
</AsyncButton> </Button>
); );
}, },
}, },
], ],
[onSelect, item] [download, item]
); );
const content = useMemo<JSX.Element>(() => { const content = useMemo<JSX.Element>(() => {
@ -225,12 +234,11 @@ export const ManualSearchModal: FunctionComponent<Props & BaseModalProps> = (
emptyText="No Result" emptyText="No Result"
columns={columns} columns={columns}
data={result} data={result}
externalUpdate={onDownload}
></PageTable> ></PageTable>
</React.Fragment> </React.Fragment>
); );
} }
}, [searchState, columns, result, search, item?.path, onDownload]); }, [searchState, columns, result, search, item?.path]);
const footer = useMemo( const footer = useMemo(
() => ( () => (
@ -271,7 +279,7 @@ export const ManualSearchModal: FunctionComponent<Props & BaseModalProps> = (
{content} {content}
</BaseModal> </BaseModal>
); );
}; }
const StateIcon: FunctionComponent<{ matches: string[]; dont: string[] }> = ({ const StateIcon: FunctionComponent<{ matches: string[]; dont: string[] }> = ({
matches, matches,

@ -40,7 +40,7 @@ export function submodProcessColor(s: string) {
return `color(name=${s})`; return `color(name=${s})`;
} }
export function GetItemId(item: any): number { export function GetItemId<T extends object>(item: T): number {
if (isMovie(item)) { if (isMovie(item)) {
return item.radarrId; return item.radarrId;
} else if (isEpisode(item)) { } else if (isEpisode(item)) {

Loading…
Cancel
Save