From d17c9277ff4e8d58ae8aa88a4d464652a38fb0e1 Mon Sep 17 00:00:00 2001 From: Jandl-hostacny Date: Wed, 21 Oct 2026 16:53:24 +0200 Subject: [PATCH] fix: sablony cenoviek len z databazy, stara kopia v prehliadaci sa zmaze Neulozene alebo zmazane sablony z localStorage sa uz neukazuju v roletkach. Ked sa sablonu nepodari ulozit do databazy, editor to ohlasi (predtym ju potichu ulozil len do prehliadaca). Co-Authored-By: Claude Opus 5.5 --- src/app/page.tsx | 20 ++----------- src/components/editor/BadgeEditorModal.tsx | 34 +++++++++------------- 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index dfb630e..d8e5c8f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,7 +10,7 @@ import { getBrevoCampaignUrl } from '@/lib/brevo'; import { TopBar } from '@/components/editor/TopBar'; import { ConfigPanel } from '@/components/editor/ConfigPanel'; import { ProductImportModal } from '@/components/editor/ProductImportModal'; -import { BadgeEditorModal } from '@/components/editor/BadgeEditorModal'; +import { BadgeEditorModal, clearLocalBadges } from '@/components/editor/BadgeEditorModal'; import { SavedCampaignsModal } from '@/components/editor/SavedCampaignsModal'; import { NameDialog } from '@/components/editor/NameDialog'; import JSZip from 'jszip'; @@ -64,22 +64,8 @@ export default function Home() { console.warn('Error fetching badges in page:', e); } - try { - const local = localStorage.getItem('coop_custom_badges'); - if (local) { - const parsed = JSON.parse(local); - if (Array.isArray(parsed)) { - const existingIds = new Set(loaded.map((b) => b.id)); - for (const b of parsed) { - // len šablóny neuložené do databázy – zmazané šablóny sa z prehliadača nesmú vrátiť - if (!existingIds.has(b.id) && String(b.id).startsWith('badge-')) { - loaded.push(b); - existingIds.add(b.id); - } - } - } - } - } catch (e) {} + // šablóny sú len v databáze; starú kópiu z prehliadača zmažeme + clearLocalBadges(); const all = [...loaded]; const existingIds = new Set(all.map((b) => b.id)); diff --git a/src/components/editor/BadgeEditorModal.tsx b/src/components/editor/BadgeEditorModal.tsx index 4822ee1..87e6325 100644 --- a/src/components/editor/BadgeEditorModal.tsx +++ b/src/components/editor/BadgeEditorModal.tsx @@ -55,9 +55,11 @@ function toBadgeDbPayload(badge: BadgeTemplate) { }; } -function saveLocal(list: BadgeTemplate[]) { +// Šablóny sú len v databáze. Staršie verzie ukladali kópiu do prehliadača – tú zmažeme, +// aby sa v roletkách neukazovali neuložené alebo už zmazané šablóny. +export function clearLocalBadges() { try { - localStorage.setItem(LOCAL_KEY, JSON.stringify(list)); + localStorage.removeItem(LOCAL_KEY); } catch { // localStorage nemusí byť dostupný } @@ -358,18 +360,9 @@ export const BadgeEditorModal: React.FC = ({ const { data } = await supabase.from('badges').select('*').order('created_at', { ascending: false }); loaded = ((data as BadgeRow[]) || []).map(badgeFromRow); } catch { - // bez databázy použijeme kópiu v prehliadači - } - try { - const local = JSON.parse(localStorage.getItem(LOCAL_KEY) || '[]'); - if (Array.isArray(local)) { - const ids = new Set(loaded.map((b) => b.id)); - // z prehliadača len šablóny, ktoré ešte neboli uložené do databázy (zmazané sa nesmú vrátiť) - for (const b of local as BadgeTemplate[]) if (!ids.has(b.id) && b.id.startsWith('badge-')) loaded.push(b); - } - } catch { - // localStorage nemusí byť dostupný + // databáza nie je dostupná – zoznam ostane prázdny } + clearLocalBadges(); if (cancelled) return; setBadges(loaded); open(loaded[0] || null); @@ -507,13 +500,14 @@ export const BadgeEditorModal: React.FC = ({ if (error) throw error; if (data?.[0]) saved = { ...badge, id: (data[0] as BadgeRow).id }; } catch (err) { - console.warn('Šablóna sa uložila len v prehliadači:', err); + setSaving(false); + alert(`Šablónu sa nepodarilo uložiť do databázy: ${(err as Error).message || err}`); + return null; } const list = badges.some((b) => b.id === badge.id) ? badges.map((b) => (b.id === badge.id ? saved : b)) : [saved, ...badges]; setBadges(list); - saveLocal(list); setBadge(saved); setSavedJson(JSON.stringify(saved)); setSaving(false); @@ -559,14 +553,15 @@ export const BadgeEditorModal: React.FC = ({ let saved = copy; try { const { data, error } = await supabase.from('badges').insert([toBadgeDbPayload(copy)]).select(); - if (!error && data?.[0]) saved = { ...copy, id: (data[0] as BadgeRow).id }; - } catch { - // bez databázy ostane kópia v prehliadači + if (error || !data?.[0]) throw error || new Error('bez odpovede'); + saved = { ...copy, id: (data[0] as BadgeRow).id }; + } catch (err) { + alert(`Kópiu šablóny sa nepodarilo uložiť do databázy: ${(err as Error).message || err}`); + return; } const list = [...badges]; list.splice(list.findIndex((x) => x.id === b.id) + 1, 0, saved); setBadges(list); - saveLocal(list); open(saved); }; @@ -585,7 +580,6 @@ export const BadgeEditorModal: React.FC = ({ } const list = badges.filter((x) => x.id !== b.id); setBadges(list); - saveLocal(list); if (badge?.id === b.id) open(list[0] || null); };