mirror of
https://github.com/muerwre/markdown-home-tab.git
synced 2025-04-25 00:46:41 +07:00
add sync storage
This commit is contained in:
parent
b0665bfb2a
commit
6d00bffbec
14 changed files with 164 additions and 82 deletions
|
@ -1,33 +1,37 @@
|
|||
import { useCallback, useState } from "react";
|
||||
import { useCallback, useEffect, useState } from "react";
|
||||
import { SettingsValue } from "~/modules/settings/context/SettingsContext";
|
||||
import { useDefaultTheme } from "~/modules/theme/hooks/useDefaultTheme";
|
||||
import { BrowserSyncStorage } from "~/utils";
|
||||
import { defaultSettings } from "../context/SettingsContext";
|
||||
|
||||
const getLocalStorageSettings = (defaultValue: SettingsValue) => {
|
||||
try {
|
||||
const raw = localStorage.getItem("settings");
|
||||
const parsed = JSON.parse(raw ?? "");
|
||||
|
||||
return parsed ? { ...defaultValue, ...parsed } : defaultValue;
|
||||
} catch (error) {
|
||||
return defaultValue;
|
||||
}
|
||||
};
|
||||
const storage = new BrowserSyncStorage('settings');
|
||||
|
||||
export const usePersistSettings = () => {
|
||||
const [hydrated, setHydrated] = useState(false);
|
||||
|
||||
const defaultColors = useDefaultTheme();
|
||||
|
||||
const [settings, setSettings] = useState<SettingsValue>(
|
||||
getLocalStorageSettings({ ...defaultSettings, ...defaultColors })
|
||||
);
|
||||
const [settings, setSettings] = useState({
|
||||
...defaultSettings, ...defaultColors
|
||||
});
|
||||
|
||||
const update = useCallback((val: Partial<SettingsValue>) => {
|
||||
if (!hydrated) {
|
||||
return;
|
||||
}
|
||||
|
||||
setSettings((v) => {
|
||||
const updatedValue = { ...v, ...val };
|
||||
localStorage.setItem("settings", JSON.stringify(updatedValue));
|
||||
storage.set("", updatedValue);
|
||||
return updatedValue;
|
||||
});
|
||||
}, []);
|
||||
}, [hydrated]);
|
||||
|
||||
return { settings, update };
|
||||
useEffect(() => {
|
||||
storage.get<SettingsValue>("").then(next => {
|
||||
setSettings(prev => ({ ...prev, ...next }));
|
||||
}).finally(() => setHydrated(true));
|
||||
}, [])
|
||||
|
||||
return { settings, update, hydrated };
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue