Files
suwayomi-material-you-webui/src/features/migration/components/MigrateDialog.tsx
T

142 lines
5.7 KiB
TypeScript
Raw Normal View History

2024-01-26 20:50:51 +01:00
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import Dialog from '@mui/material/Dialog';
import DialogTitle from '@mui/material/DialogTitle';
import DialogContent from '@mui/material/DialogContent';
import DialogActions from '@mui/material/DialogActions';
import Button from '@mui/material/Button';
2024-04-14 15:50:12 +02:00
import Stack from '@mui/material/Stack';
2024-01-26 20:50:51 +01:00
import { Link, useNavigate, useParams } from 'react-router-dom';
import { useState } from 'react';
import FormGroup from '@mui/material/FormGroup';
2026-01-10 19:45:02 +01:00
import { useLingui } from '@lingui/react/macro';
import { CheckboxInput } from '@/base/components/inputs/CheckboxInput.tsx';
2025-08-15 22:02:58 +02:00
import { Mangas } from '@/features/manga/services/Mangas.ts';
import { makeToast } from '@/base/utils/Toast.ts';
import {
createUpdateMetadataServerSettings,
useMetadataServerSettings,
2025-08-15 22:02:58 +02:00
} from '@/features/settings/services/ServerSettingsMetadata.ts';
2024-10-05 16:09:34 +02:00
import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts';
2026-03-11 00:11:29 +01:00
import type { MetadataMigrationSettings } from '@/features/migration/Migration.types.ts';
import type { MigrateMode } from '@/features/manga/Manga.types.ts';
import { AppRoutes } from '@/base/AppRoute.constants.ts';
2024-03-16 14:02:54 +01:00
2024-01-26 20:50:51 +01:00
export const MigrateDialog = ({ mangaIdToMigrateTo, onClose }: { mangaIdToMigrateTo: number; onClose: () => void }) => {
2026-01-10 19:45:02 +01:00
const { t } = useLingui();
2024-01-26 20:50:51 +01:00
const navigate = useNavigate();
const { mangaId: mangaIdAsString } = useParams<{ mangaId: string }>();
const mangaId = Number(mangaIdAsString);
2024-03-16 14:02:54 +01:00
const {
settings: { migrateChapters, migrateCategories, migrateTracking, deleteChapters, migrateMetadata },
2024-03-16 14:02:54 +01:00
} = useMetadataServerSettings();
2024-01-26 20:50:51 +01:00
const [isMigrationInProcess, setIsMigrationInProcess] = useState(false);
const setMigrationFlag = createUpdateMetadataServerSettings<keyof MetadataMigrationSettings>(
defaultPromiseErrorHandler('MigrateDialog::updateSetting'),
);
2024-03-16 14:02:54 +01:00
2024-01-26 20:50:51 +01:00
const migrate = async (mode: MigrateMode) => {
if (mangaId == null) {
throw new Error(`MigrateDialog::migrate: unexpected mangaId "${mangaId}"`);
}
2026-01-10 19:45:02 +01:00
makeToast(t`Migrating manga…`, 'info');
2024-01-26 20:50:51 +01:00
setIsMigrationInProcess(true);
try {
await Mangas.migrate(mangaId, mangaIdToMigrateTo, {
mode,
2024-04-20 23:26:34 +02:00
migrateChapters,
migrateCategories,
2024-04-20 23:51:47 +02:00
migrateTracking,
deleteChapters,
migrateMetadata,
2024-01-26 20:50:51 +01:00
});
2024-12-11 20:10:59 +01:00
navigate(AppRoutes.manga.path(mangaIdToMigrateTo), { replace: true });
2024-01-26 20:50:51 +01:00
} catch (e) {
setIsMigrationInProcess(false);
}
};
return (
<Dialog open fullWidth onClose={onClose}>
2026-01-10 19:45:02 +01:00
<DialogTitle>{t`Select data to include`}</DialogTitle>
2024-01-26 20:50:51 +01:00
<DialogContent dividers>
<FormGroup>
<CheckboxInput
disabled={isMigrationInProcess}
2026-01-10 19:45:02 +01:00
label={t`Chapter`}
2024-04-20 23:26:34 +02:00
checked={migrateChapters}
onChange={(_, checked) => setMigrationFlag('migrateChapters', checked)}
2024-01-26 20:50:51 +01:00
/>
<CheckboxInput
disabled={isMigrationInProcess}
2026-01-10 19:45:02 +01:00
label={t`Category`}
2024-04-20 23:26:34 +02:00
checked={migrateCategories}
onChange={(_, checked) => setMigrationFlag('migrateCategories', checked)}
2024-01-26 20:50:51 +01:00
/>
2024-04-20 23:51:47 +02:00
<CheckboxInput
disabled={isMigrationInProcess}
2026-01-10 19:45:02 +01:00
label={t`Tracking`}
2024-04-20 23:51:47 +02:00
checked={migrateTracking}
onChange={(_, checked) => setMigrationFlag('migrateTracking', checked)}
/>
<CheckboxInput
disabled={isMigrationInProcess}
label={t`Client data`}
checked={migrateMetadata}
onChange={(_, checked) => setMigrationFlag('migrateMetadata', checked)}
/>
<CheckboxInput
disabled={isMigrationInProcess}
2026-01-10 19:45:02 +01:00
label={t`Delete downloaded`}
checked={deleteChapters}
2024-03-16 14:02:54 +01:00
onChange={(_, checked) => setMigrationFlag('deleteChapters', checked)}
/>
2024-01-26 20:50:51 +01:00
</FormGroup>
</DialogContent>
<DialogActions>
2024-09-03 17:15:47 +02:00
<Stack
direction="row"
sx={{
justifyContent: 'space-between',
width: '100%',
}}
>
2024-12-11 20:10:59 +01:00
<Button
disabled={isMigrationInProcess}
component={Link}
to={AppRoutes.manga.path(mangaIdToMigrateTo)}
>
2026-01-10 19:45:02 +01:00
{t`Show entry`}
2024-01-26 20:50:51 +01:00
</Button>
<Stack direction="row">
<Button disabled={isMigrationInProcess} onClick={onClose}>
2026-01-10 19:45:02 +01:00
{t`Cancel`}
2024-01-26 20:50:51 +01:00
</Button>
<Button disabled={isMigrationInProcess} onClick={() => migrate('copy')}>
2026-01-10 19:45:02 +01:00
{t`Copy`}
2024-01-26 20:50:51 +01:00
</Button>
<Button disabled={isMigrationInProcess} onClick={() => migrate('migrate')}>
2026-01-10 19:45:02 +01:00
{t`Migrate`}
2024-01-26 20:50:51 +01:00
</Button>
</Stack>
</Stack>
</DialogActions>
</Dialog>
);
};