Files
sgse-app/apps/web/src/lib/utils/erroHelpers.ts
deyvisonwanderley 1f48247493 feat: enhance ErrorModal and ChatWindow error handling
- Added HelpCircle icon to ErrorModal for improved visual feedback.
- Implemented logic to differentiate between instructions and technical details in ErrorModal.
- Updated ChatWindow to utilize traduzirErro for user-friendly error messages during call initiation.
- Enhanced error handling to provide clearer instructions and details based on error types.
2025-11-21 17:11:40 -03:00

130 lines
4.3 KiB
TypeScript

/**
* 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
};
}