mirror of
https://github.com/movie-web/native-app.git
synced 2025-09-13 12:43:25 +00:00
refactor: use mmkv and zustand persist middleware for main storage
This commit is contained in:
86
apps/expo/src/stores/settings/index.ts
Normal file
86
apps/expo/src/stores/settings/index.ts
Normal file
@@ -0,0 +1,86 @@
|
||||
import type { StateStorage } from "zustand/middleware";
|
||||
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;
|
||||
}
|
||||
|
||||
export const usePlayerSettingsStore = create<
|
||||
PlayerStoreState,
|
||||
[["zustand/persist", PlayerStoreState]]
|
||||
>(
|
||||
persist(
|
||||
(set) => ({
|
||||
gestureControls: true,
|
||||
setGestureControls: (enabled: boolean) =>
|
||||
set({ gestureControls: 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),
|
||||
},
|
||||
),
|
||||
);
|
Reference in New Issue
Block a user