MAI CALL - step 11

Passo 11 completo. Build limpo, AC verificado.

O que foi construído no admin-web (localhost:3001):

Infraestrutura completa a partir do zero: Tailwind, tRPC client/server, auth por autologin, env.ts, providers
/maintenance — cliente de polling com refetchInterval: 5000ms:
Header com contador de pedidos abertos + filtros por estado (checkboxes) e área (select)
Grid de cards com thumbnail (presigned GET), posto, descrição, reporter + tempo relativo, badge de status
OPEN → botão Aceitar (mutation claim)
CLAIMED → info "Aceite por X há Ym" + botão Marcar resolvido (dialog com nota opcional)
RESOLVED → badge verde + info "Resolvido por X há Ym"
Badge no document.title: (N) FieldOps — Manutenção
Toggle de notificação sonora via Web Audio API (beep ao detectar novo OPEN)
This commit is contained in:
2026-05-16 16:41:16 +01:00
parent 03c15fd069
commit 617c81357f
19 changed files with 735 additions and 152 deletions
+18
View File
@@ -0,0 +1,18 @@
import { prisma } from '@repo/db';
import type { SessionUser } from '@repo/api';
// v0.1 admin-web auth: AUTH_DEV_AUTOLOGIN=true → always admin@demo.local.
// No session/cookie mechanism needed for the demo phase.
export async function resolveUser(): Promise<SessionUser | null> {
if (process.env['AUTH_DEV_AUTOLOGIN'] !== 'true') return null;
const admin = await prisma.user.findFirst({ where: { email: 'admin@demo.local' } });
if (!admin) return null;
return {
id: admin.id,
email: admin.email,
role: admin.role as 'ADMIN',
tenantId: admin.tenantId,
};
}
+6
View File
@@ -0,0 +1,6 @@
'use client';
import { createTRPCReact } from '@trpc/react-query';
import type { AppRouter } from '@repo/api';
export const trpc = createTRPCReact<AppRouter>();
+19
View File
@@ -0,0 +1,19 @@
import 'server-only';
import { cache } from 'react';
import { headers } from 'next/headers';
import { appRouter, createCallerFactory, createTRPCContext, type AppRouter } from '@repo/api';
import type { inferRouterInputs, inferRouterOutputs } from '@trpc/server';
import { resolveUser } from '../auth';
const createContext = cache(async () => {
const user = await resolveUser();
const h = await headers();
return createTRPCContext({ user, headers: h });
});
const createCaller = createCallerFactory(appRouter);
export const api = createCaller(createContext);
export type RouterInputs = inferRouterInputs<AppRouter>;
export type RouterOutputs = inferRouterOutputs<AppRouter>;