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
|
2023-05-18 13:17:41 +02:00
|
|
|
* 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';
|
2022-11-02 21:48:22 +01:00
|
|
|
import client from 'util/client';
|
2021-10-30 16:10:34 +03:30
|
|
|
import makeToast from 'components/util/Toast';
|
2023-02-05 16:15:20 +01:00
|
|
|
import ListItemLink from 'components/util/ListItemLink';
|
|
|
|
|
import NavbarContext from 'components/context/NavbarContext';
|
2023-03-23 13:59:32 +01:00
|
|
|
import { useTranslation } from 'react-i18next';
|
2021-04-10 00:44:13 +04:30
|
|
|
|
|
|
|
|
export default function Backup() {
|
2023-03-23 13:59:32 +01:00
|
|
|
const { t } = useTranslation();
|
2021-04-10 00:44:13 +04:30
|
|
|
const { setTitle, setAction } = useContext(NavbarContext);
|
2023-02-06 10:06:33 +01:00
|
|
|
useEffect(() => {
|
2023-03-23 13:59:32 +01:00
|
|
|
setTitle(t('settings.backup.title'));
|
2023-03-11 18:05:58 +01:00
|
|
|
setAction(null);
|
2023-03-28 23:14:03 +02:00
|
|
|
}, [t]);
|
2021-04-10 00:44:13 +04:30
|
|
|
|
|
|
|
|
const { baseURL } = client.defaults;
|
|
|
|
|
|
|
|
|
|
const submitBackup = (file: File) => {
|
2021-08-19 20:42:28 +04:30
|
|
|
if (file.name.toLowerCase().endsWith('proto.gz')) {
|
|
|
|
|
const formData = new FormData();
|
|
|
|
|
formData.append('backup.proto.gz', file);
|
|
|
|
|
|
2023-03-23 13:59:32 +01:00
|
|
|
makeToast(t('settings.backup.label.restoring_backup'), 'info');
|
2023-02-06 10:06:33 +01:00
|
|
|
client
|
|
|
|
|
.post('/api/v1/backup/import/file', formData, {
|
|
|
|
|
headers: { 'Content-Type': 'multipart/form-data' },
|
|
|
|
|
})
|
2023-03-23 13:59:32 +01:00
|
|
|
.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')) {
|
2023-03-23 13:59:32 +01:00
|
|
|
makeToast(t('settings.backup.label.legacy_backup_unsupported'), 'error');
|
2021-08-19 20:42:28 +04:30
|
|
|
} else {
|
2023-03-23 13:59:32 +01:00
|
|
|
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 }}>
|
2022-02-21 01:24:42 +03:30
|
|
|
<ListItemLink to={`${baseURL}/api/v1/backup/export/file`} directLink>
|
2023-03-23 13:59:32 +01:00
|
|
|
<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
|
2023-03-23 13:59:32 +01:00
|
|
|
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>
|
2023-02-06 10:06:33 +01:00
|
|
|
<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
|
|
|
);
|
|
|
|
|
}
|