'use client' import * as React from 'react' import type { AdminMedia, MediaListParams, MediaListResult } from '@admin/types' import { getMedia, getMediaById, getMediaByIds } from '@admin/actions/media' import { useQuery } from '@tanstack/react-query' const DEFAULT_MEDIA_PAGE = 1 const DEFAULT_MEDIA_PAGE_SIZE = 40 function emptySelection(): Map { return new Map() } export function clampMediaPage(value: number | undefined): number { if (typeof value !== 'number' || !Number.isFinite(value)) { return DEFAULT_MEDIA_PAGE } return Math.max(DEFAULT_MEDIA_PAGE, Math.floor(value)) } export function clampMediaPageSize(value: number | undefined): number { if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) { return DEFAULT_MEDIA_PAGE_SIZE } return Math.max(1, Math.floor(value)) } export function useMediaList(params: MediaListParams = {}) { const safeParams = { ...params, page: clampMediaPage(params.page), pageSize: clampMediaPageSize(params.pageSize) } const query = useQuery({ queryKey: ['media', safeParams], queryFn: () => getMedia(safeParams) }) const pageSize = safeParams.pageSize const pageCount = Math.max(1, Math.ceil((query.data?.total ?? 0) / pageSize)) const media = query.data?.media ?? [] return { ...query, media, pageCount } } export function useMediaSelection(mode: 'single' | 'multi') { const [selectedMap, setSelectedMap] = React.useState(emptySelection) const handleItemClick = React.useCallback( (item: AdminMedia) => { if (mode === 'single') { setSelectedMap(new Map([[item.id, item]])) return } setSelectedMap((current) => { const next = new Map(current) if (next.has(item.id)) { next.delete(item.id) } else { next.set(item.id, item) } return next }) }, [mode] ) const reset = React.useCallback(() => setSelectedMap(new Map()), []) const getSelection = React.useCallback(() => { const values = [...selectedMap.values()] return mode === 'single' ? values[0] : values }, [selectedMap, mode]) return { selectedMap, handleItemClick, reset, getSelection, count: selectedMap.size } } export function useMediaById(id: string | undefined | null) { return useQuery({ queryKey: ['media', 'detail', id], queryFn: () => (id ? getMediaById(id) : null), enabled: !!id }) } export function useMediaByIds(ids: string[]) { return useQuery<(AdminMedia | null)[]>({ queryKey: ['media', 'batch', ids], queryFn: () => (ids.length > 0 ? getMediaByIds(ids) : []), enabled: ids.length > 0, placeholderData: (previousData) => previousData }) }