T-15 — Decompose usageDb.js (969→40 lines): - Extract src/lib/usage/migrations.js (legacy + JSON→SQLite migration) - Extract src/lib/usage/usageHistory.js (tracking, pending, log.txt) - Extract src/lib/usage/costCalculator.js (pure cost calculation) - Extract src/lib/usage/usageStats.js (dashboard aggregation) - Extract src/lib/usage/callLogs.js (structured logs, CRUD, rotation) - usageDb.js is now a thin facade re-exporting all functions T-28 — Decompose handleSingleModelChat (183→80 lines): - Extract handleNoCredentials() — credential error responses - Extract safeResolveProxy() — proxy resolution with error handling - Extract safeLogEvents() — fire-and-forget proxy + translation logging - Also created chatHelpers.js with standalone helper exports T-29 — Extract shared UI primitives (3230 total lines): - FilterBar.js — search input + filter chips dropdown - ColumnToggle.js — table column visibility toggle - DataTable.js — generic data table with sticky header, loading/empty Tests: 88/88 pass (no regressions)
6.9 KiB
FASE 07 — UX e Microinterações
Prioridade: 🟡 Moderado
Estimativa de Complexidade: Média (4–6 dias)
Dimensões do Relatório: D5 (Fluxos Ausentes), D6 (UX e Microinterações)
Dependências: FASE-05 (componentes decompostos facilitam adição de a11y e empty states)
Objetivo
Elevar a qualidade da experiência do usuário no dashboard com sistema de notificações global, acessibilidade, breadcrumbs, empty states, e fluxo de recuperação de senha.
Escopo Detalhado
7.1 — Sistema de Toasts/Notifications Global
Origem no relatório: D5 — Feedback de Ações Centralizado (🟡 Moderado)
Especificação Técnica
- Criar Zustand store
src/store/notificationStore.js:export const useNotificationStore = create((set) => ({ notifications: [], addNotification: (notification) => set((s) => ({ notifications: [...s.notifications, { id: Date.now(), ...notification }], })), removeNotification: (id) => set((s) => ({ notifications: s.notifications.filter((n) => n.id !== id), })), })); - Criar componente
src/shared/components/NotificationToast.js:- Tipos:
success,error,warning,info. - Auto-dismiss após 5s (configurável).
- Animação de entrada/saída (slide + fade).
- Posicionamento: top-right, stack vertical.
- Ação de dismiss manual (botão X).
- Tipos:
- Integrar no layout root do dashboard.
- Refatorar ≥ 5 call sites que usam feedback ad-hoc para usar o notification system.
Critérios de Aceite
- Toasts renderizam sobre o conteúdo sem afetar layout.
- Tipos visuais distintos (cores/ícones por tipo).
- Auto-dismiss funciona.
- ≥ 5 ações do dashboard usam o sistema centralizado.
7.2 — Auditoria de Acessibilidade (a11y)
Origem no relatório: D6 — Acessibilidade Insuficiente (🟡 Moderado)
Especificação Técnica
- Executar auditoria com
axe-coreoupa11y-ci:- Dashboard Home
- Providers page
- Settings page
- Login page
- Corrigir achados críticos:
- Adicionar
role="dialog"earia-modal="true"em todos os modais. - Implementar focus trap em
OAuthModal.jseProxyConfigModal.js. - Adicionar
aria-labelem botões com ícone sem texto. - Garantir contraste mínimo 4.5:1 (WCAG AA).
- Adicionar
- Adicionar hook
useFocusTrap.jsemsrc/shared/hooks/. - Integrar
axe-corecomo teste e2e de acessibilidade.
Critérios de Aceite
- Zero violações críticas de axe-core nas 4 páginas auditadas.
- Todos os modais com
role="dialog"e focus trap. - Navegação por teclado funciona em todas as páginas do dashboard.
- Teste e2e de a11y integrado no CI.
7.3 — Breadcrumbs no Dashboard
Origem no relatório: D6 — Breadcrumbs Ausentes (🟡 Moderado)
Especificação Técnica
- Criar componente
src/shared/components/Breadcrumbs.js:- Gerar breadcrumbs automaticamente a partir do pathname.
- Mapeamento de paths para labels amigáveis:
const PATH_LABELS = { dashboard: "Dashboard", providers: "Provedores", settings: "Configurações", usage: "Uso", combos: "Combos", tools: "Ferramentas", translator: "Tradutor", profile: "Perfil", }; - Links clicáveis para cada nível.
- Último item não clicável (página atual).
- Integrar no layout do dashboard (abaixo do header ou acima do conteúdo).
Critérios de Aceite
- Breadcrumbs renderizam em todas as páginas do dashboard.
- Cada nível é clicável (exceto o atual).
- Labels são amigáveis (não slugs).
- Responsividade: truncamento em telas pequenas.
7.4 — Empty States Guiados
Origem no relatório: D6 — Loading States e Empty States (🟡 Moderado)
Especificação Técnica
- Criar componente
src/shared/components/EmptyState.js:- Props:
icon,title,description,actionLabel,onAction. - Design: Ícone centrado, texto descritivo, CTA (call to action).
- Props:
- Implementar empty states nas seções:
- Providers — "Nenhum provider conectado. Conecte seu primeiro provider."
- Combos — "Nenhum combo criado. Crie um combo para agrupar modelos."
- Usage — "Nenhum uso registrado ainda. Faça sua primeira requisição."
- Request Logger — "Nenhum request logado. Ative logging nas configurações."
- Substituir listas vazias por empty states.
Critérios de Aceite
- Todas as 4 seções mostram empty states em vez de listas vazias.
- Empty states incluem CTA relevante.
- Design consistente com o tema do dashboard.
7.5 — Fluxo de Recuperação de Senha
Origem no relatório: D5 — Fluxo de Recuperação de Senha (🟡 Moderado)
Especificação Técnica
- Implementar reset de senha via CLI:
npx omniroute reset-password # Prompts for new password, updates DB directly - Criar endpoint
/api/auth/reset-passwordcom token temporário (opcional, para uso via link interno). - Documentar o processo de reset no README e na página de login como texto de ajuda.
Critérios de Aceite
- CLI permite resetar senha sem acesso ao dashboard.
- Processo documentado no README.
- Página de login mostra texto explicativo sobre recuperação.
7.6 — Teste de Responsividade
Origem no relatório: D6 — Responsividade (🟢 Menor)
Especificação Técnica
- Criar testes Playwright para viewport < 768px.
- Verificar páginas: Login, Dashboard, Providers, Settings.
- Corrigir overflow, truncamento, e usabilidade em mobile.
Critérios de Aceite
- Testes de responsividade passam em viewport 375px e 768px.
- Nenhum overflow horizontal em telas < 768px.
- Sidebar colapsável em mobile.
Pré-Requisitos
- FASE-05 (componentes decompostos são mais fáceis de auditar e modificar).
- Dashboard funcional para testes visuais.
Entregáveis
- Sistema de toasts com Zustand store.
- Auditoria a11y com correções.
- Componente Breadcrumbs.
- Empty states em 4 seções.
- Reset de senha via CLI.
- Testes de responsividade.
Critérios de Conclusão da Fase
- Sistema de toasts funcional e integrado.
- Zero violações críticas de a11y.
- Breadcrumbs operacionais.
- Empty states implementados.
Riscos Identificados
| Risco | Probabilidade | Impacto | Mitigação |
|---|---|---|---|
| Focus trap interfere com UX | Média | Médio | Testes manuais de cada modal |
| Breadcrumbs incorretos em rotas dinâmicas | Baixa | Baixo | Mapeamento explícito de todas as rotas |
| CLI de reset requer acesso ao servidor | Inevitável | Baixo | Documentar alternativas (acesso ao DB) |