import { useEffect, useMemo, useState } from 'react';
import { DataPanel } from '../components/DataPanel';
import { ManagementLayout } from '../components/ManagementLayout';
import { ManagementTable } from '../components/ManagementTable';
import { MetricGrid } from '../components/MetricGrid';
import { OperationalDashboard } from '../components/OperationalDashboard';
import { TemplateManagementPanel } from '../components/TemplateManagementPanel';
import { KnowledgeBasePanel } from '../components/KnowledgeBasePanel';
import { MassMessagePanel } from '../components/MassMessagePanel';
import { NewAttendancePage } from '../../attendance/pages/NewAttendancePage';
import { AttendantOpsPanel } from '../../home/components/AttendantOpsPanel';
import { MessagesWorkspace } from '../../home/components/MessagesWorkspace';
import { useChat } from '../../chat/hooks/useChat';
import {
createAccessArea,
createAiContent,
deleteAccessArea,
deleteAiContent,
getAccessAreas,
getAccessOptions,
getAccessUsers,
getAdminOverview,
getAiContents,
getAttendantRanking,
getAuditLogs,
updateAccessArea,
updateUserAccess,
} from '../services/adminAccessService';
import { useViewport } from '../../../shared/hooks/useViewport';
import { getCurrentUserDisplay } from '../../auth/services/sessionService';
const selectStyle = {
width: '100%',
border: '1px solid var(--color-border)',
borderRadius: '14px',
padding: '0.75rem 0.85rem',
background: '#fff',
color: 'var(--color-text)',
fontWeight: 600,
};
const compactSelectStyle = {
...selectStyle,
borderRadius: '10px',
padding: '0.45rem 0.55rem',
fontSize: '0.82rem',
};
const dailyAttendance = [28, 34, 42, 39, 51, 47, 58, 62, 55, 69, 73, 66, 71, 88, 79, 84, 91, 86, 94, 101, 97, 108, 112, 104, 118, 123, 116, 129, 134, 141];
const channelDistribution = [
{ label: 'WhatsApp', value: 982, color: '#2bb741' },
{ label: 'Email', value: 184, color: '#e5a22a' },
{ label: 'SMS', value: 118, color: '#00a4b7' },
];
const initialNotices = [
{ id: 'n1', text: 'Revisar atendimentos financeiros com SLA abaixo de 15 minutos.' },
{ id: 'n2', text: 'Templates de abertura ativa atualizados para WhatsApp.' },
];
const integrationCards = [
{
id: 'whatsapp',
group: 'Canal',
name: 'WhatsApp',
icon: 'WA',
color: '#20a45b',
description: 'Canal principal para atendimento, abertura ativa e continuidade das conversas no chat.',
},
{
id: 'sms',
group: 'Canal',
name: 'SMS',
icon: 'SM',
color: '#00a4b7',
description: 'Envio de comunicados curtos, confirmações e mensagens transacionais para contatos sem WhatsApp.',
},
{
id: 'email',
group: 'Canal',
name: 'Email',
icon: 'EM',
color: '#d8891c',
description: 'Recebimento e resposta de demandas por email dentro da fila omnichannel.',
},
{
id: 'sharepoint',
group: 'Integração',
name: 'SharePoint',
icon: 'SP',
color: '#036c70',
description: 'Permite que a IA visualize documentos autorizados para alimentar e manter a base de conhecimento.',
},
{
id: 'gupy',
group: 'Integração',
name: 'Gupy',
icon: 'GP',
color: '#7b4cc2',
description: 'Conecta vagas abertas e processos dos candidatos para enriquecer a base de conhecimento.',
},
];
function formatMinutes(minutes) {
if (minutes === null || minutes === undefined || Number.isNaN(Number(minutes))) return 'Sem dados';
return `${Number(minutes)} min`;
}
function toHomeConversation(contact, messages = []) {
return {
id: contact.id,
name: contact.name,
channel: contact.channel || 'WhatsApp',
status: contact.status || 'online',
lastMessage: contact.preview || messages[messages.length - 1]?.text || '',
unread: contact.unread || 0,
time: contact.time || 'Agora',
lastSeen: contact.lastSeen,
messages: messages.map((message) => ({
id: message.id,
from: message.sender === 'agent' ? 'agent' : 'customer',
text: message.text || (message.hasMedia ? '[Mídia]' : ''),
timestamp: message.timestamp,
})),
};
}
export function AdminAttendanceWorkspace({ isWideDesktop, isDesktop, isTablet, isMobile }) {
const {
contacts,
activeContactId,
setActiveContactId,
messages,
sendMessage,
isLoadingChats,
} = useChat();
const conversations = contacts.map((contact) =>
toHomeConversation(contact, contact.id === activeContactId ? messages : []),
);
const safeConversationId =
conversations.find((conversation) => conversation.id === activeContactId)?.id ||
conversations[0]?.id;
return (
{isLoadingChats ? (
Atualizando conversas do WhatsApp...
) : null}
{
setActiveContactId(conversationId);
await sendMessage(reply, conversationId);
}}
isWideDesktop={isWideDesktop}
isDesktop={isDesktop}
isTablet={isTablet}
isMobile={isMobile}
/>
);
}
export function AdminPage() {
const { isWideDesktop, isDesktop, isTablet, isMobile } = useViewport();
const userDisplay = getCurrentUserDisplay();
const [activeAdminSection, setActiveAdminSection] = useState('home');
const [selectedAreaFilter, setSelectedAreaFilter] = useState('all');
const [overview, setOverview] = useState(null);
const [notices, setNotices] = useState(initialNotices);
const [noticeDraft, setNoticeDraft] = useState('');
const [users, setUsers] = useState([]);
const [profiles, setProfiles] = useState([]);
const [areas, setAreas] = useState([]);
const [areaRowsState, setAreaRowsState] = useState([]);
const [attendantRankingRows, setAttendantRankingRows] = useState([]);
const [auditData, setAuditData] = useState({ page: 1, limit: 100, total: 0, items: [] });
const [aiContents, setAiContents] = useState([]);
const [aiContentForm, setAiContentForm] = useState({ title: '', areaId: '', notes: '', file: null });
const [userSearch, setUserSearch] = useState('');
const [newAreaName, setNewAreaName] = useState('');
const [isLoadingAccess, setIsLoadingAccess] = useState(true);
const [accessError, setAccessError] = useState('');
const [editingUser, setEditingUser] = useState(null);
const [editingArea, setEditingArea] = useState(null);
const [editAreaName, setEditAreaName] = useState('');
const [editAreaDescription, setEditAreaDescription] = useState('');
const [editUserProfileId, setEditUserProfileId] = useState('');
const [editUserSpecialties, setEditUserSpecialties] = useState([]);
const [specialtyToAdd, setSpecialtyToAdd] = useState('');
const [integrationStates, setIntegrationStates] = useState({
whatsapp: true,
sms: false,
email: false,
sharepoint: false,
gupy: false,
});
useEffect(() => {
let isMounted = true;
async function loadAccessData() {
try {
const [options, accessUsers, accessAreas, adminOverview, ranking, audit, contents] = await Promise.all([
getAccessOptions(),
getAccessUsers(),
getAccessAreas(),
getAdminOverview(),
getAttendantRanking(),
getAuditLogs(1, 100),
getAiContents(),
]);
if (!isMounted) {
return;
}
setProfiles(options.profiles || []);
setAreas(options.areas || []);
setUsers(accessUsers || []);
setAreaRowsState(accessAreas || []);
setOverview(adminOverview || null);
setAttendantRankingRows(Array.isArray(ranking) ? ranking : []);
setAuditData(audit || { page: 1, limit: 100, total: 0, items: [] });
setAiContents(Array.isArray(contents) ? contents : []);
setAccessError('');
} catch {
if (isMounted) {
setAccessError('Backend indisponível. Verifique a conexão para carregar os dados administrativos.');
}
} finally {
if (isMounted) {
setIsLoadingAccess(false);
}
}
}
loadAccessData();
return () => {
isMounted = false;
};
}, []);
useEffect(() => {
let isMounted = true;
const area = areas.find((item) => item.nome === selectedAreaFilter);
getAttendantRanking(selectedAreaFilter === 'all' ? null : area?.id)
.then((ranking) => {
if (isMounted) setAttendantRankingRows(Array.isArray(ranking) ? ranking : []);
})
.catch(() => undefined);
return () => {
isMounted = false;
};
}, [selectedAreaFilter, areas]);
function openUserEditor(user) {
setEditingUser(user);
setEditUserProfileId(user.perfilPrincipal?.id ? String(user.perfilPrincipal.id) : '');
setEditUserSpecialties(Array.isArray(user.areas) ? user.areas : []);
setSpecialtyToAdd('');
}
function closeUserEditor() {
setEditingUser(null);
setEditUserProfileId('');
setEditUserSpecialties([]);
setSpecialtyToAdd('');
}
function getProfileName(profileId) {
return profiles.find((profile) => profile.id === Number(profileId))?.nome || '';
}
async function saveUserAccess(user, nextProfileId, nextSpecialties) {
try {
const updatedUser = await updateUserAccess(user.id, {
perfilIds: nextProfileId ? [Number(nextProfileId)] : [],
especialidades: nextSpecialties.map((specialty, index) => ({
areaId: Number(specialty.id),
funcao: specialty.funcao || 'Agente',
principal: index === 0,
ativo: true,
})),
});
if (updatedUser) {
setUsers((current) =>
current.map((item) => (item.id === updatedUser.id ? updatedUser : item)),
);
}
setAccessError('');
await refreshAreas();
} catch {
setAccessError('Não foi possível salvar a atribuição. Confira o backend.');
}
}
function handleEditProfileChange(value) {
setEditUserProfileId(value);
if (getProfileName(value) === 'Admin') {
setEditUserSpecialties([]);
setSpecialtyToAdd('');
}
}
function addSpecialtyToEdit() {
const area = areas.find((item) => item.id === Number(specialtyToAdd));
if (!area) return;
setEditUserSpecialties((current) => {
if (current.some((specialty) => specialty.id === area.id)) return current;
return [
...current,
{ id: area.id, nome: area.nome, funcao: 'Agente', principal: current.length === 0 },
];
});
setSpecialtyToAdd('');
}
function removeSpecialtyFromEdit(areaId) {
setEditUserSpecialties((current) => current.filter((specialty) => specialty.id !== areaId));
}
function updateEditSpecialtyRole(areaId, role) {
setEditUserSpecialties((current) =>
current.map((specialty) =>
specialty.id === areaId ? { ...specialty, funcao: role } : specialty,
),
);
}
async function submitUserEditor() {
if (!editingUser) return;
const isAdmin = getProfileName(editUserProfileId) === 'Admin';
await saveUserAccess(editingUser, editUserProfileId, isAdmin ? [] : editUserSpecialties);
closeUserEditor();
}
async function refreshAreas() {
const [accessAreas, options] = await Promise.all([getAccessAreas(), getAccessOptions()]);
setAreaRowsState(accessAreas || []);
setAreas(options.areas || []);
}
async function handleCreateArea() {
const nome = newAreaName.trim();
if (!nome) return;
try {
await createAccessArea({
nome,
});
setNewAreaName('');
await refreshAreas();
setAccessError('');
} catch {
setAccessError('Não foi possível criar a especialidade.');
}
}
function openAreaEditor(area) {
setEditingArea(area);
setEditAreaName(area.nome || '');
setEditAreaDescription(area.descricao || '');
}
function closeAreaEditor() {
setEditingArea(null);
setEditAreaName('');
setEditAreaDescription('');
}
async function submitAreaEditor() {
if (!editingArea) return;
const nome = editAreaName.trim();
if (!nome) return;
try {
await updateAccessArea(editingArea.id, {
nome,
descricao: editAreaDescription,
ativo: true,
});
await refreshAreas();
closeAreaEditor();
setAccessError('');
} catch {
setAccessError('Não foi possível editar a especialidade.');
}
}
async function handleDeleteArea(area) {
const confirmed = window.confirm(`Tem certeza que deseja excluir a especialidade "${area.nome}"?`);
if (!confirmed) return;
try {
await deleteAccessArea(area.id);
await refreshAreas();
setAccessError('');
} catch {
setAccessError('Não foi possível excluir a especialidade.');
}
}
function readFileAsBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const result = String(reader.result || '');
resolve(result.includes(',') ? result.split(',')[1] : result);
};
reader.onerror = reject;
reader.readAsDataURL(file);
});
}
async function submitAiContent(event) {
event.preventDefault();
const title = aiContentForm.title.trim();
if (!title || !aiContentForm.file) return;
try {
const contentBase64 = await readFileAsBase64(aiContentForm.file);
const contents = await createAiContent({
title,
areaId: aiContentForm.areaId ? Number(aiContentForm.areaId) : null,
notes: aiContentForm.notes,
filename: aiContentForm.file.name,
mimetype: aiContentForm.file.type || 'application/octet-stream',
fileSize: aiContentForm.file.size,
contentBase64,
});
setAiContents(Array.isArray(contents) ? contents : []);
setAiContentForm({ title: '', areaId: '', notes: '', file: null });
setAccessError('');
} catch {
setAccessError('Não foi possível adicionar o conteúdo da IA.');
}
}
async function removeAiContent(contentId) {
const confirmed = window.confirm('Tem certeza que deseja remover este conteúdo da IA?');
if (!confirmed) return;
try {
const contents = await deleteAiContent(contentId);
setAiContents(Array.isArray(contents) ? contents : []);
setAccessError('');
} catch {
setAccessError('Não foi possível remover o conteúdo da IA.');
}
}
async function goToAuditPage(nextPage) {
try {
const audit = await getAuditLogs(nextPage, 100);
setAuditData(audit || { page: nextPage, limit: 100, total: 0, items: [] });
} catch {
setAccessError('Não foi possível carregar a auditoria.');
}
}
const realMonthlyKpis = [
{
label: 'Total de Atendimentos',
value: overview ? String(overview.totalAttendances) : '...',
detail: overview?.previousMonthVariation === null || overview?.previousMonthVariation === undefined
? 'sem base do mês anterior'
: `${overview.previousMonthVariation >= 0 ? '+' : ''}${overview.previousMonthVariation}% vs mês anterior`,
},
{
label: 'TMA',
value: formatMinutes(overview?.avgHandlingMinutes),
detail: overview?.avgHandlingMinutes === null ? 'aguardando histórico' : 'média mensal',
},
{
label: 'TME',
value: formatMinutes(overview?.avgFirstResponseMinutes),
detail: 'tempo médio de espera',
},
{
label: 'TMR',
value: 'Sem dados',
detail: 'requer eventos de resposta',
},
{
label: 'Atendentes Ativos',
value: overview ? `${overview.activeAttendants} de ${overview.totalActiveUsers}` : '...',
detail: 'ativos no mês',
},
];
const filteredUsers = users.filter((user) => {
const search = userSearch.trim().toLowerCase();
if (!search) return true;
return `${user.nome} ${user.email || ''} ${user.perfilPrincipal?.nome || ''} ${user.areaPrincipal?.nome || ''}`
.toLowerCase()
.includes(search);
});
const availableSpecialtiesToAdd = areas.filter(
(area) => !editUserSpecialties.some((specialty) => specialty.id === area.id),
);
const isEditingAdmin = getProfileName(editUserProfileId) === 'Admin';
const channelDistributionData = overview
? [
{ label: 'WhatsApp', value: overview.channels?.whatsapp || 0, color: '#2bb741' },
{ label: 'Email', value: overview.channels?.email || 0, color: '#e5a22a' },
{ label: 'SMS', value: overview.channels?.sms || 0, color: '#00a4b7' },
]
: channelDistribution;
const userColumns = useMemo(
() => [
{
key: 'nome',
label: 'Usuario',
render: (row) => {row.nome} ,
},
{
key: 'perfil',
label: 'Perfil',
render: (row) => {row.perfilPrincipal?.nome || 'Sem perfil'} ,
},
{
key: 'status',
label: 'Status',
render: (row) => {
const isAssigned = row.accessStatus === 'assigned';
return (
{isAssigned ? 'Atribuido' : 'Pendente'}
);
},
},
{
key: 'actions',
label: 'Ações',
render: (row) => (
openUserEditor(row)}
style={{
border: 'none',
borderRadius: 14,
padding: '0.7rem 0.9rem',
background: 'var(--color-primary)',
color: '#fff',
fontWeight: 800,
}}
>
Editar
),
},
],
[],
);
const areaColumns = useMemo(
() => [
{ key: 'nome', label: 'Especialidade' },
{
key: 'supervisores',
label: 'Supervisores',
render: (row) => {
const supervisors = Array.isArray(row.supervisores) ? row.supervisores : [];
return supervisors.length ? (
{supervisors.map((supervisor) => (
{supervisor.nome}
))}
) : (
Sem supervisor
);
},
},
{ key: 'members', label: 'Usuarios' },
{
key: 'status',
label: 'Status',
render: (row) => (row.ativo ? 'Ativa' : 'Inativa'),
},
{
key: 'actions',
label: 'Ações',
render: (row) => (
openAreaEditor(row)}
style={{
border: 'none',
borderRadius: 12,
padding: '0.55rem 0.7rem',
background: 'var(--color-primary)',
color: '#fff',
fontWeight: 800,
}}
>
Editar
handleDeleteArea(row)}
style={{
border: 'none',
borderRadius: 12,
padding: '0.55rem 0.7rem',
background: 'rgba(181, 31, 31, 0.1)',
color: 'var(--color-secondary)',
fontWeight: 800,
}}
>
Excluir
),
},
],
[isMobile],
);
const filteredRanking = attendantRankingRows;
const rankingColumns = [
{ key: 'name', label: 'Nome' },
{ key: 'area', label: 'Especialidade' },
{ key: 'closed', label: 'Atendimentos finalizados' },
{ key: 'avgTime', label: 'Tempo médio' },
{ key: 'satisfaction', label: 'Satisfação' },
];
function sendNotice() {
const text = noticeDraft.trim();
if (!text) return;
setNotices((current) => [{ id: `notice-${Date.now()}`, text }, ...current]);
setNoticeDraft('');
}
function renderLineChart() {
const maxValue = Math.max(...dailyAttendance);
const points = dailyAttendance
.map((value, index) => {
const x = (index / (dailyAttendance.length - 1)) * 100;
const y = 100 - (value / maxValue) * 86 - 7;
return `${x},${y}`;
})
.join(' ');
return (
);
}
function renderDonutChart() {
const total = channelDistributionData.reduce((sum, item) => sum + item.value, 0) || 1;
let offset = 0;
return (
{channelDistributionData.map((item) => {
const dash = (item.value / total) * 100;
const circle = (
);
offset += dash;
return circle;
})}
{channelDistributionData.map((item) => (
{item.label}
{item.value}
))}
);
}
function renderMonthlyHome() {
return (
<>
Filtro por especialidade
setSelectedAreaFilter(event.target.value)} style={selectStyle}>
Todas as especialidades
{areas.map((area) => (
{area.nome}
))}
{renderLineChart()}
{renderDonutChart()}
row.id} isMobile={isMobile} />
{notices.map((notice) => (
{notice.text}
))}
>
);
}
function renderUsersAccess() {
return (
setUserSearch(event.target.value)}
placeholder="Buscar usuário por nome, email, perfil ou especialidade"
style={selectStyle}
/>
row.id} isMobile={isMobile} />
{editingUser ? (
Editar acesso
{editingUser.nome} · {editingUser.email || 'Sem email'}
Fechar
Perfil global
handleEditProfileChange(event.target.value)}
style={selectStyle}
>
Sem perfil
{profiles.map((profile) => (
{profile.nome}
))}
{isEditingAdmin ? (
Admin tem acesso global. Especialidades não se aplicam para este perfil.
) : (
setSpecialtyToAdd(event.target.value)}
style={selectStyle}
>
Selecionar especialidade
{availableSpecialtiesToAdd.map((area) => (
{area.nome}
))}
Adicionar
{editUserSpecialties.length ? editUserSpecialties.map((specialty) => (
{specialty.nome}
updateEditSpecialtyRole(specialty.id, event.target.value)}
style={compactSelectStyle}
>
Agente
Supervisor
removeSpecialtyFromEdit(specialty.id)}
style={{
border: 'none',
borderRadius: 12,
padding: '0.55rem 0.7rem',
background: 'rgba(181, 31, 31, 0.1)',
color: 'var(--color-secondary)',
fontWeight: 800,
}}
>
Remover
)) : (
Nenhuma especialidade selecionada.
)}
)}
Salvar acesso
) : null}
);
}
function renderAudit() {
const totalPages = Math.max(1, Math.ceil((auditData.total || 0) / 100));
const columns = [
{
key: 'created_at',
label: 'Data',
render: (row) => row.created_at ? new Date(row.created_at).toLocaleString('pt-BR') : '-',
},
{ key: 'actor', label: 'Origem' },
{ key: 'action', label: 'Ação' },
{ key: 'target_type', label: 'Tipo' },
{ key: 'details', label: 'Detalhe' },
];
return (
row.id} isMobile={isMobile} />
Página {auditData.page || 1} de {totalPages} · {auditData.total || 0} eventos
goToAuditPage((auditData.page || 1) - 1)}
style={{ ...compactSelectStyle, opacity: (auditData.page || 1) <= 1 ? 0.55 : 1 }}
>
Anterior
= totalPages}
onClick={() => goToAuditPage((auditData.page || 1) + 1)}
style={{ ...compactSelectStyle, opacity: (auditData.page || 1) >= totalPages ? 0.55 : 1 }}
>
Próxima
);
}
function renderAiContents() {
const columns = [
{ key: 'title', label: 'Conteúdo' },
{ key: 'area_nome', label: 'Especialidade', render: (row) => row.area_nome || 'Geral' },
{ key: 'filename', label: 'Arquivo' },
{ key: 'status', label: 'Status', render: () => 'Disponível para consulta' },
{
key: 'actions',
label: 'Ações',
render: (row) => (
removeAiContent(row.id)}
style={{
border: 'none',
borderRadius: 12,
padding: '0.55rem 0.7rem',
background: 'rgba(181, 31, 31, 0.1)',
color: 'var(--color-secondary)',
fontWeight: 800,
}}
>
Remover
),
},
];
return (
row.id} isMobile={isMobile} />
Não informar dados sensíveis sem validação do colaborador.
Direcionar casos de assédio, denúncia ou risco trabalhista para atendimento humano.
Não inventar políticas: responder apenas com base nos conteúdos cadastrados.
Quando houver dúvida ou conflito de informação, encaminhar para especialista.
);
}
function renderChannelsIntegrations() {
const activeCount = integrationCards.filter((item) => integrationStates[item.id]).length;
const channelCount = integrationCards.filter((item) => item.group === 'Canal' && integrationStates[item.id]).length;
const integrationCount = integrationCards.filter((item) => item.group === 'Integração' && integrationStates[item.id]).length;
return (
{[
{ label: 'Ativos', value: activeCount },
{ label: 'Canais habilitados', value: channelCount },
{ label: 'Integrações habilitadas', value: integrationCount },
].map((item) => (
{item.label}
{item.value}
))}
{integrationCards.map((item) => {
const isEnabled = Boolean(integrationStates[item.id]);
return (
{item.icon}
{item.group}
{item.name}
{
setIntegrationStates((current) => ({
...current,
[item.id]: !current[item.id],
}));
}}
style={{
border: 'none',
borderRadius: 999,
width: 54,
height: 30,
padding: 3,
background: isEnabled ? item.color : '#d6e0e5',
display: 'flex',
alignItems: 'center',
justifyContent: isEnabled ? 'flex-end' : 'flex-start',
cursor: 'pointer',
flex: '0 0 auto',
}}
title={isEnabled ? `Desabilitar ${item.name}` : `Habilitar ${item.name}`}
>
{item.description}
{isEnabled ? 'Habilitado' : 'Desabilitado'}
Configurar
);
})}
);
}
function renderPlaceholder(title, description) {
return (
Seção em preparação.
);
}
const sectionContent = {
home: renderMonthlyHome(),
today: ,
'users-access': renderUsersAccess(),
templates: ,
knowledge: ,
'ai-contents': renderAiContents(),
audit: renderAudit(),
channels: renderChannelsIntegrations(),
attendance: (
),
'new-attendance': ,
'mass-message': ,
contacts: renderPlaceholder('Contatos', 'Agenda geral de contatos.'),
settings: renderPlaceholder('Configurações', 'Preferencias e parametros do ambiente.'),
};
const pageTitle = activeAdminSection === 'home'
? 'Home do Admin'
: activeAdminSection === 'attendance'
? 'Atendimento'
: activeAdminSection === 'new-attendance'
? 'Abrir Atendimento'
: activeAdminSection === 'today'
? 'Operação'
: activeAdminSection === 'audit'
? 'Auditoria'
: activeAdminSection === 'channels'
? 'Canais e Integração'
: activeAdminSection === 'ai-contents'
? 'Conteúdos da IA'
: activeAdminSection === 'knowledge'
? 'Fluxo do Bot'
: 'Painel administrativo';
const pageSubtitle = activeAdminSection === 'home'
? 'Visão mensal consolidada por especialidade, canal e atendente.'
: activeAdminSection === 'attendance'
? 'Operação de atendimento dentro do painel administrativo.'
: activeAdminSection === 'new-attendance'
? 'Inicie um contato ativo por WhatsApp usando mensagens pré-aprovadas.'
: activeAdminSection === 'today'
? 'Indicadores do dia, fila de espera e acompanhamento operacional do time.'
: activeAdminSection === 'audit'
? 'Logs administrativos e operacionais com paginação de 100 eventos.'
: activeAdminSection === 'channels'
? 'Canais de atendimento e integrações que alimentam a operação e a IA.'
: activeAdminSection === 'ai-contents'
? 'Base de documentos que será consultada pela IA em fase de testes.'
: activeAdminSection === 'knowledge'
? 'Árvore de decisão configurável para roteamento do Agente Virtual Sothis.'
: 'Controle operacional e configurações administrativas.';
return (
{sectionContent[activeAdminSection] || sectionContent.home}
);
}