Correcao Sidebar Classico e Rail, Correcao Layout, Ajuste de Breakpoint para Tailwind, Ajuste AppTopbar, Ajuste Menu PopOver, Recriado Paleta de Cores, Inserido algumas animações leves, Reajuste Cor items NOVOS da tabela, Drawer Ajuda Corrigido no Logout, Whatsapp, sms, email, recursos extras

This commit is contained in:
Leonardo
2026-03-24 21:26:58 -03:00
parent a89d1f5560
commit 53a4980396
453 changed files with 121427 additions and 174407 deletions
+53 -68
View File
@@ -16,7 +16,7 @@
*/
// Serviço central de acesso ao Supabase para Global Notices
import { supabase } from '@/lib/supabase/client'
import { supabase } from '@/lib/supabase/client';
// ── Leitura ────────────────────────────────────────────────────
@@ -25,107 +25,92 @@ import { supabase } from '@/lib/supabase/client'
* A filtragem por role/context é feita no cliente (noticeStore)
* para evitar lógica de array no PostgREST.
*/
export async function fetchActiveNotices () {
const now = new Date().toISOString()
export async function fetchActiveNotices() {
const now = new Date().toISOString();
const { data, error } = await supabase
.from('global_notices')
.select('*')
.eq('is_active', true)
.or(`starts_at.is.null,starts_at.lte.${now}`)
.or(`ends_at.is.null,ends_at.gte.${now}`)
.order('priority', { ascending: false })
const { data, error } = await supabase.from('global_notices').select('*').eq('is_active', true).or(`starts_at.is.null,starts_at.lte.${now}`).or(`ends_at.is.null,ends_at.gte.${now}`).order('priority', { ascending: false });
if (error) throw error
return data || []
if (error) throw error;
return data || [];
}
/**
* Busca todos os notices (sem filtro de ativo) — para o painel admin.
*/
export async function fetchAllNotices () {
const { data, error } = await supabase
.from('global_notices')
.select('*')
.order('priority', { ascending: false })
.order('created_at', { ascending: false })
export async function fetchAllNotices() {
const { data, error } = await supabase.from('global_notices').select('*').order('priority', { ascending: false }).order('created_at', { ascending: false });
if (error) throw error
return data || []
if (error) throw error;
return data || [];
}
// ── Tracking ───────────────────────────────────────────────────
export async function trackView (noticeId) {
try {
await supabase.rpc('notice_track_view', { p_notice_id: noticeId })
} catch { /* silencioso — tracking não deve quebrar o app */ }
export async function trackView(noticeId) {
try {
await supabase.rpc('notice_track_view', { p_notice_id: noticeId });
} catch {
/* silencioso — tracking não deve quebrar o app */
}
}
export async function trackClick (noticeId) {
try {
await supabase.rpc('notice_track_click', { p_notice_id: noticeId })
} catch {}
export async function trackClick(noticeId) {
try {
await supabase.rpc('notice_track_click', { p_notice_id: noticeId });
} catch {}
}
// ── Dismiss scope: 'user' (persiste no banco) ─────────────────
export async function saveDismissal (noticeId, version) {
const { data: { user } } = await supabase.auth.getUser()
if (!user?.id) return
export async function saveDismissal(noticeId, version) {
const {
data: { user }
} = await supabase.auth.getUser();
if (!user?.id) return;
await supabase
.from('notice_dismissals')
.upsert({ notice_id: noticeId, user_id: user.id, version }, { onConflict: 'notice_id,user_id' })
await supabase.from('notice_dismissals').upsert({ notice_id: noticeId, user_id: user.id, version }, { onConflict: 'notice_id,user_id' });
}
export async function loadUserDismissals () {
const { data: { user } } = await supabase.auth.getUser()
if (!user?.id) return []
export async function loadUserDismissals() {
const {
data: { user }
} = await supabase.auth.getUser();
if (!user?.id) return [];
const { data } = await supabase
.from('notice_dismissals')
.select('notice_id, version')
.eq('user_id', user.id)
const { data } = await supabase.from('notice_dismissals').select('notice_id, version').eq('user_id', user.id);
return data || []
return data || [];
}
// ── Admin CRUD ─────────────────────────────────────────────────
export async function createNotice (payload) {
const { data: { user } } = await supabase.auth.getUser()
const { data, error } = await supabase
.from('global_notices')
.insert({ ...payload, created_by: user?.id })
.select()
.single()
export async function createNotice(payload) {
const {
data: { user }
} = await supabase.auth.getUser();
const { data, error } = await supabase
.from('global_notices')
.insert({ ...payload, created_by: user?.id })
.select()
.single();
if (error) throw error
return data
if (error) throw error;
return data;
}
export async function updateNotice (id, payload) {
const { data, error } = await supabase
.from('global_notices')
.update(payload)
.eq('id', id)
.select()
.single()
export async function updateNotice(id, payload) {
const { data, error } = await supabase.from('global_notices').update(payload).eq('id', id).select().single();
if (error) throw error
return data
if (error) throw error;
return data;
}
export async function deleteNotice (id) {
const { error } = await supabase
.from('global_notices')
.delete()
.eq('id', id)
export async function deleteNotice(id) {
const { error } = await supabase.from('global_notices').delete().eq('id', id);
if (error) throw error
if (error) throw error;
}
export async function toggleNoticeActive (id, isActive) {
return updateNotice(id, { is_active: isActive })
export async function toggleNoticeActive(id, isActive) {
return updateNotice(id, { is_active: isActive });
}