feishin/src/renderer/store/playlist.store.ts

232 lines
8.3 KiB
TypeScript
Raw Normal View History

2023-05-20 20:00:09 -07:00
import { create } from 'zustand';
2022-12-31 03:46:12 -08:00
import { devtools, persist } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';
import { PlaylistListSort, SortOrder } from '/@/renderer/api/types';
import { PlaylistListFilter, SongListFilter } from '/@/renderer/store/list.store';
2022-12-31 03:46:12 -08:00
import { DataTableProps } from '/@/renderer/store/settings.store';
import { ListDisplayType, TableColumn, TablePagination } from '/@/renderer/types';
import { mergeOverridingColumns } from '/@/renderer/store/utils';
2022-12-31 03:46:12 -08:00
type TableProps = {
2023-07-01 19:10:05 -07:00
pagination: TablePagination;
scrollOffset: number;
2022-12-31 03:46:12 -08:00
} & DataTableProps;
type ListProps<T> = {
2023-07-01 19:10:05 -07:00
display: ListDisplayType;
filter: T;
table: TableProps;
2022-12-31 03:46:12 -08:00
};
2023-01-01 13:58:05 -08:00
type DetailPaginationProps = TablePagination & {
2023-07-01 19:10:05 -07:00
scrollOffset: number;
2023-01-01 13:58:05 -08:00
};
type DetailTableProps = DataTableProps & {
2023-07-01 19:10:05 -07:00
id: {
[key: string]: DetailPaginationProps & { filter: SongListFilter };
};
2023-01-01 13:58:05 -08:00
};
type DetailProps = {
2023-07-01 19:10:05 -07:00
display: ListDisplayType;
table: DetailTableProps;
2023-01-01 13:58:05 -08:00
};
2023-07-15 11:21:44 -07:00
type ListGridProps = {
itemsPerRow?: number;
scrollOffset?: number;
};
2022-12-31 03:46:12 -08:00
interface PlaylistState {
2023-07-01 19:10:05 -07:00
detail: DetailProps;
2023-07-15 11:21:44 -07:00
grid: ListGridProps;
2023-07-01 19:10:05 -07:00
list: ListProps<PlaylistListFilter>;
2022-12-31 03:46:12 -08:00
}
export interface PlaylistSlice extends PlaylistState {
2023-07-01 19:10:05 -07:00
actions: {
setDetailFilters: (id: string, data: Partial<SongListFilter>) => SongListFilter;
setDetailTable: (data: Partial<DetailTableProps>) => void;
setDetailTablePagination: (id: string, data: Partial<DetailPaginationProps>) => void;
setFilters: (data: Partial<PlaylistListFilter>) => PlaylistListFilter;
2023-07-15 11:21:44 -07:00
setGrid: (args: { data: Partial<ListGridProps> }) => void;
2023-07-01 19:10:05 -07:00
setStore: (data: Partial<PlaylistSlice>) => void;
setTable: (data: Partial<TableProps>) => void;
setTablePagination: (args: { data: Partial<TablePagination> }) => void;
};
2022-12-31 03:46:12 -08:00
}
export const usePlaylistStore = create<PlaylistSlice>()(
2023-07-01 19:10:05 -07:00
persist(
devtools(
immer((set, get) => ({
actions: {
setDetailFilters: (id, data) => {
set((state) => {
state.detail.table.id[id] = {
...state.detail.table.id[id],
filter: {
...state.detail.table.id[id].filter,
...data,
},
};
});
return get().detail.table.id[id].filter;
},
setDetailTable: (data) => {
set((state) => {
state.detail.table = { ...state.detail.table, ...data };
});
},
setDetailTablePagination: (id, data) => {
set((state) => {
state.detail.table.id[id] = {
...state.detail.table.id[id],
...data,
};
});
},
setFilters: (data) => {
set((state) => {
state.list.filter = { ...state.list.filter, ...data };
});
return get().list.filter;
},
2023-07-15 11:21:44 -07:00
setGrid: (args) => {
set((state) => {
state.grid = {
...state.grid,
...args.data,
};
});
},
2023-07-01 19:10:05 -07:00
setStore: (data) => {
set({ ...get(), ...data });
},
setTable: (data) => {
set((state) => {
state.list.table = { ...state.list.table, ...data };
});
},
setTablePagination: (args) => {
set((state) => {
state.list.table.pagination = {
...state.list.table.pagination,
...args.data,
};
});
},
2023-01-01 13:58:05 -08:00
},
2023-07-01 19:10:05 -07:00
detail: {
display: ListDisplayType.TABLE,
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: 500,
},
],
id: {},
rowHeight: 60,
},
},
2023-07-15 11:21:44 -07:00
grid: {
itemsPerRow: 5,
scrollOffset: 0,
},
2023-07-01 19:10:05 -07:00
list: {
display: ListDisplayType.TABLE,
filter: {
musicFolderId: undefined,
sortBy: PlaylistListSort.NAME,
sortOrder: SortOrder.ASC,
},
table: {
autoFit: true,
columns: [
{
column: TableColumn.ROW_INDEX,
width: 50,
},
{
column: TableColumn.TITLE,
width: 500,
},
{
column: TableColumn.SONG_COUNT,
width: 100,
},
],
pagination: {
currentPage: 1,
itemsPerPage: 100,
totalItems: 1,
totalPages: 1,
},
rowHeight: 40,
scrollOffset: 0,
},
},
})),
{ name: 'store_playlist' },
),
{
merge: mergeOverridingColumns,
2023-07-01 19:10:05 -07:00
name: 'store_playlist',
version: 1,
2022-12-31 03:46:12 -08:00
},
),
);
export const usePlaylistStoreActions = () => usePlaylistStore((state) => state.actions);
export const useSetPlaylistStore = () => usePlaylistStore((state) => state.actions.setStore);
export const useSetPlaylistFilters = () => usePlaylistStore((state) => state.actions.setFilters);
export const usePlaylistFilters = () => {
2023-07-01 19:10:05 -07:00
return usePlaylistStore((state) => [state.list.filter, state.actions.setFilters]);
2022-12-31 03:46:12 -08:00
};
2023-07-15 11:21:44 -07:00
export const usePlaylistGridStore = () => usePlaylistStore((state) => state.grid);
2022-12-31 03:46:12 -08:00
export const usePlaylistListStore = () => usePlaylistStore((state) => state.list);
export const usePlaylistTablePagination = () =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.list.table.pagination);
2022-12-31 03:46:12 -08:00
export const useSetPlaylistTablePagination = () =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.actions.setTablePagination);
2022-12-31 03:46:12 -08:00
export const useSetPlaylistTable = () => usePlaylistStore((state) => state.actions.setTable);
2023-01-01 13:58:05 -08:00
export const usePlaylistDetailStore = () => usePlaylistStore((state) => state.detail);
export const usePlaylistDetailTablePagination = (id: string) =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.detail.table.id[id]);
2023-01-01 13:58:05 -08:00
export const useSetPlaylistDetailTablePagination = () =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.actions.setDetailTablePagination);
2023-01-01 13:58:05 -08:00
export const useSetPlaylistDetailTable = () =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.actions.setDetailTable);
2023-01-01 13:58:05 -08:00
export const useSetPlaylistDetailFilters = () =>
2023-07-01 19:10:05 -07:00
usePlaylistStore((state) => state.actions.setDetailFilters);