'use client'; import { useEffect, useState } from 'react'; import { toast } from 'sonner'; import { Plus, Trash2, Loader2 } from 'lucide-react'; import { createClient } from '@/lib/supabase/client'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Badge } from '@/components/ui/badge'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import type { MessageTemplate } from '@/types'; const CATEGORIES = ['Marketing', 'Utility', 'Authentication'] as const; const HEADER_TYPES = ['text', 'image', 'video', 'document'] as const; const categoryColors: Record = { Marketing: 'bg-purple-600/20 text-purple-400 border-purple-600/30', Utility: 'bg-blue-600/20 text-blue-400 border-blue-600/30', Authentication: 'bg-amber-600/20 text-amber-400 border-amber-600/30', }; const statusColors: Record = { Draft: 'bg-slate-600/20 text-slate-400 border-slate-600/30', Pending: 'bg-yellow-600/20 text-yellow-400 border-yellow-600/30', Approved: 'bg-emerald-600/20 text-emerald-400 border-emerald-600/30', Rejected: 'bg-red-600/20 text-red-400 border-red-600/30', }; interface TemplateFormData { name: string; category: MessageTemplate['category']; language: string; body_text: string; header_type: string; footer_text: string; } const emptyForm: TemplateFormData = { name: '', category: 'Marketing', language: 'en', body_text: '', header_type: '', footer_text: '', }; export function TemplateManager() { const supabase = createClient(); const [loading, setLoading] = useState(true); const [templates, setTemplates] = useState([]); const [dialogOpen, setDialogOpen] = useState(false); const [saving, setSaving] = useState(false); const [form, setForm] = useState(emptyForm); useEffect(() => { fetchTemplates(); }, []); async function fetchTemplates() { try { setLoading(true); const { data: { user } } = await supabase.auth.getUser(); if (!user) return; const { data, error } = await supabase .from('message_templates') .select('*') .eq('user_id', user.id) .order('created_at', { ascending: false }); if (error) throw error; setTemplates(data || []); } catch (err) { console.error('Failed to fetch templates:', err); toast.error('Failed to load templates'); } finally { setLoading(false); } } async function handleSave() { if (!form.name.trim()) { toast.error('Template name is required'); return; } if (!form.body_text.trim()) { toast.error('Body text is required'); return; } try { setSaving(true); const { data: { user } } = await supabase.auth.getUser(); if (!user) { toast.error('Not authenticated'); return; } const payload = { user_id: user.id, name: form.name.trim(), category: form.category, language: form.language.trim() || 'en', body_text: form.body_text.trim(), header_type: form.header_type || null, footer_text: form.footer_text.trim() || null, status: 'Draft' as const, }; const { error } = await supabase .from('message_templates') .insert(payload); if (error) throw error; toast.success('Template created successfully'); setDialogOpen(false); setForm(emptyForm); await fetchTemplates(); } catch (err) { console.error('Save error:', err); toast.error('Failed to create template'); } finally { setSaving(false); } } async function handleDelete(id: string) { try { const { error } = await supabase .from('message_templates') .delete() .eq('id', id); if (error) throw error; toast.success('Template deleted'); setTemplates((prev) => prev.filter((t) => t.id !== id)); } catch (err) { console.error('Delete error:', err); toast.error('Failed to delete template'); } } if (loading) { return (
); } return (

Message Templates

Create and manage your WhatsApp message templates.

{templates.length === 0 ? (

No templates yet.

Create your first message template to get started.

) : (
{templates.map((template) => (

{template.name}

{template.category} {template.status || 'Draft'} {template.language && ( {template.language} )}

{template.body_text}

{template.footer_text && (

{template.footer_text}

)}
))}
)} {/* New Template Dialog */} New Message Template Create a new WhatsApp message template.
setForm({ ...form, name: e.target.value })} className="bg-slate-800 border-slate-700 text-white placeholder:text-slate-500" />
setForm({ ...form, language: e.target.value })} className="bg-slate-800 border-slate-700 text-white placeholder:text-slate-500" />