bazarr/frontend/src/Movies/Detail/index.tsx

178 lines
5.0 KiB
TypeScript
Raw Normal View History

2021-03-25 14:22:43 +00:00
import {
faCloudUploadAlt,
faHistory,
faSearch,
faSync,
faToolbox,
faUser,
faWrench,
} from "@fortawesome/free-solid-svg-icons";
import React, { FunctionComponent, useState } from "react";
import { Alert, Container, Row } from "react-bootstrap";
2021-03-25 14:22:43 +00:00
import { Helmet } from "react-helmet";
import { Redirect, RouteComponentProps, withRouter } from "react-router-dom";
2021-08-22 04:30:03 +00:00
import { useIsAnyTaskRunningWithId } from "../../@modules/task/hooks";
import { useMovieBy, useProfileBy } from "../../@redux/hooks";
2021-03-25 14:22:43 +00:00
import { MoviesApi, ProvidersApi } from "../../apis";
import {
ContentHeader,
ItemEditorModal,
LoadingIndicator,
MovieHistoryModal,
MovieUploadModal,
SubtitleToolModal,
useShowModal,
} from "../../components";
import { ManualSearchModal } from "../../components/modals/ManualSearchModal";
import ItemOverview from "../../generic/ItemOverview";
2021-04-23 16:18:09 +00:00
import { RouterEmptyPath } from "../../special-pages/404";
import { useOnLoadedOnce } from "../../utilites";
2021-03-25 14:22:43 +00:00
import Table from "./table";
const download = (item: any, result: SearchResultType) => {
item = item as Item.Movie;
const { language, hearing_impaired, forced, provider, subtitle } = result;
return ProvidersApi.downloadMovieSubtitle(item.radarrId, {
language,
hi: hearing_impaired,
forced,
provider,
subtitle,
});
};
interface Params {
id: string;
}
interface Props extends RouteComponentProps<Params> {}
const MovieDetailView: FunctionComponent<Props> = ({ match }) => {
const id = Number.parseInt(match.params.id);
const movie = useMovieBy(id);
const item = movie.content;
2021-03-25 14:22:43 +00:00
const profile = useProfileBy(movie.content?.profileId);
2021-03-25 14:22:43 +00:00
const showModal = useShowModal();
const [valid, setValid] = useState(true);
2021-08-22 05:20:08 +00:00
const hasTask = useIsAnyTaskRunningWithId([id]);
2021-08-21 17:08:39 +00:00
useOnLoadedOnce(() => {
if (movie.content === null) {
2021-03-25 14:22:43 +00:00
setValid(false);
}
}, movie);
2021-03-25 14:22:43 +00:00
if (isNaN(id) || !valid) {
return <Redirect to={RouterEmptyPath}></Redirect>;
}
if (!item) {
return <LoadingIndicator></LoadingIndicator>;
}
const allowEdit = item.profileId !== undefined;
return (
<Container fluid>
<Helmet>
<title>{item.title} - Bazarr (Movies)</title>
</Helmet>
<ContentHeader>
<ContentHeader.Group pos="start">
<ContentHeader.AsyncButton
icon={faSync}
2021-08-21 17:08:39 +00:00
disabled={hasTask}
2021-03-25 14:22:43 +00:00
promise={() =>
MoviesApi.action({ action: "scan-disk", radarrid: item.radarrId })
}
>
Scan Disk
</ContentHeader.AsyncButton>
<ContentHeader.AsyncButton
icon={faSearch}
2021-08-21 17:08:39 +00:00
disabled={item.profileId === null || hasTask}
2021-03-25 14:22:43 +00:00
promise={() =>
MoviesApi.action({
action: "search-missing",
radarrid: item.radarrId,
})
}
>
Search
</ContentHeader.AsyncButton>
<ContentHeader.Button
icon={faUser}
2021-08-21 17:08:39 +00:00
disabled={item.profileId === null || hasTask}
2021-03-25 14:22:43 +00:00
onClick={() => showModal<Item.Movie>("manual-search", item)}
>
Manual
</ContentHeader.Button>
<ContentHeader.Button
icon={faHistory}
onClick={() => showModal("history", item)}
>
History
</ContentHeader.Button>
<ContentHeader.Button
icon={faToolbox}
2021-08-21 17:08:39 +00:00
disabled={hasTask}
2021-03-25 14:22:43 +00:00
onClick={() => showModal("tools", [item])}
>
Tools
</ContentHeader.Button>
</ContentHeader.Group>
<ContentHeader.Group pos="end">
<ContentHeader.Button
2021-08-21 17:08:39 +00:00
disabled={!allowEdit || item.profileId === null || hasTask}
2021-03-25 14:22:43 +00:00
icon={faCloudUploadAlt}
onClick={() => showModal("upload", item)}
>
Upload
</ContentHeader.Button>
<ContentHeader.Button
icon={faWrench}
2021-08-21 17:08:39 +00:00
disabled={hasTask}
2021-03-25 14:22:43 +00:00
onClick={() => showModal("edit", item)}
>
Edit Movie
</ContentHeader.Button>
</ContentHeader.Group>
</ContentHeader>
<Row>
<Alert
className="w-100 m-0 py-2"
show={hasTask}
style={{ borderRadius: 0 }}
variant="light"
>
A background task is running for this movie, actions are unavailable
</Alert>
</Row>
2021-03-25 14:22:43 +00:00
<Row>
<ItemOverview item={item} details={[]}></ItemOverview>
</Row>
<Row>
<Table movie={item} profile={profile}></Table>
2021-03-25 14:22:43 +00:00
</Row>
<ItemEditorModal
modalKey="edit"
submit={(form) => MoviesApi.modify(form)}
></ItemEditorModal>
<SubtitleToolModal modalKey="tools" size="lg"></SubtitleToolModal>
2021-03-25 14:22:43 +00:00
<MovieHistoryModal modalKey="history" size="lg"></MovieHistoryModal>
<MovieUploadModal modalKey="upload" size="lg"></MovieUploadModal>
<ManualSearchModal
modalKey="manual-search"
onSelect={download}
></ManualSearchModal>
</Container>
);
};
export default withRouter(MovieDetailView);