feishin/src/renderer/store/app.store.ts

119 lines
3 KiB
TypeScript
Raw Normal View History

2022-12-19 15:59:14 -08:00
import merge from 'lodash/merge';
2023-05-20 20:00:09 -07:00
import { create } from 'zustand';
2022-12-19 15:59:14 -08:00
import { devtools, persist } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
2022-12-21 01:25:56 -08:00
import { Platform } from '/@/renderer/types';
2022-12-19 15:59:14 -08:00
type SidebarProps = {
collapsed: boolean;
2022-12-19 15:59:14 -08:00
expanded: string[];
image: boolean;
leftWidth: string;
rightExpanded: boolean;
rightWidth: string;
};
type TitlebarProps = {
backgroundColor: string;
outOfView: boolean;
};
2023-05-18 02:09:07 -07:00
type CommandPaletteProps = {
close: () => void;
open: () => void;
opened: boolean;
toggle: () => void;
};
2022-12-19 15:59:14 -08:00
export interface AppState {
2023-05-18 02:09:07 -07:00
commandPalette: CommandPaletteProps;
2022-12-19 15:59:14 -08:00
isReorderingQueue: boolean;
platform: Platform;
sidebar: SidebarProps;
2022-12-19 15:59:14 -08:00
titlebar: TitlebarProps;
}
export interface AppSlice extends AppState {
actions: {
setAppStore: (data: Partial<AppSlice>) => void;
2023-03-28 23:59:51 -07:00
setSideBar: (options: Partial<SidebarProps>) => void;
setTitleBar: (options: Partial<TitlebarProps>) => void;
2022-12-19 15:59:14 -08:00
};
}
export const useAppStore = create<AppSlice>()(
persist(
devtools(
immer((set, get) => ({
actions: {
setAppStore: (data) => {
set({ ...get(), ...data });
},
2023-03-28 23:59:51 -07:00
setSideBar: (options) => {
2022-12-19 15:59:14 -08:00
set((state) => {
state.sidebar = { ...state.sidebar, ...options };
});
},
2023-03-28 23:59:51 -07:00
setTitleBar: (options) => {
2022-12-19 15:59:14 -08:00
set((state) => {
state.titlebar = { ...state.titlebar, ...options };
});
},
},
2023-05-18 02:09:07 -07:00
commandPalette: {
close: () => {
set((state) => {
state.commandPalette.opened = false;
});
},
open: () => {
set((state) => {
state.commandPalette.opened = true;
});
},
opened: false,
toggle: () => {
set((state) => {
state.commandPalette.opened = !state.commandPalette.opened;
});
},
},
2022-12-19 15:59:14 -08:00
isReorderingQueue: false,
platform: Platform.WINDOWS,
sidebar: {
collapsed: false,
2022-12-19 15:59:14 -08:00
expanded: [],
image: false,
2023-04-03 04:13:56 -07:00
leftWidth: '400px',
2022-12-19 15:59:14 -08:00
rightExpanded: false,
rightWidth: '400px',
},
titlebar: {
backgroundColor: '#000000',
outOfView: false,
},
})),
{ name: 'store_app' },
),
{
merge: (persistedState, currentState) => {
return merge(currentState, persistedState);
},
name: 'store_app',
version: 2,
2022-12-19 15:59:14 -08:00
},
),
);
export const useAppStoreActions = () => useAppStore((state) => state.actions);
export const useSidebarStore = () => useAppStore((state) => state.sidebar);
export const useSidebarRightExpanded = () => useAppStore((state) => state.sidebar.rightExpanded);
2023-03-28 23:59:51 -07:00
export const useSetTitlebar = () => useAppStore((state) => state.actions.setTitleBar);
2022-12-19 15:59:14 -08:00
export const useTitlebarStore = () => useAppStore((state) => state.titlebar);
2023-05-18 02:09:07 -07:00
export const useCommandPalette = () => useAppStore((state) => state.commandPalette);