Commit graph

10 commits

Author SHA1 Message Date
df951ff2ab fix: recover from expired Authentik session without clearing site data
Store Tracker is a PWA behind the shared Authentik forward-auth provider.
When the session expires (Android Chrome evicts the PWA cookie), the same-origin
/api XHR is 302'd cross-origin and CORS-blocked, the app showed only a generic
"backend connection" error, and the service worker served the cached shell for
any navigation — so re-auth was impossible without clearing all site data.

Fix:
- App swaps to a "Session expired" screen on an auth error (axios error with no
  response, or 401/403) while online. Its "Sign in" button unregisters the
  service worker + deletes all caches before navigating (programmatic "clear
  site data"), so the re-auth navigation reaches forward-auth -> Authentik.
- vite.config: navigateFallbackDenylist [/[?&]reauth=/] keeps the SW from
  serving the cached shell for the re-auth navigation.

Same bug class fixed in books (#19), speedracer, and vpn-stats.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018rXJ49eToZ6YFZzDYH8GXd
2026-06-27 09:10:09 -04:00
Maddox
9f901ec50d feat: store-level "Group bursts" toggle + idle-window field
Adds group_burst (0/1) + burst_window_sec to the Store type and the
StoreModal editor. Drives finbot's Amazon burst-grouping: when ON, finbot
collapses rapid same-merchant charge bursts into one Firefly transaction
group; the optional idle window (blank = 180s) closes the group.

Backend INSERT/UPDATE carry the fields; GET is SELECT * so reads are free.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 17:40:39 -04:00
Maddox
5fc745edd3 Fix stats bar counts — use /api/stats endpoint instead of page slice
Added /api/stats to backend (returns route counts + total, respects
same search/category/route filters as the main query). StatsBar now
shows accurate counts across all records, not just the current page.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-08 18:03:41 -04:00
Maddox
e97f620dff Add PWA support (vite-plugin-pwa)
Manifest with standalone display, dark theme color, 192/512 icons.
NetworkFirst workbox strategy for API routes. Dockerfile uses
--legacy-peer-deps for vite-plugin-pwa peer dep conflict with Vite 8.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 21:02:20 -04:00
Maddox
57cb35d565 Replace rolodex with animated expandable list for mobile
Each store is a compact row with a route-colored left accent bar.
Tap to bloom open — smooth height animation, route-colored background
glow and border highlight, tags/meta/actions revealed. Rows stagger
in on load/filter change. No swipe gestures needed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 20:35:50 -04:00
Maddox
623c3783b5 Switch rolodex to vertical swipe (avoids Pixel back gesture conflict)
Swipe up/down instead of left/right. rotateX drum effect instead of
rotateY. ChevronUp/Down buttons. No horizontal touch tracking.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 20:22:12 -04:00
Maddox
73a416d423 Add mobile rolodex swipe card view
Replaces the card list on mobile with a swipeable rolodex. Current card
is full-size, neighbors are visible at edges with 3D perspective scaling.
Touch swipe or arrow buttons to navigate. Dot indicators for small sets,
X/total counter for larger ones. Filters still work — rolodex resets via
key changes when the store list updates.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 20:14:51 -04:00
Maddox
1f760e0c65 Mobile always uses card view, table only on desktop
On mobile (< sm breakpoint) cards are always rendered regardless of the
view toggle. The toggle is already hidden on mobile — this makes the
rendering match.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 18:26:08 -04:00
Maddox
7152d6b492 Replace tag text input with autocomplete tag picker
TagInput component shows selected tags as removable chips, autocompletes
from existing tags in the database, and allows adding new tags inline.
Enter/comma to confirm, Backspace to remove last tag.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-07 18:20:47 -04:00
Maddox
69e0b864e4 Initial commit — Store Tracker v2 frontend
React 18 + Vite + TypeScript + Tailwind v4 + TanStack Query v5.
Dark glassmorphism design, table/grid views, color-coded route badges,
filter bar, stats bar, add/edit modal, delete confirm, toast notifications.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:40:08 -04:00