'use client'; import { useState } from 'react'; import { useTranslations, useLocale } from 'next-intl'; import { X, Search, Star, FileText } from 'lucide-react'; import { cn } from '@/lib/utils'; import { Input } from '@/components/ui/input'; import { useTemplateStore } from '@/stores/template-store'; import { useAuthStore } from '@/stores/auth-store'; import { useFocusTrap } from '@/hooks/use-focus-trap'; import { getPlaceholdersFromTemplate, getAutoFilledPlaceholders, } from '@/lib/template-utils'; import { PlaceholderFillModal } from './placeholder-fill-modal'; import type { EmailTemplate } from '@/lib/template-types'; interface TemplatePickerProps { isOpen: boolean; onClose: () => void; onSelect: (template: EmailTemplate, filledValues: Record) => void; } export function TemplatePicker({ isOpen, onClose, onSelect }: TemplatePickerProps) { const t = useTranslations('templates'); const locale = useLocale(); const { templates, getFavorites, getRecent, getTemplatesByCategory, searchTemplates, recordUsage } = useTemplateStore(); const { primaryIdentity } = useAuthStore(); const [searchQuery, setSearchQuery] = useState(''); const [selectedTemplate, setSelectedTemplate] = useState(null); const [showFillModal, setShowFillModal] = useState(false); const modalRef = useFocusTrap({ isActive: isOpen && !showFillModal, onEscape: onClose, restoreFocus: true, }); const favorites = getFavorites(); const recent = getRecent(); const byCategory = getTemplatesByCategory(); const filtered = searchQuery ? searchTemplates(searchQuery) : null; const handleSelectTemplate = (template: EmailTemplate) => { const placeholders = getPlaceholdersFromTemplate(template); recordUsage(template.id); if (placeholders.length > 0) { setSelectedTemplate(template); setShowFillModal(true); } else { onSelect(template, {}); } }; const finishSelection = (values: Record) => { if (selectedTemplate) { onSelect(selectedTemplate, values); } setShowFillModal(false); setSelectedTemplate(null); }; if (!isOpen) return null; const autoFilled = getAutoFilledPlaceholders({ senderName: primaryIdentity?.name, locale, }); const renderTemplateItem = (template: EmailTemplate) => ( ); const renderSection = (title: string, items: EmailTemplate[]) => { if (items.length === 0) return null; return (

{title}

{items.map(renderTemplateItem)}
); }; const categorizedEntries = Object.entries(byCategory).filter( ([cat]) => cat !== '' ); const favoriteIds = new Set(favorites.map((f) => f.id)); const recentFiltered = recent.filter((r) => !favoriteIds.has(r.id)); const shownIds = new Set([ ...favoriteIds, ...recentFiltered.map((r) => r.id), ]); const uncategorizedFiltered = (byCategory[''] || []).filter( (i) => !shownIds.has(i.id) ); return ( <>

{t('picker_title')}

setSearchQuery(e.target.value)} placeholder={t('search_placeholder')} className="ps-9 h-9" autoFocus />
{templates.length === 0 && (

{t('no_templates')}

)} {filtered ? ( filtered.length > 0 ? (
{filtered.map(renderTemplateItem)}
) : (
{t('no_results')}
) ) : ( <> {renderSection(t('section_favorites'), favorites)} {renderSection(t('section_recent'), recentFiltered)} {categorizedEntries.map(([cat, items]) => renderSection( cat, items.filter((i) => !shownIds.has(i.id)) ) )} {renderSection(t('section_uncategorized'), uncategorizedFiltered)} )}
{showFillModal && selectedTemplate && ( finishSelection({})} onClose={() => { setShowFillModal(false); setSelectedTemplate(null); }} /> )} ); }