fix: auto-save nevytvara pri nacitani stranky kopie kampani
- auto-save sa spusti az po nacitani kampane z databazy (predtym sa pri pomalsom nacitani ulozila predvolena kampan ako nova kopia a dalsie zmeny sli do nej) - pocas vkladania novej kampane sa nespusti druhe vlozenie - id novej kampane sa nastavi, len ak medzitym nebola otvorena ina - nacita sa naposledy upravena kampan bez ohladu na pocet modulov Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
25771afc79
commit
109d65a690
1 file changed
+17
-4
+17
-4
@@ -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;
|
||||
|
||||
|
||||
Reference in new issue
Block a user