feat: enhance chat functionality with new conversation and meeting room features

- Added support for creating and managing group conversations and meeting rooms, allowing users to initiate discussions with multiple participants.
- Implemented a modal for creating new conversations, including options for individual, group, and meeting room types.
- Enhanced the chat list component to filter and display conversations based on type, improving user navigation.
- Introduced admin functionalities for meeting rooms, enabling user management and role assignments within the chat interface.
- Updated backend schema and API to accommodate new conversation types and related operations, ensuring robust data handling.
This commit is contained in:
2025-11-05 07:20:37 -03:00
parent aa3e3470cd
commit 8ca737c62f
9 changed files with 1665 additions and 212 deletions

View File

@@ -16,6 +16,7 @@
const client = useConvexClient();
const mensagens = useQuery(api.chat.obterMensagens, { conversaId, limit: 50 });
const digitando = useQuery(api.chat.obterDigitando, { conversaId });
const isAdmin = useQuery(api.chat.verificarSeEhAdmin, { conversaId });
let messagesContainer: HTMLDivElement;
let shouldScrollToBottom = true;
@@ -199,18 +200,31 @@
novoConteudoEditado = "";
}
async function deletarMensagem(mensagemId: Id<"mensagens">) {
if (!confirm("Tem certeza que deseja deletar esta mensagem?")) {
async function deletarMensagem(mensagemId: Id<"mensagens">, isAdminDeleting: boolean = false) {
const mensagemTexto = isAdminDeleting
? "Tem certeza que deseja deletar esta mensagem como administrador? O remetente será notificado."
: "Tem certeza que deseja deletar esta mensagem?";
if (!confirm(mensagemTexto)) {
return;
}
try {
await client.mutation(api.chat.deletarMensagem, {
mensagemId,
});
} catch (error) {
if (isAdminDeleting) {
const resultado = await client.mutation(api.chat.deletarMensagemComoAdmin, {
mensagemId,
});
if (!resultado.sucesso) {
alert(resultado.erro || "Erro ao deletar mensagem");
}
} else {
await client.mutation(api.chat.deletarMensagem, {
mensagemId,
});
}
} catch (error: any) {
console.error("Erro ao deletar mensagem:", error);
alert("Erro ao deletar mensagem");
alert(error.message || "Erro ao deletar mensagem");
}
}
@@ -437,22 +451,34 @@
<p class="text-xs text-base-content/50">
{formatarDataMensagem(mensagem.enviadaEm)}
</p>
{#if isMinha && !mensagem.deletada && !mensagem.agendadaPara}
{#if !mensagem.deletada && !mensagem.agendadaPara}
<div class="flex gap-1">
<button
class="text-xs text-base-content/50 hover:text-primary transition-colors"
onclick={() => editarMensagem(mensagem)}
title="Editar mensagem"
>
✏️
</button>
<button
class="text-xs text-base-content/50 hover:text-error transition-colors"
onclick={() => deletarMensagem(mensagem._id)}
title="Deletar mensagem"
>
🗑️
</button>
{#if isMinha}
<!-- Ações para minhas próprias mensagens -->
<button
class="text-xs text-base-content/50 hover:text-primary transition-colors"
onclick={() => editarMensagem(mensagem)}
title="Editar mensagem"
>
✏️
</button>
<button
class="text-xs text-base-content/50 hover:text-error transition-colors"
onclick={() => deletarMensagem(mensagem._id, false)}
title="Deletar mensagem"
>
🗑️
</button>
{:else if isAdmin?.data}
<!-- Ações para admin deletar mensagens de outros -->
<button
class="text-xs text-base-content/50 hover:text-error transition-colors"
onclick={() => deletarMensagem(mensagem._id, true)}
title="Deletar mensagem (como administrador)"
>
🗑️ Admin
</button>
{/if}
</div>
{/if}
</div>