Merge remote-tracking branch 'origin' into feat-pedidos

This commit is contained in:
2025-12-11 10:08:12 -03:00
194 changed files with 30374 additions and 10247 deletions

View File

@@ -142,7 +142,7 @@ class AuthStore {
role: this.state.usuario?.role || {
_id: '',
nome: 'Usuário',
nivel: 999
admin: true
},
primeiroAcesso: this.state.usuario?.primeiroAcesso ?? false
};

View File

@@ -1,5 +1,5 @@
import type { Doc, Id } from '@sgse-app/backend/convex/_generated/dataModel';
import { writable } from 'svelte/store';
import type { Doc, Id } from '@sgse-app/backend/convex/_generated/dataModel';
export type TicketDetalhe = {
ticket: Doc<'tickets'>;

View File

@@ -1,5 +1,5 @@
import type { Id } from '@sgse-app/backend/convex/_generated/dataModel';
import { derived, writable } from 'svelte/store';
import { writable } from 'svelte/store';
// Store para a conversa ativa
export const conversaAtiva = writable<Id<'conversas'> | null>(null);
@@ -11,6 +11,14 @@ export const chatMinimizado = writable<boolean>(false);
// Store para o contador de notificações
export const notificacoesCount = writable<number>(0);
// Store para coordenar notificações entre componentes (evitar duplicação)
// Quando uma notificação é mostrada em um componente, os outros devem ignorar
export const notificacaoAtiva = writable<{
conversaId: string;
mensagemId: string;
componente: 'widget' | 'messageList';
} | null>(null);
// Funções auxiliares
export function abrirChat() {
chatAberto.set(true);
@@ -39,3 +47,37 @@ export function abrirConversa(conversaId: Id<'conversas'>) {
export function voltarParaLista() {
conversaAtiva.set(null);
}
// ========== CRIPTOGRAFIA E2E ==========
// Store para chaves de criptografia por conversa
// Mapeia conversaId -> CryptoKey
const chavesCriptografia = new Map<string, CryptoKey>();
/**
* Armazena uma chave de criptografia para uma conversa
*/
export function armazenarChaveCriptografia(conversaId: string, key: CryptoKey): void {
chavesCriptografia.set(conversaId, key);
}
/**
* Obtém uma chave de criptografia para uma conversa
*/
export function obterChaveCriptografia(conversaId: string): CryptoKey | null {
return chavesCriptografia.get(conversaId) || null;
}
/**
* Remove uma chave de criptografia de uma conversa
*/
export function removerChaveCriptografia(conversaId: string): void {
chavesCriptografia.delete(conversaId);
}
/**
* Verifica se uma conversa tem chave de criptografia
*/
export function temChaveCriptografia(conversaId: string): boolean {
return chavesCriptografia.has(conversaId);
}

View File

@@ -5,9 +5,8 @@
* todos os clientes Convex sejam atualizados automaticamente.
*/
import { browser } from '$app/environment';
import { PUBLIC_CONVEX_URL } from '$env/static/public';
import { authStore } from './auth.svelte';
import { browser } from '$app/environment';
const convexClients = new Set<any>();