use overlay for persistent storage

This commit is contained in:
Reimar 2025-10-16 15:15:58 +02:00
parent c93586bdf9
commit 9fd14bb72d
4 changed files with 46 additions and 34 deletions

View File

@ -140,11 +140,11 @@ lib.startGameLoop(loop);
Copyright © 2025 S. J. Fakobsen (do whatever idc) Copyright © 2025 S. J. Fakobsen (do whatever idc)
</footer> </footer>
<dialog id="AssetStore-popup"> <div id="persistent-storage-overlay">
<h1>Karlkoder would like persistant storage permission</h1> <h1>Allow persistent storage to avoid data loss</h1>
<p> <p>
Your code is saved only in your browser, not on our servers. To provide an optimal Your code is saved only in your browser, not on our servers. To provide an optimal
experience, we would permission to use <a experience, we would like permission to use <a
href="https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist" href="https://developer.mozilla.org/en-US/docs/Web/API/StorageManager/persist"
>persistent storage</a>, otherwise, your browser may clear your Karlkoder data at >persistent storage</a>, otherwise, your browser may clear your Karlkoder data at
any point it wants to. any point it wants to.
@ -159,12 +159,7 @@ lib.startGameLoop(loop);
data, i.e. if you clear your browser history, so we would still recommend to save it data, i.e. if you clear your browser history, so we would still recommend to save it
to your hard drive every now and then. to your hard drive every now and then.
</p> </p>
<p><b id="AssetStore-popup-error"></b></p> </div>
<button id="AssetStore-popup-allow">
Allow persistant storage (Will create a popup from browser)
</button>
<button id="AssetStore-popup-deny">Don't allow persistent storage</button>
</dialog>
<!-- fix flash bug in furry browser --> <!-- fix flash bug in furry browser -->
<script> <script>

View File

@ -107,37 +107,32 @@ export class AssetStore {
try { try {
isAlreadyPersisted = await storage.persisted(); isAlreadyPersisted = await storage.persisted();
} catch { } catch {
console.log("[AssetStore] User has storage disabled, cannot persist!"); console.warn("[AssetStore] User has storage disabled, cannot persist!");
return; return;
} }
if (isAlreadyPersisted) { if (isAlreadyPersisted) {
console.log("[AssetStore] already got persistent storage!"); console.log("[AssetStore] already got persistent storage!");
return; return;
} }
if (globalThis.localStorage.getItem("persistence-denied")) {
if (localStorage.getItem("persistence-denied")) {
console.log("[AssetStore] already denied persistent storage!"); console.log("[AssetStore] already denied persistent storage!");
return; return;
} }
const dialog = document.querySelector("#AssetStore-popup");
const error = dialog.querySelector("#AssetStore-popup-error"); const overlay = document.querySelector("#persistent-storage-overlay");
const allow = dialog.querySelector("#AssetStore-popup-allow"); overlay.style.display = "flex";
const deny = dialog.querySelector("#AssetStore-popup-deny");
allow.addEventListener("click", async () => { const persisted = await storage.persist();
try {
const didPersist = await storage.persist(); if (!persisted) {
if (!didPersist) { alert("Persistent storage denied - Please remember to save often!");
error.textContent = "could not persist: permission denied";
return; localStorage.setItem("persistence-denied", "1");
} }
dialog.close();
} catch (err) { overlay.style.opacity = 0;
error.textContent = `could not persist: ${err}`; setTimeout(() => overlay.style.display = "none", 200);
}
});
deny.addEventListener("click", () => {
globalThis.localStorage.setItem("persistence-denied", true);
dialog.close();
});
dialog.showModal();
} }
} }

View File

@ -81,6 +81,8 @@ const loadButton = document.querySelector("#load-button");
const exportButton = document.querySelector("#export-button"); const exportButton = document.querySelector("#export-button");
const dropZone = document.querySelector("main"); const dropZone = document.querySelector("main");
AssetStore.requestPersistence();
const sessionSaveHandler = new SessionSaveHandler(editor, projectName); const sessionSaveHandler = new SessionSaveHandler(editor, projectName);
sessionSaveHandler.loadAll(); sessionSaveHandler.loadAll();
@ -156,5 +158,3 @@ dropZone.ondrop = async (ev) => {
ev.preventDefault(); ev.preventDefault();
}; };
AssetStore.requestPersistence();

View File

@ -436,3 +436,25 @@ footer {
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }
#persistent-storage-overlay {
display: none;
position: absolute;
inset: 0;
padding: 0 20rem;
height: 100vh;
background-color: rgba(0, 0, 0, 0.8);
flex-direction: column;
justify-content: center;
align-items: flex-start;
z-index: 100;
transition: opacity 200ms ease-in-out;
}
#persistent-storage-overlay p {
color: #bdbdbd;
}
#persistent-storage-overlay a {
color: #2196f3;
}