Extract tabs nav, templates grid, editor split view, settings form, logs table, and data-loading/actions hook into _components/ and _hooks/. page.tsx reduced from 816 to 88 LOC. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
89 lines
2.7 KiB
TypeScript
89 lines
2.7 KiB
TypeScript
'use client'
|
|
|
|
import { useState } from 'react'
|
|
import { StepHeader } from '@/components/sdk/StepHeader'
|
|
|
|
import { EmailTemplate, TabId } from './_types'
|
|
import { useEmailTemplates } from './_hooks/useEmailTemplates'
|
|
import { TabNav } from './_components/TabNav'
|
|
import { TemplatesTab } from './_components/TemplatesTab'
|
|
import { EditorTab } from './_components/EditorTab'
|
|
import { SettingsTab } from './_components/SettingsTab'
|
|
import { LogsTab } from './_components/LogsTab'
|
|
|
|
export default function EmailTemplatesPage() {
|
|
const [activeTab, setActiveTab] = useState<TabId>('templates')
|
|
const {
|
|
templates, logs, logsTotal, loading, error,
|
|
selectedCategory,
|
|
selectedTemplate, editorSubject, editorHtml, editorVersion, saving, previewHtml,
|
|
settingsForm, savingSettings,
|
|
setError, setSelectedCategory,
|
|
setEditorSubject, setEditorHtml,
|
|
setSettingsForm,
|
|
openEditor, saveVersion, publishVersion, loadPreview,
|
|
saveSettings2, initializeDefaults,
|
|
} = useEmailTemplates(activeTab)
|
|
|
|
const handleEdit = async (template: EmailTemplate) => {
|
|
setActiveTab('editor')
|
|
await openEditor(template)
|
|
}
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<StepHeader stepId="email-templates" />
|
|
|
|
{error && (
|
|
<div className="bg-red-50 border border-red-200 rounded-lg p-3 text-sm text-red-700">
|
|
{error}
|
|
<button onClick={() => setError(null)} className="ml-2 underline">Schliessen</button>
|
|
</div>
|
|
)}
|
|
|
|
<TabNav activeTab={activeTab} onTabChange={setActiveTab} logsTotal={logsTotal} />
|
|
|
|
{activeTab === 'templates' && (
|
|
<TemplatesTab
|
|
templates={templates}
|
|
loading={loading}
|
|
selectedCategory={selectedCategory}
|
|
onCategoryChange={setSelectedCategory}
|
|
onEdit={handleEdit}
|
|
onInitialize={initializeDefaults}
|
|
/>
|
|
)}
|
|
|
|
{activeTab === 'editor' && (
|
|
<EditorTab
|
|
template={selectedTemplate}
|
|
version={editorVersion}
|
|
subject={editorSubject}
|
|
html={editorHtml}
|
|
previewHtml={previewHtml}
|
|
saving={saving}
|
|
onSubjectChange={setEditorSubject}
|
|
onHtmlChange={setEditorHtml}
|
|
onSave={saveVersion}
|
|
onPublish={publishVersion}
|
|
onPreview={loadPreview}
|
|
onBack={() => setActiveTab('templates')}
|
|
/>
|
|
)}
|
|
|
|
{activeTab === 'settings' && settingsForm && (
|
|
<SettingsTab
|
|
settings={settingsForm}
|
|
saving={savingSettings}
|
|
onChange={setSettingsForm}
|
|
onSave={saveSettings2}
|
|
/>
|
|
)}
|
|
|
|
{activeTab === 'logs' && (
|
|
<LogsTab logs={logs} total={logsTotal} />
|
|
)}
|
|
</div>
|
|
)
|
|
}
|