diff --git a/apps/web/src/cockpits/rep/NewOrderPage.tsx b/apps/web/src/cockpits/rep/NewOrderPage.tsx index 6e58bb3..1366ba9 100644 --- a/apps/web/src/cockpits/rep/NewOrderPage.tsx +++ b/apps/web/src/cockpits/rep/NewOrderPage.tsx @@ -49,6 +49,7 @@ import { useCondicoesComerciais } from '../../lib/condicoes-comerciais'; import { CondicaoTag } from '../../components/CondicaoTag'; import { apiFetch } from '../../lib/api-client'; import { enqueueOrder } from '../../lib/offline/order-queue'; +import { randomUUID } from '../../lib/uuid'; const { Title, Text } = Typography; const { useBreakpoint } = Grid; @@ -1418,7 +1419,7 @@ export function NewOrderPage() { descontoPerc: 0, obs: obsCompleta || undefined, endEntrega: endEntregaValue, - idempotencyKey: crypto.randomUUID(), + idempotencyKey: randomUUID(), itens: cart.map((it, idx) => ({ idProduto: it.idProduto, codProduto: it.codProduto, diff --git a/apps/web/src/lib/offline/order-queue.ts b/apps/web/src/lib/offline/order-queue.ts index d04531f..cbd12b7 100644 --- a/apps/web/src/lib/offline/order-queue.ts +++ b/apps/web/src/lib/offline/order-queue.ts @@ -5,6 +5,7 @@ import type { CreatePedido } from '@sar/api-interface'; import { idbGetAll, idbPut, idbDelete, STORE_PENDING_ORDERS } from './idb'; +import { randomUUID } from '../uuid'; export interface PendingOrder { idempotencyKey: string; // keyPath do IndexedDB @@ -23,7 +24,7 @@ export async function enqueueOrder( payload: CreatePedido, clienteNome: string, ): Promise { - const key = payload.idempotencyKey ?? crypto.randomUUID(); + const key = payload.idempotencyKey ?? randomUUID(); const order: PendingOrder = { idempotencyKey: key, payload: { ...payload, idempotencyKey: key }, diff --git a/apps/web/src/lib/uuid.ts b/apps/web/src/lib/uuid.ts new file mode 100644 index 0000000..86e63a2 --- /dev/null +++ b/apps/web/src/lib/uuid.ts @@ -0,0 +1,12 @@ +// crypto.randomUUID só existe em contexto seguro (HTTPS/localhost). Acessando o +// dev server pelo IP da rede (http://192.168...) ela é undefined — fallback gera +// UUID v4 com crypto.getRandomValues, disponível em qualquer contexto. +export function randomUUID(): string { + if (typeof crypto.randomUUID === 'function') return crypto.randomUUID(); + + const bytes = crypto.getRandomValues(new Uint8Array(16)); + bytes[6] = (bytes[6] & 0x0f) | 0x40; // versão 4 + bytes[8] = (bytes[8] & 0x3f) | 0x80; // variante RFC 4122 + const hex = [...bytes].map((b) => b.toString(16).padStart(2, '0')).join(''); + return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`; +}