"use client" import { useMemo, useState } from "react" import Link from "next/link" import { useRouter } from "next/navigation" import { toast } from "sonner" import { Settings2, Share2, ShieldCheck, UserCog, UserPlus, Users2, Layers3, MessageSquareText } from "lucide-react" import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "@/components/ui/card" import { Separator } from "@/components/ui/separator" import { useAuth, signOut } from "@/lib/auth-client" import { DEFAULT_TENANT_ID } from "@/lib/constants" import type { LucideIcon } from "lucide-react" type RoleRequirement = "admin" | "staff" type SettingsAction = { title: string description: string href: string cta: string requiredRole?: RoleRequirement icon: LucideIcon } const ROLE_LABELS: Record = { admin: "Administrador", manager: "Gestor", agent: "Agente", collaborator: "Colaborador", customer: "Cliente", } const SETTINGS_ACTIONS: SettingsAction[] = [ { title: "Times & papéis", description: "Controle quem pode atuar nas filas e atribua permissões refinadas por equipe.", href: "/admin/teams", cta: "Gerenciar times", requiredRole: "admin", icon: Users2, }, { title: "Canais & roteamento", description: "Configure canais, horários de atendimento e regras automáticas de distribuição.", href: "/admin/channels", cta: "Abrir canais", requiredRole: "admin", icon: Share2, }, { title: "Campos e categorias", description: "Ajuste categorias, subcategorias e campos personalizados para qualificar tickets.", href: "/admin/fields", cta: "Editar estrutura", requiredRole: "admin", icon: Layers3, }, { title: "Convites e acessos", description: "Convide novos usuários, revise papéis e acompanhe quem tem acesso ao workspace.", href: "/admin", cta: "Abrir painel", requiredRole: "admin", icon: UserPlus, }, { title: "Templates de comentários", description: "Gerencie mensagens rápidas utilizadas nos atendimentos.", href: "/settings/templates", cta: "Abrir templates", requiredRole: "staff", icon: MessageSquareText, }, { title: "Preferências da equipe", description: "Defina padrões de notificação e comportamento do modo play para toda a equipe.", href: "#preferencias", cta: "Ajustar preferências", requiredRole: "staff", icon: Settings2, }, { title: "Políticas e segurança", description: "Acompanhe SLAs críticos, rastreie integrações e revise auditorias de acesso.", href: "/admin/slas", cta: "Revisar SLAs", requiredRole: "admin", icon: ShieldCheck, }, ] export function SettingsContent() { const { session, isAdmin, isStaff } = useAuth() const [isSigningOut, setIsSigningOut] = useState(false) const router = useRouter() const normalizedRole = session?.user.role?.toLowerCase() ?? "agent" const roleLabel = ROLE_LABELS[normalizedRole] ?? "Agente" const tenant = session?.user.tenantId ?? DEFAULT_TENANT_ID const sessionExpiry = useMemo(() => { const expiresAt = session?.session?.expiresAt if (!expiresAt) return null return new Intl.DateTimeFormat("pt-BR", { dateStyle: "long", timeStyle: "short", }).format(new Date(expiresAt)) }, [session?.session?.expiresAt]) async function handleSignOut() { if (isSigningOut) return setIsSigningOut(true) try { await signOut() toast.success("Sessão encerrada") router.replace("/login") } catch (error) { console.error(error) toast.error("Não foi possível encerrar a sessão.") } finally { setIsSigningOut(false) } } function canAccess(requiredRole?: RoleRequirement) { if (!requiredRole) return true if (requiredRole === "admin") return isAdmin if (requiredRole === "staff") return isStaff return false } return (
Perfil Dados sincronizados via Better Auth e utilizados para provisionamento no Convex.
Nome
{session?.user.name ?? "—"}
E-mail
{session?.user.email ?? "—"}
Tenant
{tenant}
Papel
{roleLabel}
Sessão ativa {session?.session?.id ? ( {session.session.id.slice(0, 8)}… ) : null}

{sessionExpiry ? `Expira em ${sessionExpiry}` : "Sessão em background com renovação automática."}

Alterações no perfil refletem instantaneamente no painel administrativo e nos relatórios.

Preferências rápidas Ajustes pessoais aplicados localmente para acelerar seu fluxo de trabalho.

Administração do workspace

Centralize a gestão de times, canais e políticas. Recursos marcados como restritos dependem de perfil administrador.

{SETTINGS_ACTIONS.map((action) => { const allowed = canAccess(action.requiredRole) const Icon = action.icon return (
{action.title} {action.description}
{!allowed ? Restrito : null}
{allowed ? ( ) : ( )}
) })}
) } type PreferenceItemProps = { title: string description: string } function PreferenceItem({ title, description }: PreferenceItemProps) { const [enabled, setEnabled] = useState(false) return (

{title}

{description}

) }