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 <noreply@anthropic.com>
This commit is contained in:
1 parent
b747a3ba74
commit
d17c9277ff
2 files changed
+17
-37
No files matched your search
+3
-17
@@ -10,7 +10,7 @@ import { getBrevoCampaignUrl } from '@/lib/brevo';
|
|||||||
import { TopBar } from '@/components/editor/TopBar';
|
import { TopBar } from '@/components/editor/TopBar';
|
||||||
import { ConfigPanel } from '@/components/editor/ConfigPanel';
|
import { ConfigPanel } from '@/components/editor/ConfigPanel';
|
||||||
import { ProductImportModal } from '@/components/editor/ProductImportModal';
|
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 { SavedCampaignsModal } from '@/components/editor/SavedCampaignsModal';
|
||||||
import { NameDialog } from '@/components/editor/NameDialog';
|
import { NameDialog } from '@/components/editor/NameDialog';
|
||||||
import JSZip from 'jszip';
|
import JSZip from 'jszip';
|
||||||
@@ -64,22 +64,8 @@ export default function Home() {
|
|||||||
console.warn('Error fetching badges in page:', e);
|
console.warn('Error fetching badges in page:', e);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// šablóny sú len v databáze; starú kópiu z prehliadača zmažeme
|
||||||
const local = localStorage.getItem('coop_custom_badges');
|
clearLocalBadges();
|
||||||
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) {}
|
|
||||||
|
|
||||||
const all = [...loaded];
|
const all = [...loaded];
|
||||||
const existingIds = new Set(all.map((b) => b.id));
|
const existingIds = new Set(all.map((b) => b.id));
|
||||||
|
|||||||
@@ -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 {
|
try {
|
||||||
localStorage.setItem(LOCAL_KEY, JSON.stringify(list));
|
localStorage.removeItem(LOCAL_KEY);
|
||||||
} catch {
|
} catch {
|
||||||
// localStorage nemusí byť dostupný
|
// localStorage nemusí byť dostupný
|
||||||
}
|
}
|
||||||
@@ -358,18 +360,9 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
|||||||
const { data } = await supabase.from('badges').select('*').order('created_at', { ascending: false });
|
const { data } = await supabase.from('badges').select('*').order('created_at', { ascending: false });
|
||||||
loaded = ((data as BadgeRow[]) || []).map(badgeFromRow);
|
loaded = ((data as BadgeRow[]) || []).map(badgeFromRow);
|
||||||
} catch {
|
} catch {
|
||||||
// bez databázy použijeme kópiu v prehliadači
|
// databáza nie je dostupná – zoznam ostane prázdny
|
||||||
}
|
|
||||||
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ý
|
|
||||||
}
|
}
|
||||||
|
clearLocalBadges();
|
||||||
if (cancelled) return;
|
if (cancelled) return;
|
||||||
setBadges(loaded);
|
setBadges(loaded);
|
||||||
open(loaded[0] || null);
|
open(loaded[0] || null);
|
||||||
@@ -507,13 +500,14 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
|||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
if (data?.[0]) saved = { ...badge, id: (data[0] as BadgeRow).id };
|
if (data?.[0]) saved = { ...badge, id: (data[0] as BadgeRow).id };
|
||||||
} catch (err) {
|
} 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)
|
const list = badges.some((b) => b.id === badge.id)
|
||||||
? badges.map((b) => (b.id === badge.id ? saved : b))
|
? badges.map((b) => (b.id === badge.id ? saved : b))
|
||||||
: [saved, ...badges];
|
: [saved, ...badges];
|
||||||
setBadges(list);
|
setBadges(list);
|
||||||
saveLocal(list);
|
|
||||||
setBadge(saved);
|
setBadge(saved);
|
||||||
setSavedJson(JSON.stringify(saved));
|
setSavedJson(JSON.stringify(saved));
|
||||||
setSaving(false);
|
setSaving(false);
|
||||||
@@ -559,14 +553,15 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
|||||||
let saved = copy;
|
let saved = copy;
|
||||||
try {
|
try {
|
||||||
const { data, error } = await supabase.from('badges').insert([toBadgeDbPayload(copy)]).select();
|
const { data, error } = await supabase.from('badges').insert([toBadgeDbPayload(copy)]).select();
|
||||||
if (!error && data?.[0]) saved = { ...copy, id: (data[0] as BadgeRow).id };
|
if (error || !data?.[0]) throw error || new Error('bez odpovede');
|
||||||
} catch {
|
saved = { ...copy, id: (data[0] as BadgeRow).id };
|
||||||
// bez databázy ostane kópia v prehliadači
|
} catch (err) {
|
||||||
|
alert(`Kópiu šablóny sa nepodarilo uložiť do databázy: ${(err as Error).message || err}`);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
const list = [...badges];
|
const list = [...badges];
|
||||||
list.splice(list.findIndex((x) => x.id === b.id) + 1, 0, saved);
|
list.splice(list.findIndex((x) => x.id === b.id) + 1, 0, saved);
|
||||||
setBadges(list);
|
setBadges(list);
|
||||||
saveLocal(list);
|
|
||||||
open(saved);
|
open(saved);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -585,7 +580,6 @@ export const BadgeEditorModal: React.FC<BadgeEditorModalProps> = ({
|
|||||||
}
|
}
|
||||||
const list = badges.filter((x) => x.id !== b.id);
|
const list = badges.filter((x) => x.id !== b.id);
|
||||||
setBadges(list);
|
setBadges(list);
|
||||||
saveLocal(list);
|
|
||||||
if (badge?.id === b.id) open(list[0] || null);
|
if (badge?.id === b.id) open(list[0] || null);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user