'use client'; /** * Fallback Picker * * Visual intent selector shown when classification confidence is low. * E4.S4: Grid met block opties, keyboard shortcuts (1-3). */ import { useEffect, useCallback } from 'react'; import { motion } from 'framer-motion'; import { FileText, Search, ArrowRightLeft, X } from 'lucide-react'; import { useSwiftStore } from '@/stores/swift-store'; import type { BlockType } from '@/lib/swift/types'; interface FallbackPickerProps { originalInput?: string; } interface BlockOption { type: BlockType; label: string; description: string; icon: typeof FileText; shortcut: string; color: string; } const BLOCK_OPTIONS: BlockOption[] = [ { type: 'dagnotitie', label: 'Notitie', description: 'Schrijf een dagnotitie', icon: FileText, shortcut: '1', color: 'bg-blue-50 text-blue-600 border-blue-200', }, { type: 'zoeken', label: 'Zoeken', description: 'Zoek een patiƫnt', icon: Search, shortcut: '2', color: 'bg-emerald-50 text-emerald-600 border-emerald-200', }, { type: 'overdracht', label: 'Overdracht', description: 'Bekijk overdracht', icon: ArrowRightLeft, shortcut: '3', color: 'bg-amber-50 text-amber-600 border-amber-200', }, ]; export function FallbackPicker({ originalInput }: FallbackPickerProps) { const { openBlock, closeBlock, addRecentAction } = useSwiftStore(); const handleSelect = useCallback( (option: BlockOption) => { // Pass original input as content for dagnotitie, or as search query for zoeken const prefillData = option.type === 'dagnotitie' ? { content: originalInput } : option.type === 'zoeken' ? { patientName: originalInput } : {}; openBlock(option.type, prefillData); // Only add to recent actions if it's a valid SwiftIntent (not patient-dashboard) if (option.type !== 'patient-dashboard') { addRecentAction({ intent: option.type, label: option.label, }); } }, [openBlock, addRecentAction, originalInput] ); // Keyboard shortcuts useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { // Don't handle if in input field if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement) { return; } // Number keys 1-3 for quick select const keyNum = parseInt(e.key); if (keyNum >= 1 && keyNum <= BLOCK_OPTIONS.length) { e.preventDefault(); handleSelect(BLOCK_OPTIONS[keyNum - 1]); } // Escape to close if (e.key === 'Escape') { e.preventDefault(); closeBlock(); } }; window.addEventListener('keydown', handleKeyDown); return () => window.removeEventListener('keydown', handleKeyDown); }, [handleSelect, closeBlock]); return ( {/* Header */}

Wat wil je doen?

{/* Original input display */} {originalInput && (

Je zei: "{originalInput}"

)} {/* Options grid */}
{BLOCK_OPTIONS.map((option) => ( handleSelect(option)} whileHover={{ scale: 1.02 }} whileTap={{ scale: 0.98 }} className={`flex flex-col items-center gap-2 p-4 rounded-lg border transition-all ${option.color} hover:shadow-md`} > {option.label} {option.description} [{option.shortcut}] ))}
{/* Footer hint */}

Druk op [1], [2] of [3] voor snelle selectie

); }