import { StorageSerializers } from "@vueuse/core"; import { type Setting, type SettingIds, type Settings, parseFromJson, settings, } from "~/settings"; export const useSettings = () => { return useLocalStorage("lysand:settings", settings, { serializer: { read(raw) { const json = StorageSerializers.object.read(raw); return parseFromJson(json); }, write(value) { // key/value, with key being id and value being the value const json = value.reduce( (acc, setting) => { acc[setting.id] = setting.value; return acc; }, {} as Record, ); return StorageSerializers.object.write(json); }, }, }); }; export const useSetting = (id: SettingIds) => { const settings = useSettings(); const setting: Ref = ref( settings.value.find((s) => s.id === id) as T, ) as unknown as Ref; watch(settings, (newSettings) => { setting.value = newSettings.find((s) => s.id === id) as T; }); watch(setting, (newSetting) => { settings.value = settings.value.map((s) => s.id === id ? newSetting : s, ) as Settings; }); return setting; }; export const getSetting = (id: SettingIds) => { return settings.find((s) => s.id === id) as T; };