'use client'; import React, { useState, useEffect } from 'react'; import { supabase } from '@/lib/supabase'; import { NewsletterCampaign } from '@/types/newsletter'; import { DEFAULT_CAMPAIGN } from '@/lib/defaultCampaign'; import { NameDialog } from './NameDialog'; import { FolderOpen, Plus, Copy, Trash2, X, ExternalLink, Clock, CheckCircle2, Layers, Search, Sparkles, Pencil } from 'lucide-react'; interface SavedCampaignsModalProps { isOpen: boolean; onClose: () => void; currentCampaign: NewsletterCampaign; onLoadCampaign: (campaign: NewsletterCampaign) => void; onSaveCurrentAsCopy: (newTitle: string) => Promise; onRenameCurrent: (title: string) => void; } export const SavedCampaignsModal: React.FC = ({ isOpen, onClose, currentCampaign, onLoadCampaign, onSaveCurrentAsCopy, onRenameCurrent }) => { const [campaigns, setCampaigns] = useState([]); const [loading, setLoading] = useState(false); const [search, setSearch] = useState(''); const [isCreatingNew, setIsCreatingNew] = useState(false); const [newTitle, setNewTitle] = useState(''); // okno na názov: premenovanie alebo duplikovanie vybraného newslettera const [nameAction, setNameAction] = useState<{ kind: 'rename' | 'duplicate'; camp: { id: string; title: string; data?: unknown } } | null>(null); const fetchCampaigns = async () => { setLoading(true); try { const { data, error } = await supabase .from('templates') .select('*') .order('updated_at', { ascending: false }); if (error) throw error; setCampaigns(data || []); } catch (err: any) { console.error('Error fetching campaigns:', err); } finally { setLoading(false); } }; useEffect(() => { if (isOpen) { fetchCampaigns(); setIsCreatingNew(false); setNewTitle(''); } }, [isOpen]); if (!isOpen) return null; const handleRename = async (camp: { id: string }, title: string) => { try { const { error } = await supabase.from('templates').update({ title }).eq('id', camp.id); if (error) throw error; setCampaigns((prev) => prev.map((c) => (c.id === camp.id ? { ...c, title } : c))); if (camp.id === currentCampaign.id) onRenameCurrent(title); setNameAction(null); } catch (err) { alert(`Chyba pri premenovaní: ${(err as Error).message}`); } }; const handleDuplicate = async (camp: any, clonedTitle: string) => { try { const { data, error } = await supabase .from('templates') .insert([ { title: clonedTitle, status: 'draft', data: camp.data } ]) .select(); if (error) throw error; if (data && data[0]) { await fetchCampaigns(); onLoadCampaign({ id: data[0].id, title: data[0].title, preheader: data[0].data?.preheader || '', status: 'draft', modules: data[0].data?.modules || [] }); setNameAction(null); onClose(); } } catch (err: any) { alert(`Chyba pri duplikovaní: ${err.message}`); } }; const handleDelete = async (id: string, title: string) => { if (!confirm(`Naozaj chcete vymazať newsletter "${title}"?`)) return; try { const { error } = await supabase.from('templates').delete().eq('id', id); if (error) throw error; setCampaigns((prev) => prev.filter((c) => c.id !== id)); if (currentCampaign.id === id) { // Ak sme vymazali práve otvorený, resetneme ID onLoadCampaign({ ...currentCampaign, id: '' }); } } catch (err: any) { alert(`Chyba pri mazaní: ${err.message}`); } }; const handleCreateNew = async () => { const title = newTitle.trim() || `COOP Newsletter - ${new Date().toLocaleDateString('sk-SK')}`; try { const { data, error } = await supabase .from('templates') .insert([ { title, status: 'draft', data: { preheader: DEFAULT_CAMPAIGN.preheader, modules: JSON.parse(JSON.stringify(DEFAULT_CAMPAIGN.modules)) } } ]) .select(); if (error) throw error; if (data && data[0]) { onLoadCampaign({ id: data[0].id, title: data[0].title, preheader: data[0].data?.preheader || '', status: 'draft', modules: data[0].data?.modules || [] }); onClose(); } } catch (err: any) { alert(`Chyba pri vytváraní: ${err.message}`); } }; const handleSaveCurrentCopy = async () => { const title = newTitle.trim() || `Kópia - ${currentCampaign.title}`; await onSaveCurrentAsCopy(title); await fetchCampaigns(); setIsCreatingNew(false); setNewTitle(''); onClose(); }; const filtered = campaigns.filter((c) => (c.title || '').toLowerCase().includes(search.toLowerCase()) ); return (
{/* Horná lišta */}

Moje Newslettre

Spravujte, otvárajte a duplikujte uložené šablóny e-mailov

{/* Panel na vytvorenie / uloženie kópie */} {isCreatingNew && (
setNewTitle(e.target.value)} placeholder="Zadajte názov nového newslettera (napr. Kampaň Veľká Noc 2026)" className="w-full text-xs border border-gray-300 rounded-xl p-2.5 bg-white font-medium focus:ring-2 focus:ring-red-500 focus:outline-none" autoFocus />
)} {/* Vyhľadávanie */}
setSearch(e.target.value)} placeholder="Vyhľadávať medzi uloženými newslettrami..." className="w-full pl-9 pr-4 py-2 text-xs border border-gray-200 rounded-xl bg-gray-50 focus:bg-white focus:outline-none focus:ring-2 focus:ring-red-500" />
{/* Zoznam kampaní */}
{loading ? (
Načítavam uložené newslettre...
) : filtered.length === 0 ? (

Nenašli sa žiadne uložené newslettre

Vytvorte nový kliknutím na tlačidlo vyššie.

) : ( filtered.map((camp) => { const isCurrent = camp.id === currentCampaign.id; const moduleCount = camp.data?.modules?.length || 0; const isExported = camp.status === 'exported' || !!camp.brevo_campaign_id; const updatedDate = camp.updated_at ? new Date(camp.updated_at).toLocaleString('sk-SK', { day: 'numeric', month: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit' }) : 'Neznámy dátum'; return (
{camp.title} {isCurrent && ( Práve otvorený )} {isExported && ( Vytvorené v Brevo )}
{updatedDate} {moduleCount} modulov {camp.brevo_campaign_id && ( e.stopPropagation()} > Brevo #{camp.brevo_campaign_id} )}
{/* Akčné tlačidlá */}
); }) )}
{/* Pätička */}
Celkovo uložených: {campaigns.length} newsletterov
(nameAction?.kind === 'rename' ? handleRename(nameAction.camp, title) : handleDuplicate(nameAction!.camp, title))} onCancel={() => setNameAction(null)} />
); };