Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | 'use client' import { css } from '@styled/css' import { useSearchParams } from 'next/navigation' import { useTranslations } from 'next-intl' import { useEffect, useState } from 'react' import type { WorksheetFormState } from '@/app/create/worksheets/types' import { PageWithNav } from '@/components/PageWithNav' import { useTheme } from '@/contexts/ThemeContext' import { useWorksheetAutoSave } from '../hooks/useWorksheetAutoSave' import { useWorksheetGeneration } from '../hooks/useWorksheetGeneration' import { useWorksheetState } from '../hooks/useWorksheetState' import { getDefaultDate } from '../utils/dateFormatting' import { ConfigSidebar } from './ConfigSidebar' import { GenerationErrorDisplay } from './GenerationErrorDisplay' import { PreviewCenter } from './PreviewCenter' import { ResponsivePanelLayout } from './ResponsivePanelLayout' import { WorksheetConfigProvider } from './WorksheetConfigContext' interface AdditionWorksheetClientProps { initialSettings: Omit<WorksheetFormState, 'date' | 'rows' | 'total'> /** Optional initial preview - if not provided, will be fetched via API */ initialPreview?: string[] } export function AdditionWorksheetClient({ initialSettings, initialPreview, }: AdditionWorksheetClientProps) { const searchParams = useSearchParams() const isFromShare = searchParams.get('from') === 'share' // Check for shared config in sessionStorage const [effectiveSettings, setEffectiveSettings] = useState(initialSettings) useEffect(() => { if (isFromShare && typeof window !== 'undefined') { const sharedConfigStr = sessionStorage.getItem('sharedWorksheetConfig') if (sharedConfigStr) { try { const sharedConfig = JSON.parse(sharedConfigStr) console.log('[Worksheet Client] Loading shared config:', sharedConfig) setEffectiveSettings(sharedConfig) // Clear from sessionStorage after loading sessionStorage.removeItem('sharedWorksheetConfig') } catch (err) { console.error('Failed to parse shared config:', err) } } } }, [isFromShare]) console.log('[Worksheet Client] Component render, effectiveSettings:', { problemsPerPage: effectiveSettings.problemsPerPage, cols: effectiveSettings.cols, pages: effectiveSettings.pages, seed: effectiveSettings.seed, }) const t = useTranslations('create.worksheets.addition') const { resolvedTheme } = useTheme() const isDark = resolvedTheme === 'dark' // State management (formState, debouncedFormState, updateFormState) const { formState, debouncedFormState, updateFormState } = useWorksheetState(effectiveSettings) // Generation workflow (status, error, generate, reset) const { status, error, generate, reset } = useWorksheetGeneration() // Auto-save (isSaving, lastSaved) const { isSaving, lastSaved } = useWorksheetAutoSave(formState, 'addition') // Generate handler with date injection const handleGenerate = async () => { await generate({ ...formState, date: getDefaultDate(), }) } return ( <PageWithNav navTitle={t('navTitle')} navEmoji="📝"> <WorksheetConfigProvider formState={formState} updateFormState={updateFormState}> <div data-component="addition-worksheet-page" className={css({ height: 'calc(100vh - var(--app-nav-height))', bg: isDark ? 'gray.900' : 'gray.50', overflow: 'hidden', display: 'flex', flexDirection: 'column', })} > {/* Responsive Panel Layout (desktop) or Drawer (mobile) */} <ResponsivePanelLayout config={formState} sidebarContent={<ConfigSidebar isSaving={isSaving} lastSaved={lastSaved} />} previewContent={ <PreviewCenter formState={debouncedFormState} initialPreview={initialPreview} onGenerate={handleGenerate} status={status} /> } /> {/* Error Display */} <GenerationErrorDisplay error={error} visible={status === 'error'} onRetry={reset} /> </div> </WorksheetConfigProvider> </PageWithNav> ) } |