import { useEffect, useRef, useState } from 'react' import { ArrowDown, ArrowUp, ArrowUpDown, Check, Shuffle } from 'lucide-react' import { SORT_OPTIONS, type SortField, type SortOption, type SortOrder, } from '../utils/mediaSort' type MediaSortDropdownProps = { value: SortField order: SortOrder onChange: (field: SortField, order: SortOrder) => void onReshuffle?: () => void className?: string } export function MediaSortDropdown({ value, order, onChange, onReshuffle, className = '', }: MediaSortDropdownProps) { const [isOpen, setIsOpen] = useState(false) const dropdownRef = useRef(null) const currentOption = SORT_OPTIONS.find((opt) => opt.id === value) ?? SORT_OPTIONS[0] useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { setIsOpen(false) } } if (isOpen) { document.addEventListener('mousedown', handleClickOutside) } return () => { document.removeEventListener('mousedown', handleClickOutside) } }, [isOpen]) const handleSelect = (option: SortOption) => { if (option.id === 'random') { if (value === 'random') { onReshuffle?.() } else { onChange('random', 'desc') } setIsOpen(false) return } if (value === option.id) { // 再次点击相同项:切换升降序 const nextOrder: SortOrder = order === 'asc' ? 'desc' : 'asc' onChange(option.id, nextOrder) } else { // 点击新项:应用默认排序方向 onChange(option.id, option.defaultOrder) } setIsOpen(false) } return (
{isOpen && (
排序方式
{SORT_OPTIONS.map((option) => { const isSelected = value === option.id return ( ) })}
)}
) }