199 lines
6.3 KiB
TypeScript
199 lines
6.3 KiB
TypeScript
import { Modal } from "@/app/components/ui-lib";
|
|
import { useSyncStore } from "@/app/store/sync";
|
|
import Locale from "@/app/locales";
|
|
import { IconButton } from "@/app/components/button";
|
|
import { ProviderType } from "@/app/utils/cloud";
|
|
import { STORAGE_KEY } from "@/app/constant";
|
|
import { useMemo, useState } from "react";
|
|
|
|
import ConnectionIcon from "@/app/icons/connection.svg";
|
|
import CloudSuccessIcon from "@/app/icons/cloud-success.svg";
|
|
import CloudFailIcon from "@/app/icons/cloud-fail.svg";
|
|
import ConfirmIcon from "@/app/icons/confirm.svg";
|
|
import LoadingIcon from "@/app/icons/three-dots.svg";
|
|
import List, { ListItem } from "@/app/components/List";
|
|
import Switch from "@/app/components/Switch";
|
|
import Select from "@/app/components/Select";
|
|
import Input from "@/app/components/Input";
|
|
import { useAppConfig } from "@/app/store";
|
|
|
|
function CheckButton() {
|
|
const syncStore = useSyncStore();
|
|
|
|
const couldCheck = useMemo(() => {
|
|
return syncStore.cloudSync();
|
|
}, [syncStore]);
|
|
|
|
const [checkState, setCheckState] = useState<
|
|
"none" | "checking" | "success" | "failed"
|
|
>("none");
|
|
|
|
async function check() {
|
|
setCheckState("checking");
|
|
const valid = await syncStore.check();
|
|
setCheckState(valid ? "success" : "failed");
|
|
}
|
|
|
|
if (!couldCheck) return null;
|
|
|
|
return (
|
|
<IconButton
|
|
text={Locale.Settings.Sync.Config.Modal.Check}
|
|
bordered
|
|
onClick={check}
|
|
icon={
|
|
checkState === "none" ? (
|
|
<ConnectionIcon />
|
|
) : checkState === "checking" ? (
|
|
<LoadingIcon />
|
|
) : checkState === "success" ? (
|
|
<CloudSuccessIcon />
|
|
) : checkState === "failed" ? (
|
|
<CloudFailIcon />
|
|
) : (
|
|
<ConnectionIcon />
|
|
)
|
|
}
|
|
></IconButton>
|
|
);
|
|
}
|
|
|
|
export default function SyncConfigModal(props: { onClose?: () => void }) {
|
|
const syncStore = useSyncStore();
|
|
const config = useAppConfig();
|
|
const { isMobileScreen } = config;
|
|
return (
|
|
<div className="modal-mask">
|
|
<Modal
|
|
title={Locale.Settings.Sync.Config.Modal.Title}
|
|
onClose={() => props.onClose?.()}
|
|
actions={[
|
|
<CheckButton key="check" />,
|
|
<IconButton
|
|
key="confirm"
|
|
onClick={props.onClose}
|
|
icon={<ConfirmIcon />}
|
|
bordered
|
|
text={Locale.UI.Confirm}
|
|
/>,
|
|
]}
|
|
>
|
|
<List
|
|
widgetStyle={{
|
|
rangeNextLine: isMobileScreen,
|
|
}}
|
|
>
|
|
<ListItem
|
|
title={Locale.Settings.Sync.Config.SyncType.Title}
|
|
subTitle={Locale.Settings.Sync.Config.SyncType.SubTitle}
|
|
>
|
|
<Select
|
|
value={syncStore.provider}
|
|
options={Object.entries(ProviderType).map(([k, v]) => ({
|
|
value: v,
|
|
label: k,
|
|
}))}
|
|
onSelect={(v) => {
|
|
syncStore.update((config) => (config.provider = v));
|
|
}}
|
|
/>
|
|
</ListItem>
|
|
|
|
<ListItem
|
|
title={Locale.Settings.Sync.Config.Proxy.Title}
|
|
subTitle={Locale.Settings.Sync.Config.Proxy.SubTitle}
|
|
>
|
|
<Switch
|
|
value={syncStore.useProxy}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.useProxy = e));
|
|
}}
|
|
/>
|
|
</ListItem>
|
|
{syncStore.useProxy ? (
|
|
<ListItem
|
|
title={Locale.Settings.Sync.Config.ProxyUrl.Title}
|
|
subTitle={Locale.Settings.Sync.Config.ProxyUrl.SubTitle}
|
|
>
|
|
<Input
|
|
type="text"
|
|
value={syncStore.proxyUrl}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.proxyUrl = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
) : null}
|
|
|
|
{syncStore.provider === ProviderType.WebDAV && (
|
|
<>
|
|
<ListItem title={Locale.Settings.Sync.Config.WebDav.Endpoint}>
|
|
<Input
|
|
type="text"
|
|
value={syncStore.webdav.endpoint}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.webdav.endpoint = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
|
|
<ListItem title={Locale.Settings.Sync.Config.WebDav.UserName}>
|
|
<Input
|
|
type="text"
|
|
value={syncStore.webdav.username}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.webdav.username = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
<ListItem title={Locale.Settings.Sync.Config.WebDav.Password}>
|
|
<Input
|
|
value={syncStore.webdav.password}
|
|
type="password"
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.webdav.password = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
</>
|
|
)}
|
|
|
|
{syncStore.provider === ProviderType.UpStash && (
|
|
<>
|
|
<ListItem title={Locale.Settings.Sync.Config.UpStash.Endpoint}>
|
|
<Input
|
|
type="text"
|
|
value={syncStore.upstash.endpoint}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.upstash.endpoint = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
|
|
<ListItem title={Locale.Settings.Sync.Config.UpStash.UserName}>
|
|
<Input
|
|
type="text"
|
|
value={syncStore.upstash.username}
|
|
placeholder={STORAGE_KEY}
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.upstash.username = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
<ListItem title={Locale.Settings.Sync.Config.UpStash.Password}>
|
|
<Input
|
|
value={syncStore.upstash.apiKey}
|
|
type="password"
|
|
onChange={(e) => {
|
|
syncStore.update((config) => (config.upstash.apiKey = e));
|
|
}}
|
|
></Input>
|
|
</ListItem>
|
|
</>
|
|
)}
|
|
</List>
|
|
</Modal>
|
|
</div>
|
|
);
|
|
}
|