'use client'; import { Bell, Loader2, Save, Send } from 'lucide-react'; import { useMemo, useState } from 'react'; import { Button } from '@/components/ui/button'; import { apiFetch, SystemSetting } from '@/lib/api'; import { FIREBASE_SETTING_KEYS, isSettingVisible } 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()); } function getSettingValue(settings: SystemSetting[], key: string) { return settings.find((item) => item.key === key)?.value ?? ''; } interface FirebaseSettingsSectionProps { settings: SystemSetting[]; token: string | null; savingGroup: string | null; onUpdateValue: (key: string, value: string) => void; onSaveGroup: (groupKey: string, groupSettings: SystemSetting[]) => Promise; showToast: (message: string) => void; } export function FirebaseSettingsSection({ settings, token, savingGroup, onUpdateValue, onSaveGroup, showToast }: FirebaseSettingsSectionProps) { const [testing, setTesting] = useState(false); const firebaseSettings = useMemo( () => settings.filter((item) => FIREBASE_SETTING_KEYS.includes(item.key)), [settings] ); const visibleSettings = firebaseSettings.filter((setting) => isSettingVisible(setting, settings)); const saving = savingGroup === 'firebase'; const pushEnabled = parseBoolean(getSettingValue(firebaseSettings, 'FIREBASE_PUSH_ENABLED')); const hasServerCredentials = Boolean(getSettingValue(firebaseSettings, 'FIREBASE_PROJECT_ID').trim()) && Boolean(getSettingValue(firebaseSettings, 'FIREBASE_CLIENT_EMAIL').trim()) && Boolean(getSettingValue(firebaseSettings, 'FIREBASE_PRIVATE_KEY').trim()); const hasWebConfig = Boolean(getSettingValue(firebaseSettings, 'FIREBASE_WEB_API_KEY').trim()) && Boolean(getSettingValue(firebaseSettings, 'FIREBASE_WEB_APP_ID').trim()) && Boolean(getSettingValue(firebaseSettings, 'FIREBASE_WEB_MESSAGING_SENDER_ID').trim()) && Boolean(getSettingValue(firebaseSettings, 'FIREBASE_WEB_VAPID_KEY').trim()); const canTest = pushEnabled && hasServerCredentials && hasWebConfig; async function sendTestPush() { if (!token) return; setTesting(true); try { const response = await apiFetch<{ message?: string }>('/admin/settings/firebase/test', { method: 'POST' }, token); showToast(response.message ?? 'Тестовое push-уведомление отправлено'); } catch (error) { showToast(error instanceof Error ? error.message : 'Не удалось отправить тестовое push-уведомление'); } finally { setTesting(false); } } return (

Firebase Push

Настройте Firebase Cloud Messaging для push-уведомлений в браузере и мобильных клиентах.

Параметры FCM

Сервисный аккаунт — для отправки с сервера. Web API Key, App ID, Sender ID и VAPID — для клиентского SDK.

{visibleSettings.map((setting) => ( onUpdateValue(setting.key, value)} /> ))}
Тест push-уведомления

{canTest ? 'Отправит тестовое уведомление на ваши зарегистрированные устройства. Сначала откройте IdP в браузере и разрешите уведомления.' : 'Сохраните блок Firebase с включённым push и заполненными ключами, затем зарегистрируйте устройство в браузере.'}

); }