import { useState } from 'react'; import { RefreshCw, Trash2, Globe, UserCog, Bell, Volume2, PanelTop } from 'lucide-react'; import { useCommunicationsStore } from '../services/communicationsService'; import { Button, Badge } from '@omnichannel/ui'; import { useToast } from '../../../shared/ui'; interface SettingsViewProps { showEmailTab: boolean; onShowEmailTabChange: (enabled: boolean) => void; showChannelsTab: boolean; onShowChannelsTabChange: (enabled: boolean) => void; orgEmailAllowed: boolean; onOrgEmailAllowedChange: (enabled: boolean) => void; orgChannelsAllowed: boolean; onOrgChannelsAllowedChange: (enabled: boolean) => void; canConnectAccounts: boolean; onCanConnectAccountsChange: (enabled: boolean) => void; } export function SettingsView({ showEmailTab, onShowEmailTabChange, showChannelsTab, onShowChannelsTabChange, orgEmailAllowed, onOrgEmailAllowedChange, orgChannelsAllowed, onOrgChannelsAllowedChange, canConnectAccounts, onCanConnectAccountsChange }: SettingsViewProps) { const { showToast } = useToast(); const { integrations, testIntegration, toggleIntegration, quickReplies, addQuickReplyTemplate, deleteQuickReplyTemplate, auditLogs, } = useCommunicationsStore(); const [newTemplateText, setNewTemplateText] = useState(''); const [testingId, setTestingId] = useState(null); const [settingsScope, setSettingsScope] = useState<'personal' | 'organization'>('personal'); const [notificationsEnabled, setNotificationsEnabled] = useState(() => localStorage.getItem('krona-user-notifications') !== 'false'); const [soundsEnabled, setSoundsEnabled] = useState(() => localStorage.getItem('krona-user-sounds') !== 'false'); const [compactMode, setCompactMode] = useState(() => localStorage.getItem('krona-user-compact') !== 'false'); const switchClass = (enabled: boolean) => `relative w-12 h-7 rounded-full transition-colors shrink-0 ${enabled ? 'bg-[var(--krona-primary)]' : 'bg-[var(--krona-surface-muted)]'}`; const switchKnobClass = (enabled: boolean) => `absolute left-1 top-1 w-5 h-5 rounded-full bg-white shadow-sm transition-transform ${enabled ? 'translate-x-5' : 'translate-x-0'}`; const handleTest = async (id: string) => { setTestingId(id); const result = await testIntegration(id); setTestingId(null); showToast({ title: 'Диагностика коннектора', message: `Статус: ОК • Задержка: ${result.latencyMs} мс`, type: 'success', }); }; const handleAddTemplate = (e: React.FormEvent) => { e.preventDefault(); if (!newTemplateText.trim()) return; addQuickReplyTemplate(newTemplateText.trim()); setNewTemplateText(''); showToast({ title: 'Шаблон добавлен', message: 'Быстрый ответ сохранен', type: 'success', }); }; return (
{settingsScope === 'personal' ? <>

Отображение разделов

Показывайте только те способы связи, которыми пользуется организация

Email
Почтовые ящики и переписка
Каналы

Боты и публичные каналы организации

Поведение и уведомления

{[ { label: 'Уведомления', hint: 'Новые сообщения и упоминания', icon: Bell, value: notificationsEnabled, set: setNotificationsEnabled, key: 'krona-user-notifications' }, { label: 'Звуки', hint: 'Звуковой сигнал новых сообщений', icon: Volume2, value: soundsEnabled, set: setSoundsEnabled, key: 'krona-user-sounds' }, { label: 'Компактный интерфейс', hint: 'Больше диалогов и сообщений на экране', icon: PanelTop, value: compactMode, set: setCompactMode, key: 'krona-user-compact' }, ].map((item) =>
{item.label}
{item.hint}
)}
: <>

Доступ организации

Разрешения действуют для всех пользователей организации

Разрешить Email
Пользователи смогут подключать и показывать свои ящики
Разрешить Каналы
Боты и публичные каналы организации
Пользователи подключают аккаунты
Разрешить добавление личных мессенджеров и почты

Пользователи и роли

Кто принимает сообщения и управляет подключениями

ВикторВладелецВсе права
Мария К.МенеджерЧаты и почта
{/* 1. Connected Messengers & Connectors */}

Подключенные мессенджеры и коннекторы

Управление внешними каналами связи и интеграциями

Все коннекторы активны
{integrations.map((item) => (
{item.title[0]}
{item.title} {item.status === 'active' ? 'Подключен' : 'Отключен'}
{item.accountIdentifier} • Синхронизация: {item.lastSync} • Лимит: {item.rateLimit}
))}
{/* 2. Network & VPN Gateway (Sing-box) */}

Сетевой шлюз и VPN (Sing-box / Wireguard)

Обеспечение бесперебойного доступа к международным API Telegram и WhatsApp

Туннель активен (14 ms)
Протокол маршрутизации VLESS + XTLS Vision
Шлюз и прокси-нода eu-west.krona.systems
Uptime туннеля 99.98% (30 дней)
{/* 3. Quick Replies Manager */}

Шаблоны быстрых ответов

Шаблоны доступны операторам в один клик при общении с клиентами

setNewTemplateText(e.target.value)} placeholder="Введите новый шаблон ответа..." className="flex-1 h-10 px-3 rounded-xl bg-[var(--krona-bg-workspace)] border border-[var(--krona-border)] text-sm text-[var(--krona-text-primary)] placeholder-[var(--krona-text-muted)] focus:outline-none focus:border-[var(--krona-primary)]" />
{quickReplies.map((tmpl, idx) => (
{tmpl}
))}
{/* 4. Connection & Routing Audit Log */}

Журнал подключений и событий шлюза

Сквозной аудит всех входящих и исходящих сессий

{auditLogs.map((log) => ( ))}
Время Источник Событие Оператор / Сервис Статус
{log.timestamp} {log.source} {log.event} {log.operator} Успех
}
); }