'use client'; import { Loader2, Mail, MessageSquare, Save, Send } from 'lucide-react'; import { useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { PhoneInput, phoneCountries } from '@/components/ui/phone-input'; import { apiFetch, SystemSetting } from '@/lib/api'; import { EMAIL_SETTING_KEYS, isSettingVisible, SMS_SETTING_KEYS } from '@/lib/system-settings-catalog'; import { SettingsFieldRow } from '@/components/id/settings-field-row'; function parseBoolean(value: string) { return ['true', '1', 'yes'].includes(value.trim().toLowerCase()); } interface MessagingSettingsSectionProps { settings: SystemSetting[]; token: string | null; savingGroup: string | null; onUpdateValue: (key: string, value: string) => void; onSaveGroup: (groupKey: string, groupSettings: SystemSetting[]) => Promise; showToast: (message: string) => void; } function getSettingValue(settings: SystemSetting[], key: string) { return settings.find((item) => item.key === key)?.value ?? ''; } function shouldShowMessagingField(setting: SystemSetting, settings: SystemSetting[]) { if (!isSettingVisible(setting, settings)) return false; const provider = getSettingValue(settings, 'SMS_PROVIDER'); if (setting.key === 'SMS_API_KEY') return provider === 'smsru'; if (setting.key === 'SMS_LOGIN' || setting.key === 'SMS_PASSWORD') return provider === 'smsc'; if ( setting.key === 'SMS_GATEWAY_URL' || setting.key === 'SMS_GATEWAY_USERNAME' || setting.key === 'SMS_GATEWAY_PASSWORD' || setting.key === 'SMS_GATEWAY_MESSAGE_TEMPLATE' ) { return provider === 'huawei_modem'; } const emailProvider = getSettingValue(settings, 'EMAIL_PROVIDER'); if (setting.key.startsWith('EMAIL_SMTP_') || setting.key.startsWith('EMAIL_FROM_')) { return parseBoolean(getSettingValue(settings, 'EMAIL_ENABLED')) && emailProvider === 'smtp'; } if (setting.key === 'EMAIL_PROVIDER') { return parseBoolean(getSettingValue(settings, 'EMAIL_ENABLED')); } if (setting.key === 'SMS_PROVIDER') { return parseBoolean(getSettingValue(settings, 'SMS_ENABLED')); } return true; } function MessagingBlock({ title, description, groupKey, blockSettings, allSettings, savingGroup, onUpdateValue, onSaveGroup }: { title: string; description: string; groupKey: string; blockSettings: SystemSetting[]; allSettings: SystemSetting[]; savingGroup: string | null; onUpdateValue: (key: string, value: string) => void; onSaveGroup: (groupKey: string, groupSettings: SystemSetting[]) => Promise; }) { const visibleSettings = blockSettings.filter((setting) => shouldShowMessagingField(setting, allSettings)); const saving = savingGroup === groupKey; return (

{title}

{description}

{visibleSettings.map((setting) => ( onUpdateValue(setting.key, value)} /> ))}
); } export function MessagingSettingsSection({ settings, token, savingGroup, onUpdateValue, onSaveGroup, showToast }: MessagingSettingsSectionProps) { const [testEmail, setTestEmail] = useState(''); const [testPhone, setTestPhone] = useState(''); const [testPhoneCountry, setTestPhoneCountry] = useState(phoneCountries[0]); const [testingChannel, setTestingChannel] = useState<'email' | 'sms' | null>(null); const emailSettings = useMemo( () => settings.filter((item) => EMAIL_SETTING_KEYS.includes(item.key)), [settings] ); const smsSettings = useMemo( () => settings.filter((item) => SMS_SETTING_KEYS.includes(item.key)), [settings] ); async function sendTest(channel: 'email' | 'sms') { if (!token) return; const target = channel === 'email' ? testEmail.trim() : `${testPhoneCountry.code}${testPhone}`; if (!target) { showToast(channel === 'email' ? 'Укажите email для теста' : 'Укажите номер телефона для теста'); return; } setTestingChannel(channel); try { const response = await apiFetch<{ message?: string }>( '/admin/settings/messaging/test', { method: 'POST', body: JSON.stringify({ channel, target }) }, token ); showToast(response.message ?? 'Тестовое сообщение отправлено'); } catch (error) { showToast(error instanceof Error ? error.message : 'Не удалось отправить тестовое сообщение'); } finally { setTestingChannel(null); } } const emailEnabled = parseBoolean(getSettingValue(emailSettings, 'EMAIL_ENABLED')); const smsEnabled = parseBoolean(getSettingValue(smsSettings, 'SMS_ENABLED')); const emailReady = emailEnabled || (Boolean(getSettingValue(emailSettings, 'EMAIL_SMTP_HOST')) && Boolean(getSettingValue(emailSettings, 'EMAIL_FROM_ADDRESS'))); return (

Email и SMS провайдеры

Измените параметры блока и нажмите «Сохранить блок» — все поля блока сохранятся одним действием.

Тест email

{emailReady ? 'Отправит тестовый OTP-код через SMTP.' : 'Сначала сохраните блок Email (SMTP).'}

setTestEmail(event.target.value)} />
Тест SMS

{smsEnabled ? 'Отправит тестовый OTP-код через SMS-провайдера.' : 'Сначала сохраните блок SMS.'}

); }