feat: add error handling modal to ChatWindow and improve call initiation logic
- Introduced ErrorModal in ChatWindow to display error messages related to call initiation issues. - Enhanced error handling during call initiation to provide user-friendly feedback based on different error scenarios. - Refactored backend queries to streamline the retrieval of active calls, ensuring accurate status checks. - Updated function names for clarity and consistency in the backend call management logic.
This commit is contained in:
@@ -27,9 +27,9 @@ function gerarRoomName(conversaId: Id<'conversas'>, tipo: 'audio' | 'video'): st
|
||||
}
|
||||
|
||||
/**
|
||||
* Verificar se usuário é anfitrião da chamada
|
||||
* Verificar se usuário é anfitrião da chamada (helper interno)
|
||||
*/
|
||||
async function verificarAnfitriao(
|
||||
async function verificarSeEhAnfitriao(
|
||||
ctx: QueryCtx | MutationCtx,
|
||||
chamadaId: Id<'chamadas'>,
|
||||
usuarioId: Id<'usuarios'>
|
||||
@@ -77,18 +77,20 @@ export const criarChamada = mutation({
|
||||
// Verificar se já existe chamada ativa
|
||||
const chamadasAtivas = await ctx.db
|
||||
.query('chamadas')
|
||||
.withIndex('by_conversa_ativa', (q) => q.eq('conversaId', args.conversaId))
|
||||
.filter((q) =>
|
||||
q.or(
|
||||
q.eq(q.field('status'), 'aguardando'),
|
||||
q.eq(q.field('status'), 'em_andamento')
|
||||
)
|
||||
)
|
||||
.withIndex('by_conversa', (q) => q.eq('conversaId', args.conversaId).eq('status', 'aguardando'))
|
||||
.collect();
|
||||
|
||||
// Também verificar chamadas em andamento
|
||||
const chamadasEmAndamento = await ctx.db
|
||||
.query('chamadas')
|
||||
.withIndex('by_conversa', (q) => q.eq('conversaId', args.conversaId).eq('status', 'em_andamento'))
|
||||
.collect();
|
||||
|
||||
const todasAtivas = [...chamadasAtivas, ...chamadasEmAndamento];
|
||||
|
||||
if (chamadasAtivas.length > 0) {
|
||||
if (todasAtivas.length > 0) {
|
||||
// Retornar chamada ativa existente
|
||||
return chamadasAtivas[0]._id;
|
||||
return todasAtivas[0]._id;
|
||||
}
|
||||
|
||||
// Obter participantes da conversa
|
||||
@@ -218,7 +220,7 @@ export const cancelarChamada = mutation({
|
||||
if (!chamada) throw new Error('Chamada não encontrada');
|
||||
|
||||
// Apenas anfitrião pode cancelar
|
||||
const ehAnfitriao = await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehAnfitriao = await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
if (!ehAnfitriao) {
|
||||
throw new Error('Apenas o anfitrião pode cancelar a chamada');
|
||||
}
|
||||
@@ -307,7 +309,7 @@ export const removerParticipante = mutation({
|
||||
if (!chamada) throw new Error('Chamada não encontrada');
|
||||
|
||||
// Apenas anfitrião pode remover participantes
|
||||
const ehAnfitriao = await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehAnfitriao = await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
if (!ehAnfitriao) {
|
||||
throw new Error('Apenas o anfitrião pode remover participantes');
|
||||
}
|
||||
@@ -357,7 +359,7 @@ export const toggleAudioVideoParticipante = mutation({
|
||||
if (!chamada) throw new Error('Chamada não encontrada');
|
||||
|
||||
// Apenas anfitrião pode controlar outros participantes
|
||||
const ehAnfitriao = await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehAnfitriao = await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehOProprioParticipante = args.participanteId === usuarioAtual._id;
|
||||
|
||||
if (!ehAnfitriao && !ehOProprioParticipante) {
|
||||
@@ -417,7 +419,7 @@ export const iniciarGravacao = mutation({
|
||||
if (!chamada) throw new Error('Chamada não encontrada');
|
||||
|
||||
// Apenas anfitrião pode iniciar gravação
|
||||
const ehAnfitriao = await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehAnfitriao = await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
if (!ehAnfitriao) {
|
||||
throw new Error('Apenas o anfitrião pode iniciar a gravação');
|
||||
}
|
||||
@@ -453,7 +455,7 @@ export const finalizarGravacao = mutation({
|
||||
if (!chamada) throw new Error('Chamada não encontrada');
|
||||
|
||||
// Apenas anfitrião pode finalizar gravação
|
||||
const ehAnfitriao = await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
const ehAnfitriao = await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
if (!ehAnfitriao) {
|
||||
throw new Error('Apenas o anfitrião pode finalizar a gravação');
|
||||
}
|
||||
@@ -491,23 +493,24 @@ export const obterChamadaAtiva = query({
|
||||
if (!participa) return null;
|
||||
|
||||
// Buscar chamada ativa
|
||||
const chamadasAtivas = await ctx.db
|
||||
const chamadasAguardando = await ctx.db
|
||||
.query('chamadas')
|
||||
.withIndex('by_conversa_ativa', (q) => q.eq('conversaId', args.conversaId))
|
||||
.filter((q) =>
|
||||
q.or(
|
||||
q.eq(q.field('status'), 'aguardando'),
|
||||
q.eq(q.field('status'), 'em_andamento')
|
||||
)
|
||||
)
|
||||
.withIndex('by_conversa', (q) => q.eq('conversaId', args.conversaId).eq('status', 'aguardando'))
|
||||
.collect();
|
||||
|
||||
const chamadasEmAndamento = await ctx.db
|
||||
.query('chamadas')
|
||||
.withIndex('by_conversa', (q) => q.eq('conversaId', args.conversaId).eq('status', 'em_andamento'))
|
||||
.collect();
|
||||
|
||||
if (chamadasAtivas.length === 0) {
|
||||
const todasAtivas = [...chamadasAguardando, ...chamadasEmAndamento];
|
||||
|
||||
if (todasAtivas.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Retornar a chamada mais recente
|
||||
return chamadasAtivas.sort((a, b) => (b.criadoEm || 0) - (a.criadoEm || 0))[0];
|
||||
return todasAtivas.sort((a, b) => (b.criadoEm || 0) - (a.criadoEm || 0))[0];
|
||||
}
|
||||
});
|
||||
|
||||
@@ -549,7 +552,7 @@ export const verificarAnfitriao = query({
|
||||
const usuarioAtual = await getUsuarioAutenticado(ctx);
|
||||
if (!usuarioAtual) return false;
|
||||
|
||||
return await verificarAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
return await verificarSeEhAnfitriao(ctx, args.chamadaId, usuarioAtual._id);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user