import { useState } from 'react'; import type { FormEvent } from 'react'; import { CloudHeader } from '../components/CloudHeader'; import { FloatingSearchDock } from '../components/FloatingSearchDock'; import { WordCloudCanvas } from '../components/WordCloudCanvas'; import { CloudLoadingState } from '../components/CloudLoadingState'; import { CloudUnavailableState } from '../components/CloudUnavailableState'; import { TitleFrost } from '../components/TitleFrost'; import { useCloud } from '../hooks/useCloud'; import { useWordCloudFocus } from '../hooks/useWordCloudFocus'; import styles from './PersonalSearchPage.module.css'; interface PersonalSearchPageProps { productId: string; } export function PersonalSearchPage({ productId }: PersonalSearchPageProps) { const cloudState = useCloud(productId); const cloud = cloudState.cloud; const [query, setQuery] = useState(''); const [hasNotFound, setHasNotFound] = useState(false); const focus = useWordCloudFocus({ words: cloud?.words ?? [] }); if (cloudState.status === 'loading') { return ; } if (!cloud) { return ; } const handleSubmit = (event: FormEvent) => { event.preventDefault(); if (!query.trim()) { setHasNotFound(false); return; } const found = focus.focusName(query); setHasNotFound(!found); }; const handleReset = () => { focus.reset(); setQuery(''); setHasNotFound(false); }; return (
{ setQuery(name); setHasNotFound(false); }} onSubmit={handleSubmit} onReset={handleReset} onSelectTarget={focus.selectTarget} />
); }