import { useEffect, useState } from 'react'; import { BookOpen, Pencil, Trash2, X } from 'lucide-react'; import { stopsApi, telegramImportApi } from '../services/api'; import { useCity } from '../contexts/CityContext'; const emptyForm = { alias: '', stop_id: '' }; export default function TelegramStopAliases({ onChanged }) { const { activeCity } = useCity(); const [open, setOpen] = useState(false); const [aliases, setAliases] = useState([]); const [stops, setStops] = useState([]); const [loading, setLoading] = useState(false); const [busy, setBusy] = useState(false); const [editingId, setEditingId] = useState(null); const [form, setForm] = useState(emptyForm); const [error, setError] = useState(''); const [notice, setNotice] = useState(''); useEffect(() => { setEditingId(null); setForm(emptyForm); setNotice(''); setError(''); setAliases([]); setStops([]); if (!open) return; let current = true; setLoading(true); Promise.all([telegramImportApi.getStopAliases(), stopsApi.getAll()]) .then(([dictionary, catalog]) => { if (current) { setAliases(dictionary.data); setStops(catalog.data); } }) .catch(err => { if (current) setError(err.response?.data?.error || 'Не удалось загрузить словарь остановок.'); }) .finally(() => { if (current) setLoading(false); }); return () => { current = false; }; }, [open, activeCity?.id]); const refresh = async () => { setAliases((await telegramImportApi.getStopAliases()).data); onChanged(); }; const save = async event => { event.preventDefault(); setBusy(true); setError(''); setNotice(''); try { if (editingId === null) await telegramImportApi.createStopAlias(form); else await telegramImportApi.updateStopAlias(editingId, form); setEditingId(null); setForm(emptyForm); await refresh(); setNotice('Соответствие сохранено. При следующем чтении канала сообщения на проверке за последние три дня будут разобраны заново.'); } catch (err) { setError(err.response?.data?.error || 'Не удалось сохранить соответствие.'); } finally { setBusy(false); } }; const remove = async id => { setBusy(true); setError(''); setNotice(''); try { await telegramImportApi.deleteStopAlias(id); if (editingId === id) { setEditingId(null); setForm(emptyForm); } await refresh(); setNotice('Соответствие удалено.'); } catch (err) { setError(err.response?.data?.error || 'Не удалось удалить соответствие.'); } finally { setBusy(false); } }; return
Свяжите название из канала с остановкой {activeCity?.name ? `города ${activeCity.name}` : 'выбранного города'}. Например: ЗОДЧЕГО → Зодчего Иоанна. Регистр, пробелы и знаки препинания не учитываются.
{error &&{error}
} {notice &&{notice}
} {loading ?Загрузка словаря…
: <>{alias.stop_address ? `${alias.stop_address} · ` : ''}Остановка #{alias.stop_id}
Добавьте первое соответствие. Для нескольких вариантов одного названия можно создать отдельные записи.
}Изменения применяются к новым сообщениям и сообщениям на проверке. Опубликованные уведомления сохраняют свой текст.
>}