Resume the last garden on this device (#97) #108

Merged
steve merged 2 commits from feat/resume-last-garden into main 2026-07-22 04:54:33 +00:00
Showing only changes of commit d8003b11fb - Show all commits
+14 -6
View File
@@ -57,6 +57,14 @@ export function GardenEditorPage() {
const me = useMe()
usePageTitle(full.data?.garden.name ?? 'Garden')
// The garden itself is gone (deleted, or access revoked) — keyed on the LIVE
// query, since whether the garden EXISTS doesn't depend on the season being
// viewed. Both the bounce effect and the "gone" render message read this one
// value, so the promise ("taking you to your gardens…") and the redirect can't
// disagree — e.g. a season-view error while the live garden is fine must not
// claim a redirect that never fires.
const gardenGone = live.error instanceof ApiError && live.error.isNotFound
const selectedId = useEditorStore((s) => s.selectedId)
const select = useEditorStore((s) => s.select)
const selectedPlantingId = useEditorStore((s) => s.selectedPlantingId)
1
@@ -147,11 +155,11 @@ export function GardenEditorPage() {
// this one, so a bad direct link can't wipe a good resume target) and bounce to
// the list. Transient errors (500/network) fall through to the retryable screen.
useEffect(() => {
if (live.isError && live.error instanceof ApiError && live.error.isNotFound) {
if (gardenGone) {
forgetLastGarden(gid)
navigate({ to: '/gardens' })
}
}, [live.isError, live.error, gid, navigate])
}, [gardenGone, gid, navigate])
// If the focused object vanished — deleted, or a stale ?focus id on load — leave
// focus mode so the canvas isn't stuck dimmed with no way out.
@@ -277,13 +285,13 @@ export function GardenEditorPage() {
if (full.isPending) return <p className="p-6 text-sm text-muted">Loading garden</p>
if (full.isError) {
// A not-found is handled by the effect above (forget + bounce to the list);
// say so rather than flashing a dead-end error during the redirect.
const gone = full.error instanceof ApiError && full.error.isNotFound
// Only promise the bounce when the GARDEN is gone (the effect above keys on
// the same gardenGone). A season-view error while the live garden is fine is a
// different, non-redirecting failure and gets the generic message.
return (
<div className="p-6">
<Alert>
{gone
{gardenGone
? 'That garden is no longer available — taking you to your gardens…'
: 'Could not load this garden.'}
</Alert>