diff --git a/src/app/page.tsx b/src/app/page.tsx index 4caa847..1f3d30a 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useRef } from 'react'; import { NewsletterCampaign, NewsletterModule, ProductItem, BadgeTemplate } from '@/types/newsletter'; import { DEFAULT_CAMPAIGN, SUPABASE_ASSETS_BASE, ensureValidityBar } from '@/lib/defaultCampaign'; import { renderEmailHtml, renderSingleModuleHtml, getCampaignValidity } from '@/lib/emailRenderer'; @@ -124,6 +124,12 @@ export default function Home() { return [...topMods, ...middleMods, ...flyerMods, ...recipeMods, ...footerMods]; }; + // Auto-save sa spustí až po načítaní kampane z databázy. Inak by sa pri pomalšom načítaní + // predvolená kampaň uložila ako nová kópia a ďalšie zmeny by sa ukladali do nej. + const [isLoaded, setIsLoaded] = useState(false); + // Prebiehajúce vloženie novej kampane – kým nemáme jej id, ďalšie vloženie by vytvorilo duplikát + const insertInFlight = useRef(false); + // Načítanie existujúceho draftu z databázy pri štarte useEffect(() => { async function loadInitial() { @@ -136,7 +142,7 @@ export default function Home() { if (data && data.length > 0) { const dbItem = data[0]; - if (dbItem.data && dbItem.data.modules && dbItem.data.modules.length >= 7) { + if (Array.isArray(dbItem.data?.modules) && dbItem.data.modules.length > 0) { setCampaign({ id: dbItem.id, title: dbItem.title, @@ -152,6 +158,8 @@ export default function Home() { } } catch (err) { console.error('Error loading template from Supabase:', err); + } finally { + setIsLoaded(true); } } loadInitial(); @@ -159,10 +167,13 @@ export default function Home() { // Auto-save s debounce (1 sekunda) useEffect(() => { + if (!isLoaded) return; const timer = setTimeout(async () => { + if (!campaign.id && insertInFlight.current) return; setIsSaving(true); try { if (!campaign.id) { + insertInFlight.current = true; const { data } = await supabase .from('templates') .insert([ @@ -178,7 +189,8 @@ export default function Home() { .select(); if (data && data.length > 0) { - setCampaign((prev) => ({ ...prev, id: data[0].id })); + // id nastavíme len ak medzitým nebola otvorená iná kampaň + setCampaign((prev) => (prev.id ? prev : { ...prev, id: data[0].id })); } } else { await supabase @@ -196,12 +208,13 @@ export default function Home() { } catch (err) { console.error('Auto-save error:', err); } finally { + insertInFlight.current = false; setIsSaving(false); } }, 1000); return () => clearTimeout(timer); - }, [campaign.title, campaign.preheader, campaign.modules, campaign.id]); + }, [isLoaded, campaign.title, campaign.preheader, campaign.modules, campaign.id]); const selectedModule = campaign.modules.find((m) => m.id === selectedModuleId) || null;