FR-6.1/6.2: Sandra recebe push quando pedido entra em pending_approval; Rafael recebe quando pedido é aprovado ou recusado. Service worker registrado em background (PWA-ready via public/sw.js). FR-6.3: Badge na Topbar busca GET /notifications/pending-count (supervisores veem count de pending_approval; reps veem 0). Intervalo de 30s. FR-6.4: Botão Compartilhar no OrderDetailPage para pedidos approved/invoiced (apenas reps). Usa navigator.share() com texto formatado para WhatsApp. Infra: modelo PushSubscription (Prisma), NotificationsModule (subscribe/ unsubscribe/pending-count + PushService VAPID), VAPID keys em .env, integração no OrdersService (create → supervisores, approve/reject → repId). Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
18 lines
494 B
TypeScript
18 lines
494 B
TypeScript
import { z } from 'zod';
|
|
|
|
// Contratos canônicos de C6 — Notificações e Push.
|
|
|
|
export const SubscribePayloadSchema = z.object({
|
|
endpoint: z.string().url(),
|
|
keys: z.object({
|
|
p256dh: z.string().min(1),
|
|
auth: z.string().min(1),
|
|
}),
|
|
});
|
|
export type SubscribePayload = z.infer<typeof SubscribePayloadSchema>;
|
|
|
|
export const PendingCountResponseSchema = z.object({
|
|
count: z.number().int().min(0),
|
|
});
|
|
export type PendingCountResponse = z.infer<typeof PendingCountResponseSchema>;
|