feat: implement audio/video call functionality in chat

- Added a new schema for managing audio/video calls, including fields for call type, room name, and participant management.
- Enhanced ChatWindow component to support initiating audio and video calls with dynamic loading of the CallWindow component.
- Updated package dependencies to include 'lib-jitsi-meet' for call handling.
- Refactored existing code to accommodate new call features and improve user experience.
This commit is contained in:
2025-11-21 13:17:44 -03:00
parent bc1e08914b
commit 2792424454
15 changed files with 3986 additions and 3 deletions

View File

@@ -827,6 +827,44 @@ export default defineSchema({
.index("by_conversa_usuario", ["conversaId", "usuarioId"])
.index("by_usuario", ["usuarioId"]),
// Sistema de Chamadas de Áudio/Vídeo
chamadas: defineTable({
conversaId: v.id("conversas"),
tipo: v.union(v.literal("audio"), v.literal("video")),
roomName: v.string(), // Nome único da sala Jitsi
criadoPor: v.id("usuarios"), // Anfitrião/criador
participantes: v.array(v.id("usuarios")),
status: v.union(
v.literal("aguardando"),
v.literal("em_andamento"),
v.literal("finalizada"),
v.literal("cancelada")
),
iniciadaEm: v.optional(v.number()),
finalizadaEm: v.optional(v.number()),
duracaoSegundos: v.optional(v.number()),
gravando: v.boolean(),
gravacaoIniciadaPor: v.optional(v.id("usuarios")),
gravacaoIniciadaEm: v.optional(v.number()),
gravacaoFinalizadaEm: v.optional(v.number()),
configuracoes: v.optional(v.object({
audioHabilitado: v.boolean(),
videoHabilitado: v.boolean(),
participantesConfig: v.optional(v.array(v.object({
usuarioId: v.id("usuarios"),
audioHabilitado: v.boolean(),
videoHabilitado: v.boolean(),
forcadoPeloAnfitriao: v.optional(v.boolean()), // Se foi forçado pelo anfitrião
})))
})),
criadoEm: v.number(),
})
.index("by_conversa", ["conversaId", "status"])
.index("by_conversa_ativa", ["conversaId", "status"])
.index("by_criado_por", ["criadoPor"])
.index("by_status", ["status"])
.index("by_room_name", ["roomName"]),
notificacoes: defineTable({
usuarioId: v.id("usuarios"),
tipo: v.union(