472573a1a8
Terminal (PRD 5.3/5.5): - Opens with no network: a service worker caches the app shell and build assets, and the last confirmed session and product list are kept on the phone. Only a definitive 401/403 sends the cashier to the login page. - The offline queue is keyed by cashier and branch, sends only the signed-in cashier's sales, chunks to the server's batch limit, and acts on the per-sale result: synced, or rejected with the reason shown and never retried. Rows from the old queue are adopted on first sync. - Several products per sale (tap to add), optional customer details, and a printable receipt. The banner shows sales waiting to sync and any that need attention; sign-out warns about unsynced sales. - M-Pesa only appears when FEATURE_MPESA is on. A timed-out prompt now tells the cashier not to take cash until the payment is checked, instead of reporting it as failed. Admin: - New Stock page: stock per branch with low/out flags, physical counts and adjustments, inter-branch transfers, morning dispatch and evening count entry, and recent movements. - Dashboard shows stock on hand per branch and links to Stock. - Staff page can deactivate and reactivate accounts. - Products page is read-only for branch managers and edits the low-stock alert level. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
19 lines
572 B
TypeScript
19 lines
572 B
TypeScript
"use client";
|
|
|
|
import { useEffect } from "react";
|
|
|
|
/**
|
|
* Registers public/sw.js so the terminal can open offline. Production only:
|
|
* in `next dev` the build assets are not content-hashed, and caching them
|
|
* would serve stale code while developing.
|
|
*/
|
|
export default function ServiceWorkerRegister() {
|
|
useEffect(() => {
|
|
if (process.env.NODE_ENV !== "production" || !("serviceWorker" in navigator)) return;
|
|
navigator.serviceWorker.register("/sw.js").catch(() => {
|
|
// Unsupported or blocked: the app still works online.
|
|
});
|
|
}, []);
|
|
return null;
|
|
}
|