make overlay draft recovery explicit

This commit is contained in:
2026-10-25 05:35:19 +01:00
parent 000af8bfb1
commit fa7ee4d87f
+32 -9
View File
@@ -93,6 +93,7 @@
let overlayBusy = false; let overlayBusy = false;
let overlaySavedSignature = ''; let overlaySavedSignature = '';
let overlayAutosaveAttemptedSignature = ''; let overlayAutosaveAttemptedSignature = '';
let pendingOverlayDraft: { overlayName: string; overlaySlug: string; overlayHtml: string; overlayCss: string; overlayJavascript: string; overlayEnabled: boolean; overlayDisabledDesign: string } | null = null;
let overlayAutosaveTimer: number | undefined; let overlayAutosaveTimer: number | undefined;
let oauthScopes: Record<'streamer' | 'bot', { connected: boolean; missing_scopes: string[]; reauthorization_required: boolean }> = { let oauthScopes: Record<'streamer' | 'bot', { connected: boolean; missing_scopes: string[]; reauthorization_required: boolean }> = {
streamer: { connected: false, missing_scopes: [], reauthorization_required: false }, streamer: { connected: false, missing_scopes: [], reauthorization_required: false },
@@ -705,6 +706,7 @@
} }
function selectOverlay(overlay: (typeof overlays)[number]) { function selectOverlay(overlay: (typeof overlays)[number]) {
pendingOverlayDraft = null;
selectedOverlayId = overlay.id; selectedOverlayId = overlay.id;
overlayName = overlay.name; overlayName = overlay.name;
overlaySlug = overlay.slug; overlaySlug = overlay.slug;
@@ -739,15 +741,16 @@
try { try {
const cached = JSON.parse(localStorage.getItem(overlayDraftCacheKey(id)) || 'null') as Partial<{ overlayName: string; overlaySlug: string; overlayHtml: string; overlayCss: string; overlayJavascript: string; overlayEnabled: boolean; overlayDisabledDesign: string }> | null; const cached = JSON.parse(localStorage.getItem(overlayDraftCacheKey(id)) || 'null') as Partial<{ overlayName: string; overlaySlug: string; overlayHtml: string; overlayCss: string; overlayJavascript: string; overlayEnabled: boolean; overlayDisabledDesign: string }> | null;
if (!cached || typeof cached.overlayName !== 'string') return; if (!cached || typeof cached.overlayName !== 'string') return;
overlayName = cached.overlayName; const cachedSignature = JSON.stringify(cached);
overlaySlug = cached.overlaySlug ?? overlaySlug; if (cachedSignature !== overlayDraftSignature()) pendingOverlayDraft = {
overlayHtml = cached.overlayHtml ?? overlayHtml; overlayName: cached.overlayName,
overlayCss = cached.overlayCss ?? overlayCss; overlaySlug: cached.overlaySlug ?? overlaySlug,
overlayJavascript = cached.overlayJavascript ?? overlayJavascript; overlayHtml: cached.overlayHtml ?? overlayHtml,
overlayEnabled = cached.overlayEnabled ?? overlayEnabled; overlayCss: cached.overlayCss ?? overlayCss,
overlayDisabledDesign = cached.overlayDisabledDesign ?? overlayDisabledDesign; overlayJavascript: cached.overlayJavascript ?? overlayJavascript,
overlaySavedSignature = ''; overlayEnabled: cached.overlayEnabled ?? overlayEnabled,
overlayAutosaveAttemptedSignature = ''; overlayDisabledDesign: cached.overlayDisabledDesign ?? overlayDisabledDesign,
};
} catch { } catch {
// Ignore malformed or unavailable local cache entries. // Ignore malformed or unavailable local cache entries.
} }
@@ -758,6 +761,7 @@
overlayAutosaveTimer = undefined; overlayAutosaveTimer = undefined;
overlaySavedSignature = ''; overlaySavedSignature = '';
overlayAutosaveAttemptedSignature = ''; overlayAutosaveAttemptedSignature = '';
pendingOverlayDraft = null;
selectedOverlayId = ''; selectedOverlayId = '';
overlayName = 'New Overlay'; overlayName = 'New Overlay';
overlaySlug = `overlay-${Date.now()}`; overlaySlug = `overlay-${Date.now()}`;
@@ -768,6 +772,19 @@
overlayDisabledDesign = 'transparent'; overlayDisabledDesign = 'transparent';
} }
function restorePendingOverlayDraft() {
if (!pendingOverlayDraft) return;
({ overlayName, overlaySlug, overlayHtml, overlayCss, overlayJavascript, overlayEnabled, overlayDisabledDesign } = pendingOverlayDraft);
pendingOverlayDraft = null;
overlaySavedSignature = '';
overlayAutosaveAttemptedSignature = '';
}
function discardPendingOverlayDraft() {
if (selectedOverlayId) localStorage.removeItem(overlayDraftCacheKey(selectedOverlayId));
pendingOverlayDraft = null;
}
async function saveOverlay() { async function saveOverlay() {
overlayBusy = true; overlayBusy = true;
overlayError = ''; overlayError = '';
@@ -1002,5 +1019,11 @@
<button class="primary" onclick={() => chatThreadRoot && replyToChatMessage(chatThreadRoot)}>REPLY IN THREAD</button> <button class="primary" onclick={() => chatThreadRoot && replyToChatMessage(chatThreadRoot)}>REPLY IN THREAD</button>
</section> </section>
{/if} {/if}
{#if pendingOverlayDraft}
<section class="panel overlay-recovery-panel">
<div class="panel-header"><span>LOCAL OVERLAY DRAFT FOUND</span></div>
<div class="settings-body"><span>A newer unsaved draft is available for this overlay.</span><div class="overlay-controls"><button class="primary" onclick={restorePendingOverlayDraft}>RESTORE LOCAL DRAFT</button><button class="secondary" onclick={discardPendingOverlayDraft}>DISCARD LOCAL DRAFT</button></div></div>
</section>
{/if}
</main> </main>
</div> </div>