use overlay for persistent storage
This commit is contained in:
parent
c93586bdf9
commit
9fd14bb72d
13
index.html
13
index.html
@ -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>
|
||||||
|
@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
|
22
style.css
22
style.css
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user