Files
suwayomi-material-you-webui/src/screens/settings/Backup.tsx

89 lines
3.3 KiB
TypeScript
Raw Normal View History

2021-04-10 00:44:13 +04:30
/*
* 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/.
*/
2021-04-10 00:44:13 +04:30
import React, { useContext, useEffect } from 'react';
2021-09-09 17:51:22 +04:30
import List from '@mui/material/List';
import ListItem from '@mui/material/ListItem';
import ListItemText from '@mui/material/ListItemText';
2021-04-10 00:44:13 +04:30
import { fromEvent } from 'file-selector';
2021-10-30 16:10:34 +03:30
import makeToast from 'components/util/Toast';
import ListItemLink from 'components/util/ListItemLink';
import NavbarContext from 'components/context/NavbarContext';
import { useTranslation } from 'react-i18next';
import requestManager from 'lib/RequestManager';
2021-04-10 00:44:13 +04:30
export default function Backup() {
const { t } = useTranslation();
2021-04-10 00:44:13 +04:30
const { setTitle, setAction } = useContext(NavbarContext);
useEffect(() => {
setTitle(t('settings.backup.title'));
setAction(null);
}, [t]);
2021-04-10 00:44:13 +04:30
const submitBackup = (file: File) => {
2021-08-19 20:42:28 +04:30
if (file.name.toLowerCase().endsWith('proto.gz')) {
makeToast(t('settings.backup.label.restoring_backup'), 'info');
requestManager
.restoreBackupFile(file)
.response.then(() => makeToast(t('settings.backup.label.restored_backup'), 'success'))
.catch(() => makeToast(t('settings.backup.label.backup_restore_failed'), 'error'));
2021-08-19 20:42:28 +04:30
} else if (file.name.toLowerCase().endsWith('json')) {
makeToast(t('settings.backup.label.legacy_backup_unsupported'), 'error');
2021-08-19 20:42:28 +04:30
} else {
makeToast(t('global.error.label.invalid_file_type'), 'error');
2021-08-19 20:42:28 +04:30
}
2021-04-10 00:44:13 +04:30
};
const dropHandler = async (e: Event) => {
e.preventDefault();
const files = await fromEvent(e);
submitBackup(files[0] as File);
};
const dragOverHandler = (e: Event) => {
e.preventDefault();
};
useEffect(() => {
document.addEventListener('drop', dropHandler);
document.addEventListener('dragover', dragOverHandler);
const input = document.getElementById('backup-file');
input?.addEventListener('change', async (evt) => {
const files = await fromEvent(evt);
submitBackup(files[0] as File);
});
return () => {
document.removeEventListener('drop', dropHandler);
document.removeEventListener('dragover', dragOverHandler);
};
}, []);
return (
2021-08-19 20:42:28 +04:30
<>
2021-11-15 18:55:50 +03:30
<List sx={{ padding: 0 }}>
<ListItemLink to={requestManager.getExportBackupUrl()} directLink>
<ListItemText
primary={t('settings.backup.label.create_backup')}
secondary={t('settings.backup.label.create_backup_info')}
/>
2021-08-19 20:42:28 +04:30
</ListItemLink>
<ListItem button onClick={() => document.getElementById('backup-file')?.click()}>
<ListItemText
primary={t('settings.backup.label.restore_backup')}
secondary={t('settings.backup.label.restore_backup_info')}
2021-08-19 20:42:28 +04:30
/>
</ListItem>
</List>
<input type="file" id="backup-file" style={{ display: 'none' }} />
2021-08-19 20:42:28 +04:30
</>
2021-04-10 00:44:13 +04:30
);
}