feat: PWA restores last project + playhead/stack on reopen
A homescreen launch opens the manifest start_url ("/") with no route, so the
deep state was lost. Persist the in-app URL (already kept current with stack +
playhead) to localStorage, and on a standalone cold launch with a bare hash,
re-enter it before the router reads the URL. Browser tabs are unaffected.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
b031a167a4
commit
7e32dc70dd
2 changed files with 20 additions and 1 deletions
|
|
@ -29,6 +29,7 @@
|
||||||
(defn init []
|
(defn init []
|
||||||
(re-frame/dispatch-sync [::events/initialize-db])
|
(re-frame/dispatch-sync [::events/initialize-db])
|
||||||
(re-frame/dispatch [::events/fetch-me])
|
(re-frame/dispatch [::events/fetch-me])
|
||||||
|
(routes/restore-last!) ; PWA: re-enter the last URL before the router reads it
|
||||||
(routes/start! route!)
|
(routes/start! route!)
|
||||||
(dev-setup)
|
(dev-setup)
|
||||||
(mount-root))
|
(mount-root))
|
||||||
|
|
|
||||||
|
|
@ -66,10 +66,28 @@
|
||||||
(str (href :project/show {:id id}) query)))
|
(str (href :project/show {:id id}) query)))
|
||||||
|
|
||||||
(defonce ^:private last-replaced (atom nil))
|
(defonce ^:private last-replaced (atom nil))
|
||||||
|
(def ^:private last-url-key "tl/last-url")
|
||||||
|
|
||||||
(defn replace-project-state! [{:keys [id stack playhead]}]
|
(defn replace-project-state! [{:keys [id stack playhead]}]
|
||||||
(when id
|
(when id
|
||||||
(let [url (project-url id stack playhead)]
|
(let [url (project-url id stack playhead)]
|
||||||
(when (not= url @last-replaced)
|
(when (not= url @last-replaced)
|
||||||
(reset! last-replaced url)
|
(reset! last-replaced url)
|
||||||
(.replaceState js/history nil "" url)))))
|
(.replaceState js/history nil "" url)
|
||||||
|
;; remember where we were so an installed PWA can come back here
|
||||||
|
(.setItem js/localStorage last-url-key url)))))
|
||||||
|
|
||||||
|
(defn- standalone?
|
||||||
|
"Running as an installed PWA (added to homescreen), not a browser tab."
|
||||||
|
[]
|
||||||
|
(or (some-> (.matchMedia js/window "(display-mode: standalone)") .-matches)
|
||||||
|
(true? (.-standalone js/navigator))))
|
||||||
|
|
||||||
|
(defn restore-last!
|
||||||
|
"A cold PWA launch opens the manifest start_url ('/') with no route, dropping
|
||||||
|
the last project + playhead/stack. If we booted bare in standalone mode and
|
||||||
|
have a saved location, put it in the hash before the router reads it."
|
||||||
|
[]
|
||||||
|
(when (and (standalone?) (contains? #{"" "#"} (.. js/window -location -hash)))
|
||||||
|
(when-let [saved (.getItem js/localStorage last-url-key)]
|
||||||
|
(set! (.. js/window -location -hash) saved))))
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue