123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- import { Updater } from "../typing";
- import { ApiPath, StoreKey } from "../constant";
- import { createPersistStore } from "../utils/store";
- import {
- AppState,
- getLocalAppState,
- GetStoreState,
- mergeAppState,
- setLocalAppState,
- } from "../utils/sync";
- import { downloadAs, readFromFile } from "../utils";
- import { showToast } from "../components/ui-lib";
- import Locale from "../locales";
- import { createSyncClient, ProviderType } from "../utils/cloud";
- import { corsPath } from "../utils/cors";
- export interface WebDavConfig {
- server: string;
- username: string;
- password: string;
- }
- export type SyncStore = GetStoreState<typeof useSyncStore>;
- export const useSyncStore = createPersistStore(
- {
- provider: ProviderType.WebDAV,
- useProxy: true,
- proxyUrl: corsPath(ApiPath.Cors),
- webdav: {
- endpoint: "",
- username: "",
- password: "",
- },
- upstash: {
- endpoint: "",
- username: "",
- apiKey: "",
- },
- lastSyncTime: 0,
- lastProvider: "",
- },
- (set, get) => ({
- coundSync() {
- const config = get()[get().provider];
- return Object.values(config).every((c) => c.toString().length > 0);
- },
- markSyncTime() {
- set({ lastSyncTime: Date.now(), lastProvider: get().provider });
- },
- export() {
- const state = getLocalAppState();
- const fileName = `Backup-${new Date().toLocaleString()}.json`;
- downloadAs(JSON.stringify(state), fileName);
- },
- async import() {
- const rawContent = await readFromFile();
- try {
- const remoteState = JSON.parse(rawContent) as AppState;
- const localState = getLocalAppState();
- mergeAppState(localState, remoteState);
- setLocalAppState(localState);
- location.reload();
- } catch (e) {
- console.error("[Import]", e);
- showToast(Locale.Settings.Sync.ImportFailed);
- }
- },
- getClient() {
- const provider = get().provider;
- const client = createSyncClient(provider, get());
- return client;
- },
- async sync() {
- const localState = getLocalAppState();
- const provider = get().provider;
- const config = get()[provider];
- const client = this.getClient();
- try {
- const remoteState = JSON.parse(
- await client.get(config.username),
- ) as AppState;
- mergeAppState(localState, remoteState);
- setLocalAppState(localState);
- } catch (e) {
- console.log("[Sync] failed to get remoate state", e);
- }
- await client.set(config.username, JSON.stringify(localState));
- this.markSyncTime();
- },
- async check() {
- const client = this.getClient();
- return await client.check();
- },
- }),
- {
- name: StoreKey.Sync,
- version: 1,
- },
- );
|