feishin/src/renderer/store/song.store.ts

145 lines
4.1 KiB
TypeScript
Raw Normal View History

2022-12-21 01:25:56 -08:00
import merge from 'lodash/merge';
import create from 'zustand';
import { devtools, persist } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
import { SongListArgs, SongListSort, SortOrder } from '/@/renderer/api/types';
import { DataTableProps } from '/@/renderer/store/settings.store';
2022-12-27 13:52:50 -08:00
import { ListDisplayType, TableColumn, TablePagination } from '/@/renderer/types';
2022-12-21 01:25:56 -08:00
type TableProps = {
2022-12-27 13:52:50 -08:00
pagination: TablePagination;
2022-12-21 01:25:56 -08:00
scrollOffset: number;
} & DataTableProps;
type ListProps<T> = {
2022-12-26 04:47:40 -08:00
display: ListDisplayType;
2022-12-21 01:25:56 -08:00
filter: T;
table: TableProps;
};
2022-12-27 13:52:50 -08:00
export type SongListFilter = Omit<SongListArgs['query'], 'startIndex' | 'limit'>;
2022-12-21 01:25:56 -08:00
interface SongState {
2022-12-27 13:52:50 -08:00
list: ListProps<SongListFilter>;
2022-12-21 01:25:56 -08:00
}
export interface SongSlice extends SongState {
actions: {
2022-12-27 13:52:50 -08:00
setFilters: (data: Partial<SongListFilter>) => SongListFilter;
2022-12-21 01:25:56 -08:00
setStore: (data: Partial<SongSlice>) => void;
2022-12-27 13:52:50 -08:00
setTable: (data: Partial<TableProps>) => void;
setTablePagination: (data: Partial<TableProps['pagination']>) => void;
2022-12-21 01:25:56 -08:00
};
}
export const useSongStore = create<SongSlice>()(
persist(
devtools(
immer((set, get) => ({
actions: {
setFilters: (data) => {
set((state) => {
state.list.filter = { ...state.list.filter, ...data };
});
2022-12-27 13:52:50 -08:00
return get().list.filter;
2022-12-21 01:25:56 -08:00
},
setStore: (data) => {
set({ ...get(), ...data });
},
2022-12-27 13:52:50 -08:00
setTable: (data) => {
set((state) => {
state.list.table = { ...state.list.table, ...data };
});
},
setTablePagination: (data) => {
set((state) => {
state.list.table.pagination = { ...state.list.table.pagination, ...data };
});
},
2022-12-21 01:25:56 -08:00
},
list: {
2022-12-26 04:47:40 -08:00
display: ListDisplayType.TABLE,
2022-12-21 01:25:56 -08:00
filter: {
musicFolderId: undefined,
sortBy: SongListSort.RECENTLY_ADDED,
sortOrder: SortOrder.ASC,
},
table: {
autoFit: true,
columns: [
{
column: TableColumn.ROW_INDEX,
width: 50,
},
{
column: TableColumn.TITLE_COMBINED,
width: 500,
},
{
column: TableColumn.DURATION,
width: 100,
},
{
column: TableColumn.ALBUM,
width: 300,
},
{
column: TableColumn.ARTIST,
width: 100,
},
{
column: TableColumn.YEAR,
width: 100,
},
{
column: TableColumn.DATE_ADDED,
width: 100,
},
{
column: TableColumn.PLAY_COUNT,
width: 100,
},
2022-12-21 01:25:56 -08:00
],
2022-12-27 13:52:50 -08:00
pagination: {
currentPage: 1,
itemsPerPage: 100,
totalItems: 1,
totalPages: 1,
},
2022-12-21 01:25:56 -08:00
rowHeight: 60,
scrollOffset: 0,
},
},
})),
{ name: 'store_song' },
),
{
merge: (persistedState, currentState) => {
return merge(currentState, persistedState);
},
name: 'store_song',
version: 1,
},
),
);
export const useSongStoreActions = () => useSongStore((state) => state.actions);
export const useSetSongStore = () => useSongStore((state) => state.actions.setStore);
2022-12-27 13:52:50 -08:00
export const useSetSongFilters = () => useSongStore((state) => state.actions.setFilters);
2022-12-21 01:25:56 -08:00
export const useSongFilters = () => {
return useSongStore((state) => [state.list.filter, state.actions.setFilters]);
};
export const useSongListStore = () => useSongStore((state) => state.list);
2022-12-27 13:52:50 -08:00
export const useSongTablePagination = () => useSongStore((state) => state.list.table.pagination);
export const useSetSongTablePagination = () =>
useSongStore((state) => state.actions.setTablePagination);
export const useSetSongTable = () => useSongStore((state) => state.actions.setTable);