import React, { useEffect, useState } from 'react'; import { backendApi } from '../../services/apiClient'; import { Building, ParsingSettings } from '../../types'; import { settingsService, DomaAISettings } from '../../services/settingsService'; import { apiClient } from '../../services/apiClient'; import { DomaPendingMappings } from '../applications/DomaPendingMappings'; import { Loader2, Plug, Link2 } from 'lucide-react'; export const IntegrationsSection: React.FC = () => { const [domaApiUrl, setDomaApiUrl] = useState(''); const [domaToken, setDomaToken] = useState(''); const [domaSaving, setDomaSaving] = useState(false); const [domaSyncing, setDomaSyncing] = useState(false); const [dadataEnabled, setDadataEnabled] = useState(true); const [dadataApiKey, setDadataApiKey] = useState(''); const [dadataSecret, setDadataSecret] = useState(''); const [dadataLoading, setDadataLoading] = useState(true); const [dadataSaving, setDadataSaving] = useState(false); const [parsingSettings, setParsingSettings] = useState([]); const [parsingLoading, setParsingLoading] = useState(false); useEffect(() => { const loadDoma = async () => { try { const data = await backendApi.getDomaSettings(); setDomaApiUrl(data.apiUrl || ''); setDomaToken(data.token || ''); } catch { const doma = settingsService.getDomaAISettings(); if (doma) { setDomaApiUrl(doma.apiUrl || ''); setDomaToken(doma.token || ''); } } }; loadDoma(); loadDadata(); loadParsing(); }, []); const loadParsing = async () => { setParsingLoading(true); try { const data = await apiClient.get('/pr/parsing-settings'); const processed = data.map((item: any) => ({ ...item, buildingId: item.buildingId ?? (item.settings?.building_id ?? null), })); setParsingSettings(processed); } catch { setParsingSettings([]); } finally { setParsingLoading(false); } }; const updateParsing = async (source: 'yandex_maps' | '2gis', updates: Partial) => { try { const apiUpdates: Record = {}; if (updates.enabled !== undefined) apiUpdates.enabled = updates.enabled; if (updates.urlTemplate !== undefined) apiUpdates.url_template = updates.urlTemplate; if (updates.apiKey !== undefined) apiUpdates.api_key = updates.apiKey; if (updates.parsingIntervalHours !== undefined) apiUpdates.parsing_interval_hours = updates.parsingIntervalHours; if (updates.settings !== undefined) apiUpdates.settings = updates.settings; await apiClient.put(`/pr/parsing-settings/${source}`, apiUpdates); await loadParsing(); alert('Настройки парсинга сохранены'); } catch (e: any) { alert(e?.message || 'Ошибка сохранения'); } }; const testParsing = async (source: 'yandex_maps' | '2gis') => { try { const result = await apiClient.post<{ parsed?: number; found?: number }>(`/pr/parsing-settings/${source}/test`, {}); alert(`Тестовый запрос завершён. Найдено отзывов: ${result?.found ?? result?.parsed ?? 0}`); } catch (e: any) { alert(`Ошибка: ${e?.message || 'Неизвестная ошибка'}`); } }; const loadDadata = async () => { setDadataLoading(true); try { const data = await backendApi.getDadataSettings(); setDadataEnabled(data.enabled !== false); setDadataApiKey(data.apiKey || ''); setDadataSecret(data.secret || ''); } catch { setDadataApiKey(''); setDadataSecret(''); } finally { setDadataLoading(false); } }; const saveDoma = async () => { if (!domaApiUrl.trim()) { alert('Укажите адрес API'); return; } setDomaSaving(true); try { const apiUrl = domaApiUrl.trim(); const token = domaToken.trim() || ''; await backendApi.saveDomaSettings({ apiUrl, token }); const settings: DomaAISettings = { apiUrl, token: token || undefined }; settingsService.saveDomaAISettings(settings); const { domaGraphQLClient } = await import('../../services/domaGraphQLClient'); domaGraphQLClient.updateSettings(); domaGraphQLClient.setToken(settings.token || ''); alert('Настройки Дома.АИ сохранены'); } catch (e: any) { alert(e?.message || 'Ошибка сохранения'); } finally { setDomaSaving(false); } }; const runDomaSync = async () => { setDomaSyncing(true); try { const result = await backendApi.domaSyncNow(); alert(`Синхронизация завершена. Загружено заявок: ${result?.synced ?? 0}`); } catch (e: any) { if (e?.message?.includes('401') || (e?.message && e.message.indexOf('авторизац') !== -1)) { alert('Требуется авторизация. Войдите в систему и нажмите «Синхронизировать» снова.'); } else { alert(e?.message || 'Ошибка синхронизации'); } } finally { setDomaSyncing(false); } }; const saveDadata = async () => { setDadataSaving(true); try { await backendApi.saveDadataSettings({ enabled: dadataEnabled, apiKey: dadataApiKey.trim(), secret: dadataSecret.trim(), }); alert('Настройки DaData сохранены'); } catch (e: any) { alert(e?.message || 'Ошибка сохранения'); } finally { setDadataSaving(false); } }; return (

Интеграции

Doma AI, DaData, парсинг отзывов с карт и другие внешние сервисы. Сопоставление адресов и исполнителей Doma с вашей базой — в блоке Дома.АИ ниже.

{/* Doma AI */}
Д.АИ

Дома.АИ

Заявки, API и сопоставление адресов/исполнителей

setDomaApiUrl(e.target.value)} placeholder="https://your-domain.doma.ai/admin/api" className="w-full px-3 py-2 border border-slate-200 rounded-lg text-sm" />