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.
This commit is contained in:
129
apps/web/src/lib/utils/erroHelpers.ts
Normal file
129
apps/web/src/lib/utils/erroHelpers.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
/**
|
||||
* 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
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user