Files
feishin/src/renderer/store/full-screen-player.store.ts
T
2026-04-01 21:57:26 -07:00

75 lines
2.3 KiB
TypeScript

import merge from 'lodash/merge';
import { devtools, persist } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
import { shallow } from 'zustand/shallow';
import { createWithEqualityFn } from 'zustand/traditional';
export interface FullScreenPlayerSlice extends FullScreenPlayerState {
actions: {
setStore: (data: Partial<FullScreenPlayerSlice>) => void;
};
}
interface FullScreenPlayerState {
activeTab: 'lyrics' | 'queue' | 'related' | string;
dynamicBackground?: boolean;
dynamicImageBlur: number;
dynamicIsImage?: boolean;
expanded: boolean;
opacity: number;
useImageAspectRatio: boolean;
visualizerExpanded: boolean;
}
export const useFullScreenPlayerStore = createWithEqualityFn<FullScreenPlayerSlice>()(
persist(
devtools(
immer((set, get) => ({
actions: {
setStore: (data) => {
set({ ...get(), ...data });
},
},
activeTab: 'queue',
dynamicBackground: true,
dynamicImageBlur: 1.5,
dynamicIsImage: false,
expanded: false,
opacity: 60,
useImageAspectRatio: false,
visualizerExpanded: false,
})),
{ name: 'store_full_screen_player' },
),
{
merge: (persistedState, currentState) => {
return merge(currentState, persistedState);
},
migrate: (persistedState, version) => {
if (version <= 2) {
return {} as FullScreenPlayerState;
}
return persistedState;
},
name: 'store_full_screen_player',
version: 3,
},
),
);
export const useFullScreenPlayerStoreActions = () =>
useFullScreenPlayerStore((state) => state.actions);
export const useSetFullScreenPlayerStore = () =>
useFullScreenPlayerStore((state) => state.actions.setStore);
export const useFullScreenPlayerOverlayState = () =>
useFullScreenPlayerStore(
(state) => ({
expanded: state.expanded,
visualizerExpanded: state.visualizerExpanded,
}),
shallow,
);