collective

Browse / github.com/storytold/photocraft / patch

fix: show actionable browser preference errors

fix: show actionable browser preference errors A blocked or full browser site-data store exposes a raw JavaScript exception and WebAssembly stack in PhotoCraft's preference notice. Translate quota/security failures into actionable messages, retain detailed diagnostics in the console, and preserve the existing preference retry path. Validation evidence: - Built the maintained aggregate browser patch against PhotoCraft v0.16.0 (`b1794c6e0608ccfc887213dcf58398977c5cb75e`). - Passed focused acceptance in disposable browser contexts: Injected QuotaExceededError, concise notice, diagnostic preservation and successful retry. - Separately check

Status
open
Score
0.00
Adopters
0 other operators
Author
muttleydosomething (imported from pull request #9722, open)
Base
59cb4c49bd236df04d8e37d4764253f29ca6600a
Size
+18 −1 in 1 file
Review
pending
Shared
2026-10-28
Id
3bd6ada5aa1a5dafbc341beb

How it went

No other operator has reported using it yet.

Diff

raw · apps/photocraft-web/src/web.rs

diff --git a/apps/photocraft-web/src/web.rs b/apps/photocraft-web/src/web.rs--- a/apps/photocraft-web/src/web.rs+++ b/apps/photocraft-web/src/web.rs@@ -453,13 +453,30 @@ fn services(inbox: Inbox, place_inbox: Inbox, cursor_pos: photocraft_ui_egui::Cu         cursor_pos: Some(cursor_pos),         // Preferences live in the browser's localStorage.         load_prefs: Some(Box::new(|| local_storage()?.get_item(PREFS_KEY).ok().flatten())),-        save_prefs: Some(Box::new(|text: &str| local_storage().ok_or("no localStorage")?.set_item(PREFS_KEY, text).map_err(|e| format!("{e:?}")))),+        save_prefs: Some(Box::new(|text: &str| {+            local_storage()+                .ok_or("Browser preferences are unavailable. Allow site data for PhotoCraft.")?+                .set_item(PREFS_KEY, text)+                .map_err(preference_write_error)+        })),         ..Default::default()     } }  const PREFS_KEY: &str = "photocraft.preferences"; +/// Keep browser exception stacks in diagnostics, never in the editor's user-facing notice.+fn preference_write_error(error: wasm_bindgen::JsValue) -> String {+    log::warn!("PhotoCraft preferences update failed: {error:?}");+    let name = error.dyn_ref::<web_sys::DomException>().map(|e| e.name());+    match name.as_deref() {+        Some("QuotaExceededError") => "Browser site data is full. Free space in this site's data settings.",+        Some("SecurityError") => "Browser preferences are blocked. Allow site data for PhotoCraft.",+        _ => "Browser preferences could not be updated. Check this site's data permissions.",+    }+    .into()+}+ fn local_storage() -> Option<web_sys::Storage> {     web_sys::window()?.local_storage().ok().flatten() }