- 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.
130 lines
4.3 KiB
TypeScript
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
|
|
};
|
|
}
|
|
|