/** * Utilitários para tratar e traduzir erros técnicos em mensagens amigáveis ao usuário */ export interface MensagemErro { titulo: string; mensagem: string; instrucoes?: string; mostrarDetalhesTecnicos?: boolean; detalhesTecnicos?: string; } /** * Traduzir erros técnicos para mensagens amigáveis ao usuário */ export function traduzirErro(error: unknown): MensagemErro { if (!(error instanceof Error)) { return { titulo: 'Erro inesperado', mensagem: 'Ocorreu um erro inesperado. Por favor, tente novamente em alguns instantes.', instrucoes: 'Se o problema persistir, entre em contato com o suporte técnico.', detalhesTecnicos: String(error) }; } const mensagemErro = error.message.toLowerCase(); const erroCompleto = error.message; // Erro: Função do Convex não encontrada (servidor não sincronizado) if (mensagemErro.includes('could not find public function')) { return { titulo: 'Servidor em atualização', mensagem: 'O sistema está sendo atualizado no momento. Isso geralmente leva apenas alguns segundos.', instrucoes: 'Por favor, aguarde de 10 a 30 segundos e tente iniciar a chamada novamente. Se o problema persistir, recarregue a página (F5).', mostrarDetalhesTecnicos: false }; } // Erro: Não autenticado if (mensagemErro.includes('não autenticado') || mensagemErro.includes('não autenticado')) { return { titulo: 'Sessão expirada', mensagem: 'Sua sessão expirou. É necessário fazer login novamente para continuar.', instrucoes: 'Você será redirecionado para a tela de login em alguns instantes.', mostrarDetalhesTecnicos: false }; } // Erro: Permissão negada if ( mensagemErro.includes('permissão') || mensagemErro.includes('não tem permissão') || mensagemErro.includes('não participa') ) { return { titulo: 'Acesso negado', mensagem: 'Você não tem permissão para realizar esta ação.', instrucoes: 'Verifique se você faz parte desta conversa ou se possui as permissões necessárias.', mostrarDetalhesTecnicos: false }; } // Erro: Recurso já existe if ( mensagemErro.includes('já existe') || mensagemErro.includes('já está') || mensagemErro.includes('ativo') ) { return { titulo: 'Ação não disponível', mensagem: erroCompleto, instrucoes: 'Verifique o status atual e tente novamente.', mostrarDetalhesTecnicos: false }; } // Erro: Conexão if ( mensagemErro.includes('connection') || mensagemErro.includes('network') || mensagemErro.includes('conexão') || mensagemErro.includes('timeout') ) { return { titulo: 'Problema de conexão', mensagem: 'Não foi possível conectar com o servidor. Verifique sua conexão com a internet.', instrucoes: 'Verifique se você está conectado à internet e tente novamente. Se o problema persistir, recarregue a página (F5).', mostrarDetalhesTecnicos: false }; } // Erro: Não encontrado if (mensagemErro.includes('não encontrado') || mensagemErro.includes('not found')) { return { titulo: 'Recurso não encontrado', mensagem: 'O item que você está tentando acessar não foi encontrado.', instrucoes: 'Verifique se o item ainda existe ou se foi removido. Recarregue a página (F5) para atualizar a lista.', mostrarDetalhesTecnicos: false }; } // Erro genérico com mensagem do sistema if (erroCompleto && erroCompleto.length < 200) { // Se a mensagem for curta e compreensível, usá-la diretamente const mensagemLimpa = erroCompleto .replace(/\[.*?\]/g, '') // Remove tags como [CONVEX M(...)] .replace(/Request ID:.*/i, '') // Remove Request IDs .trim(); if (mensagemLimpa.length > 0) { return { titulo: 'Erro ao processar ação', mensagem: mensagemLimpa, instrucoes: 'Por favor, tente novamente. Se o problema persistir, recarregue a página (F5) ou entre em contato com o suporte.', mostrarDetalhesTecnicos: false }; } } // Erro genérico desconhecido return { titulo: 'Erro ao processar ação', mensagem: 'Ocorreu um erro ao processar sua solicitação. Por favor, tente novamente.', instrucoes: 'Se o problema persistir:\n1. Recarregue a página (pressione F5)\n2. Aguarde alguns instantes e tente novamente\n3. Entre em contato com o suporte técnico se o erro continuar', mostrarDetalhesTecnicos: true, detalhesTecnicos: erroCompleto }; }