use buildYearsParam utility in shuffle, clean up dependency arrays

- Replace duplicated year-range building logic in shuffle.ts with
  the existing buildYearsParam utility
- Remove stable function import (triggerHaptic) from useCallback
  dependency arrays in GenreSelection
This commit is contained in:
skalthoff
2026-02-18 18:33:21 -08:00
parent f1be9c00f7
commit db5906d397
2 changed files with 15 additions and 28 deletions

View File

@@ -14,6 +14,7 @@ import {
ItemSortBy,
} from '@jellyfin/sdk/lib/generated-client/models'
import { mapDtoToTrack } from '../../../utils/mapping/item-to-track'
import buildYearsParam from '../../../utils/mapping/build-years-param'
import { QueuingType } from '../../../enums/queuing-type'
import { useStreamingDeviceProfileStore } from '../../../stores/device-profile'
import { ApiLimits } from '../../../configs/query.config'
@@ -130,18 +131,7 @@ export async function handleShuffle(keepCurrentTrack: boolean = true): Promise<J
apiFilters.push(ItemFilter.IsUnplayed)
}
// Build years param for year range filter
const yearsParam =
yearMin != null || yearMax != null
? (() => {
const min = yearMin ?? 0
const max = yearMax ?? new Date().getFullYear()
if (min > max) return undefined
const years: string[] = []
for (let y = min; y <= max; y++) years.push(String(y))
return years.length > 0 ? years : undefined
})()
: undefined
const yearsParam = buildYearsParam(yearMin, yearMax)
// Fetch random tracks from Jellyfin with filters
const data = await nitroFetch<{ Items: BaseItemDto[] }>(api, '/Items', {

View File

@@ -62,19 +62,16 @@ export default function GenreSelectionScreen({
return result
}, [genresByLetter])
const toggleGenre = useCallback(
(genreId: string) => {
triggerHaptic('impactLight')
setSelectedGenreIds((prev) => {
if (prev.includes(genreId)) {
return prev.filter((id) => id !== genreId)
} else {
return [...prev, genreId]
}
})
},
[triggerHaptic],
)
const toggleGenre = useCallback((genreId: string) => {
triggerHaptic('impactLight')
setSelectedGenreIds((prev) => {
if (prev.includes(genreId)) {
return prev.filter((id) => id !== genreId)
} else {
return [...prev, genreId]
}
})
}, [])
const handleSave = useCallback(() => {
triggerHaptic('impactLight')
@@ -84,7 +81,7 @@ export default function GenreSelectionScreen({
isDownloaded: selectedGenreIds.length > 0 ? false : undefined,
})
navigation.goBack()
}, [selectedGenreIds, navigation, triggerHaptic])
}, [selectedGenreIds, navigation])
const handleClear = useCallback(() => {
triggerHaptic('impactLight')
@@ -92,7 +89,7 @@ export default function GenreSelectionScreen({
useLibraryStore.getState().setTracksFilters({
genreIds: undefined,
})
}, [triggerHaptic])
}, [])
const allLoadedGenreIds = useMemo(
() => genres?.map((g) => g.Id!).filter(Boolean) ?? [],
@@ -104,7 +101,7 @@ export default function GenreSelectionScreen({
const handleSelectAll = useCallback(() => {
triggerHaptic('impactLight')
setSelectedGenreIds([...allLoadedGenreIds])
}, [allLoadedGenreIds, triggerHaptic])
}, [allLoadedGenreIds])
const renderListHeader = useCallback(
() => (