Files
native-app/apps/expo/src/stores/settings/index.ts
2024-03-25 18:57:56 +01:00

96 lines
2.3 KiB
TypeScript

import type { StateStorage } from "zustand/middleware";
import { Platform } from "react-native";
import { MMKV } from "react-native-mmkv";
import { create } from "zustand";
import { createJSONStorage, persist } from "zustand/middleware";
import type { DownloadItem } from "~/hooks/DownloadManagerContext";
import type { ThemeStoreOption } from "~/stores/theme";
const storage = new MMKV();
const zustandStorage: StateStorage = {
getItem: (name: string): string | null => {
const value = storage.getString(name);
return value ?? null;
},
setItem: (name: string, value: string): void => {
storage.set(name, value);
},
removeItem: (name: string): void => {
storage.delete(name);
},
};
interface ThemeStoreState {
theme: ThemeStoreOption;
setTheme: (theme: ThemeStoreOption) => void;
}
export const useThemeSettingsStore = create<
ThemeStoreState,
[["zustand/persist", ThemeStoreState]]
>(
persist(
(set) => ({
theme: "main",
setTheme: (theme: ThemeStoreOption) => set({ theme }),
}),
{
name: "theme-settings",
storage: createJSONStorage(() => zustandStorage),
},
),
);
interface PlayerStoreState {
gestureControls: boolean;
setGestureControls: (enabled: boolean) => void;
autoPlay: boolean;
setAutoPlay: (enabled: boolean) => void;
}
export const usePlayerSettingsStore = create<
PlayerStoreState,
[["zustand/persist", PlayerStoreState]]
>(
persist(
(set) => ({
gestureControls: Platform.select({
ios: true,
android: false,
default: true,
}),
setGestureControls: (enabled: boolean) =>
set({ gestureControls: enabled }),
autoPlay: true,
setAutoPlay: (enabled: boolean) => set({ autoPlay: enabled }),
}),
{
name: "player-settings",
storage: createJSONStorage(() => zustandStorage),
},
),
);
interface DownloadHistoryStoreState {
downloads: DownloadItem[];
setDownloads: (downloads: DownloadItem[]) => void;
}
export const useDownloadHistoryStore = create<
DownloadHistoryStoreState,
[["zustand/persist", DownloadHistoryStoreState]]
>(
persist(
(set) => ({
downloads: [],
setDownloads: (downloads: DownloadItem[]) => set({ downloads }),
}),
{
name: "download-history",
storage: createJSONStorage(() => zustandStorage),
},
),
);