import { closeAllModals, openModal } from '@mantine/modals'; import { QueryClient } from '@tanstack/react-query'; import merge from 'lodash/merge'; import { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { persist } from 'zustand/middleware'; import { immer } from 'zustand/middleware/immer'; import { createWithEqualityFn } from 'zustand/traditional'; import i18n from '/@/i18n/i18n'; import { api } from '/@/renderer/api'; import { queryKeys } from '/@/renderer/api/query-keys'; import { useAuthStore } from '/@/renderer/store'; import { Button } from '/@/shared/components/button/button'; import { Checkbox } from '/@/shared/components/checkbox/checkbox'; import { Divider } from '/@/shared/components/divider/divider'; import { Group } from '/@/shared/components/group/group'; import { Icon } from '/@/shared/components/icon/icon'; import { NumberInput } from '/@/shared/components/number-input/number-input'; import { Select } from '/@/shared/components/select/select'; import { Stack } from '/@/shared/components/stack/stack'; import { GenreListResponse, GenreListSort } from '/@/shared/types/domain/genre-domain-types'; import { Played } from '/@/shared/types/domain/player-domain-types'; import { ServerListItem, ServerType } from '/@/shared/types/domain/server-domain-types'; import { RandomSongListQuery } from '/@/shared/types/domain/song-domain-types'; import { Play, PlayQueueAddOptions } from '/@/shared/types/types'; import { ListSortOrder } from '/@/shared/types/domain/shared-domain-types'; interface ShuffleAllSlice extends RandomSongListQuery { actions: { setStore: (data: Partial) => void; }; enableMaxYear: boolean; enableMinYear: boolean; } const useShuffleAllStore = createWithEqualityFn()( persist( immer((set, get) => ({ actions: { setStore: (data) => { set({ ...get(), ...data }); }, }, enableMaxYear: false, enableMinYear: false, genre: '', maxYear: 2020, minYear: 2000, musicFolder: '', played: Played.All, songCount: 100, })), { merge: (persistedState, currentState) => merge(currentState, persistedState), name: 'store_shuffle_all', version: 1, }, ), ); const PLAYED_DATA: { label: string; value: Played }[] = [ { label: 'all tracks', value: Played.All }, { label: 'only unplayed tracks', value: Played.Never }, { label: 'only played tracks', value: Played.Played }, ]; export const useShuffleAllStoreActions = () => useShuffleAllStore((state) => state.actions); interface ShuffleAllModalProps { genres: GenreListResponse | undefined; handlePlayQueueAdd: ((options: PlayQueueAddOptions) => void) | undefined; musicFolders: MusicFolderListResponse | undefined; queryClient: QueryClient; server: null | ServerListItem; } export const ShuffleAllModal = ({ genres, handlePlayQueueAdd, musicFolders, queryClient, server, }: ShuffleAllModalProps) => { const { t } = useTranslation(); const { enableMaxYear, enableMinYear, genre, limit, maxYear, minYear, musicFolderId, played } = useShuffleAllStore(); const { setStore } = useShuffleAllStoreActions(); const handlePlay = async (playType: Play) => { const res = await queryClient.fetchQuery({ cacheTime: 0, queryFn: ({ signal }) => api.controller.getRandomSongList({ apiClientProps: { server, signal, }, query: { genre: genre || undefined, limit, maxYear: enableMaxYear ? maxYear || undefined : undefined, minYear: enableMinYear ? minYear || undefined : undefined, musicFolderId: musicFolderId || undefined, played, }, }), queryKey: queryKeys.songs.randomSongList(server?.id), staleTime: 0, }); handlePlayQueueAdd?.({ byData: res?.items || [], playType, }); closeAllModals(); }; const genreData = useMemo(() => { if (!genres) return []; return genres.items.map((genre) => { const value = server?.type === ServerType.NAVIDROME || server?.type === ServerType.SUBSONIC ? genre.name : genre.id; return { label: genre.name, value, }; }); }, [genres, server?.type]); const musicFolderData = useMemo(() => { if (!musicFolders) return []; return musicFolders.items.map((musicFolder) => ({ label: musicFolder.name, value: String(musicFolder.id), })); }, [musicFolders]); return ( setStore({ limit: e ? Number(e) : 500 })} required value={limit} /> setStore({ minYear: e ? Number(e) : 0 })} rightSection={ setStore({ enableMinYear: e.currentTarget.checked })} style={{ marginRight: '0.5rem' }} /> } value={minYear} /> setStore({ maxYear: e ? Number(e) : 0 })} rightSection={ setStore({ enableMaxYear: e.currentTarget.checked })} style={{ marginRight: '0.5rem' }} /> } value={maxYear} /> { setStore({ musicFolderId: e ? String(e) : '' }); }} value={musicFolderId} /> {server?.type === ServerType.JELLYFIN && (