Passo 12 completo. Build limpo, AC server-side totalmente verificado. O que foi implementado: lib/queue/ — camada de persistência offline: db.ts — Dexie 4 com tabelas pending e deadLetters broadcast.ts — BroadcastChannel helper (mai-call-sync) para comunicar entre tabs sync.ts — loop de sync com retry/backoff: signPhotoUpload → PUT MinIO → create; 409 = sucesso; 4xx = dead-letter; erros de rede = paragem + retry na próxima volta SyncProvider — React Context que: Arranca sync ao reconectar (online event + visibilitychange) Polling de 10s como fallback Regista Background Sync API quando disponível Expõe pendingCount / deadLetterCount via useSyncState() Formulário (/maintenance/new) — refatorado: ao submeter, escreve em IndexedDB e navega imediatamente para /sent sem esperar pelo servidor. O SyncProvider processa a fila em background. Feedback visual: SyncChip na home: "Tudo sincronizado" / "N pedidos por enviar" / erro dead-letter /maintenance/sent: mostra "Em fila" (Clock) ou "Enviado" (CheckCircle2) reactivamente via BroadcastChannel Workbox (@ducanh2912/next-pwa) — app shell precaching ativo, para que o app carregue mesmo sem rede depois da primeira visita.
49 lines
1.3 KiB
JSON
49 lines
1.3 KiB
JSON
{
|
|
"name": "@repo/operator-pwa",
|
|
"version": "0.0.0",
|
|
"private": true,
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "dotenv -e ../../.env -- next dev --port 3000",
|
|
"build": "dotenv -e ../../.env -- next build",
|
|
"start": "dotenv -e ../../.env -- next start --port 3000",
|
|
"lint": "next lint",
|
|
"typecheck": "tsc --noEmit",
|
|
"clean": "rimraf .next .turbo node_modules"
|
|
},
|
|
"dependencies": {
|
|
"@ducanh2912/next-pwa": "^10.2.9",
|
|
"@repo/api": "workspace:*",
|
|
"@repo/db": "workspace:*",
|
|
"@repo/domain": "workspace:*",
|
|
"@repo/ui": "workspace:*",
|
|
"dexie": "^4.0.10",
|
|
"@t3-oss/env-nextjs": "^0.11.1",
|
|
"@tanstack/react-query": "^5.62.10",
|
|
"@trpc/client": "^11.0.0",
|
|
"@trpc/react-query": "^11.0.0",
|
|
"@trpc/server": "^11.0.0",
|
|
"lucide-react": "^0.469.0",
|
|
"next": "15.3.9",
|
|
"next-auth": "5.0.0-beta.25",
|
|
"pino": "^9.5.0",
|
|
"pino-pretty": "^11.3.0",
|
|
"react": "^19.0.0",
|
|
"react-dom": "^19.0.0",
|
|
"superjson": "^2.2.2",
|
|
"zod": "^3.24.1"
|
|
},
|
|
"devDependencies": {
|
|
"@repo/config": "workspace:*",
|
|
"@types/node": "^22.10.2",
|
|
"@types/react": "^19.0.2",
|
|
"@types/react-dom": "^19.0.2",
|
|
"autoprefixer": "^10.4.20",
|
|
"dotenv-cli": "^8.0.0",
|
|
"postcss": "^8.4.49",
|
|
"rimraf": "^6.0.1",
|
|
"tailwindcss": "^3.4.17",
|
|
"typescript": "^5.7.2"
|
|
}
|
|
}
|