feat(pwa): offline network status indicator banner #137
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/offline-indicator-banner"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements Issue 47: non-intrusive offline status banner and chip (
offline-indicator-banner.tsx) mounted intop-command-bar.tsxthat surfaces when the field device disconnects from the internet and displays a cached coverage summary on click.Principles applied
principle-model-the-domain: ModeledCachedCoverageItemto describe cached PMTiles, SiPongi hotspots, TMAT hydrology stations, and GFS wind grids.principle-boundary-discipline: Handled browser network events (onlineandoffline) cleanly with optional controlled props and SSR guards.principle-subtract-before-you-add: Styled with existing Tailwind tokens and native browser APIs without external network-status or toast packages.principle-test-behavior-not-implementation: Verified observable markup, aria accessibility attributes, expanded summary popover, and custom cached items with literal assertions.principle-prove-it-works: Verified clean vp check, 58 passed test files (380 passed tests), and production Next.js build.Playbook
skill://poteto-mode/playbooks/feature.mdImpact
Closes #47
6-Axis Review: PR #137 (
feat/offline-indicator-banner)Executed Playbook:
skill://poteto-mode/playbooks/shipping.mdPrinciples Applied:
principle-model-the-domain: StructuredCachedCoverageItemdomain model capturing cached artifact identity, descriptive coverage status (cached | stale | syncing), and technical metadata chips (PMTiles Offline,Snapshot 24 Jam,124 Stasiun,Model GFS 10m).principle-boundary-discipline: Encapsulated browser-only event subscriptions (online/offline) inside ReactuseEffectlifecycle boundaries with proper listener removal; safe fallback for SSR.principle-subtract-before-you-add: Avoided external state management or toast libraries. Reused native Tailwind transitions, inline SVG icons, and semantic ARIA attributes.principle-test-behavior-not-implementation: Tested pure observable UI outcomes across online null rendering, offline chip visibility, popover toggling, ARIA attributes, and custom item rendering.principle-prove-it-works: Verified execution against Forgejo Actions CI run 222 (successful in 2m9s),vp checkclean across 337 files,tsc --noEmitclean, and all 58 test files passing (380 tests).Gate 1: Mechanical Verification Gate (
node scripts/verify-pr.mjs 137)feat(pwa): offline network status indicator banner(passes Conventional Commits and branch rules).8b8fcd54dfff05227c5a8a10ef138f628b035b5c.vp checkreports 0 warnings/errors across 168 files, 337 files formatted cleanly.tsc --noEmitexited 0 with 0 errors.Gate 2: Ponytail Audit (
skill://ponytail-review,skill://ponytail-audit)window.addEventListener("online" | "offline")).Gate 3: Doubt-Driven Analysis (
skill://doubt-driven-development)useStateinitial state guards againsttypeof navigator !== "undefined", preventing hydration mismatch errors.aria-label="Tutup ringkasan cache". Chip containsaria-expandedand descriptivearia-label.Gate 4: Security & Hardening (
skill://security-and-hardening)dangerouslySetInnerHTMLis not used).Gate 5: Code Quality & Simplification (
skill://code-review-and-quality,skill://code-simplification)window.addEventListener('offline')and surfaces status chip.TopCommandBar.ServiceWorkerRegisterand mounted insrc/app/layout.tsx.Gate 6: Poteto Shipping Protocol (
skill://poteto-mode/playbooks/shipping.md)mainat7f6b56f.main.Verdict: APPROVE