'use client' import { useEffect, useState, useSyncExternalStore } from 'react' import { IconCheck as Check, IconChevronDown as ChevronDown } from '@tabler/icons-react' import { SEARCH_MODE_CONFIGS } from '@/lib/config/search-modes' import { SearchMode } from '@/lib/types/search' import { cn } from '@/lib/utils' import { getCookie, setCookie, subscribeToCookieChange } from '@/lib/utils/cookies' import { Button } from './ui/button' import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from './ui/dropdown-menu' import { HoverCard, HoverCardContent, HoverCardTrigger } from './ui/hover-card' const VALID_SEARCH_MODES = new Set(['quick', 'adaptive']) function getSearchModeSnapshot(): SearchMode { const savedMode = getCookie('searchMode') return savedMode === 'adaptive' ? 'adaptive' : 'quick' } interface SearchModeSelectorProps { isAdaptiveAuthRequired?: boolean onAdaptiveAuthRequired?: () => void } export function SearchModeSelector({ isAdaptiveAuthRequired = false, onAdaptiveAuthRequired }: SearchModeSelectorProps) { const value = useSyncExternalStore( subscribeToCookieChange, getSearchModeSnapshot, () => 'quick' ) const [openHoverCard, setOpenHoverCard] = useState(null) const [justSelected, setJustSelected] = useState(false) const [dropdownOpen, setDropdownOpen] = useState(false) useEffect(() => { const savedMode = getCookie('searchMode') if (savedMode && !VALID_SEARCH_MODES.has(savedMode)) { // Clean up invalid cookie value (e.g., old 'planning' mode) setCookie('searchMode', 'quick') return } if (isAdaptiveAuthRequired && savedMode === 'adaptive') { setCookie('searchMode', 'quick') } }, [isAdaptiveAuthRequired]) const closeModeSelectControls = () => { setOpenHoverCard(null) // Close hover card on selection setDropdownOpen(false) // Close dropdown on selection setJustSelected(true) // Prevent hover card from reopening immediately setTimeout(() => { setJustSelected(false) }, 500) } const handleModeSelect = (mode: SearchMode) => { if (mode === 'adaptive' && isAdaptiveAuthRequired) { setCookie('searchMode', 'quick') closeModeSelectControls() onAdaptiveAuthRequired?.() return } setCookie('searchMode', mode) closeModeSelectControls() } const selectedMode = SEARCH_MODE_CONFIGS.find( config => config.value === value ) const SelectedIcon = selectedMode?.icon const selectedIndex = Math.max( SEARCH_MODE_CONFIGS.findIndex(config => config.value === value), 0 ) const modeCount = SEARCH_MODE_CONFIGS.length return ( <> {/* Mobile Dropdown */}
{SEARCH_MODE_CONFIGS.map(config => { const ModeIcon = config.icon const isSelected = value === config.value return ( handleModeSelect(config.value)} className="relative flex flex-col items-start gap-1 py-2 pl-8 pr-2 cursor-pointer focus:outline-none" > {isSelected && ( )}
{config.label}
{config.description}
) })}
{/* Desktop Toggle */}
{/* Animated background indicator */}
{/* Mode buttons */}
{SEARCH_MODE_CONFIGS.map((config, index) => { const Icon = config.icon const isSelected = value === config.value return ( { if (!justSelected) { setOpenHoverCard(open ? config.value : null) } }} openDelay={100} closeDelay={50} >

{config.label}

{config.description}

) })}
) }