import { useCallback, useEffect, useMemo, useState } from 'react'; import { Star, X } from 'lucide-react'; import type { PatternDefinition } from '@shared/domain/pattern'; import { isScratchpadProject, type ProjectRecord } from '@shared/domain/project'; interface NewSessionModalProps { projects: ProjectRecord[]; patterns: PatternDefinition[]; defaultProjectId?: string; onClose: () => void; onCreate: (projectId: string, patternId: string) => void; onTogglePatternFavorite?: (patternId: string, isFavorite: boolean) => void; } export function NewSessionModal({ projects, patterns, defaultProjectId, onClose, onCreate, onTogglePatternFavorite, }: NewSessionModalProps) { const userProjects = useMemo( () => projects.filter((p) => !isScratchpadProject(p)), [projects], ); const [projectId, setProjectId] = useState(defaultProjectId ?? userProjects[0]?.id ?? ''); const availablePatterns = useMemo( () => patterns .filter((pattern) => pattern.availability !== 'unavailable') .sort((a, b) => { if (a.isFavorite && !b.isFavorite) return -1; if (!a.isFavorite && b.isFavorite) return 1; return 0; }), [patterns], ); const [patternId, setPatternId] = useState(availablePatterns[0]?.id ?? ''); useEffect(() => { if (!availablePatterns.some((pattern) => pattern.id === patternId)) { setPatternId(availablePatterns[0]?.id ?? ''); } }, [availablePatterns, patternId]); const handleKeyDown = useCallback((e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); }, [onClose]); useEffect(() => { document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, [handleKeyDown]); const canCreate = projectId && patternId; return (