Add import and export functionality for sync configuration

This commit is contained in:
wangyijing
2024-07-01 01:35:49 +08:00
parent c359b30763
commit b2e88e993b
6 changed files with 168 additions and 17 deletions

View File

@@ -23,6 +23,14 @@
}
}
.import-config-modal {
.import-config-content {
width: 100%;
max-width: 100%;
margin-bottom: 10px;
}
}
.user-prompt-modal {
min-height: 40vh;

View File

@@ -1,6 +1,7 @@
import { useState, useEffect, useMemo } from "react";
import styles from "./settings.module.scss";
import uiStyle from "./ui-lib.module.scss";
import ResetIcon from "../icons/reload.svg";
import AddIcon from "../icons/add.svg";
@@ -72,6 +73,7 @@ import { useSyncStore } from "../store/sync";
import { nanoid } from "nanoid";
import { useMaskStore } from "../store/mask";
import { ProviderType } from "../utils/cloud";
import CancelIcon from "../icons/cancel.svg";
function EditPromptModal(props: { id: string; onClose: () => void }) {
const promptStore = usePromptStore();
@@ -467,6 +469,61 @@ function SyncConfigModal(props: { onClose?: () => void }) {
);
}
function ImportConfigModal(props: { onClose?: () => void }) {
const [importString, setImportString] = useState("");
const syncStore = useSyncStore();
return (
<div className="modal-mask">
<Modal
title={Locale.Settings.Sync.Config.ImportModal.Title}
onClose={() => props.onClose?.()}
actions={[
<IconButton
key="cancel"
onClick={() => {
props.onClose();
}}
icon={<CancelIcon />}
bordered
shadow
text={Locale.UI.Cancel}
/>,
<IconButton
key="confirm"
onClick={async () => {
try {
await syncStore.importSyncConfig(importString);
showToast(Locale.Settings.Sync.ImportSuccess);
props.onClose?.();
} catch (e) {
showToast(Locale.Settings.Sync.ImportFail);
console.log("[Sync] Failed to import sync config", e);
}
}}
icon={<ConfirmIcon />}
bordered
text={Locale.UI.Confirm}
/>,
]}
>
<div className={styles["import-config-modal"]}>
<textarea
className={uiStyle["modal-input"]}
autoFocus
placeholder={Locale.Settings.Sync.Config.ImportModal.Placeholder}
value={importString}
rows={props.rows ?? 3}
onInput={(e) => {
setImportString(e.currentTarget.value);
}}
/>
</div>
</Modal>
</div>
);
}
function SyncItems() {
const syncStore = useSyncStore();
const chatStore = useChatStore();
@@ -477,6 +534,7 @@ function SyncItems() {
}, [syncStore]);
const [showSyncConfigModal, setShowSyncConfigModal] = useState(false);
const [showImportModal, setShowImportModal] = useState(false);
const stateOverview = useMemo(() => {
const sessions = chatStore.sessions;
@@ -512,19 +570,35 @@ function SyncItems() {
}}
/>
{couldSync && (
<IconButton
icon={<ResetIcon />}
text={Locale.UI.Sync}
onClick={async () => {
try {
await syncStore.sync();
showToast(Locale.Settings.Sync.Success);
} catch (e) {
showToast(Locale.Settings.Sync.Fail);
console.error("[Sync]", e);
}
}}
/>
<>
<IconButton
icon={<ResetIcon />}
text={Locale.UI.Sync}
onClick={async () => {
try {
await syncStore.sync();
showToast(Locale.Settings.Sync.Success);
} catch (e) {
showToast(Locale.Settings.Sync.Fail);
console.error("[Sync]", e);
}
}}
/>
<IconButton
icon={<UploadIcon />}
text={Locale.UI.Export}
onClick={() => {
syncStore.exportSyncConfig();
}}
/>
<IconButton
icon={<DownloadIcon />}
text={Locale.UI.Import}
onClick={() => {
setShowImportModal(true);
}}
/>
</>
)}
</div>
</ListItem>
@@ -555,6 +629,10 @@ function SyncItems() {
{showSyncConfigModal && (
<SyncConfigModal onClose={() => setShowSyncConfigModal(false)} />
)}
{showImportModal && (
<ImportConfigModal onClose={() => setShowImportModal(false)} />
)}
</>
);
}