diff --git a/src/pages/SettingsPage.tsx b/src/pages/SettingsPage.tsx index a45b421..a5ed24f 100644 --- a/src/pages/SettingsPage.tsx +++ b/src/pages/SettingsPage.tsx @@ -1,5 +1,5 @@ import { useState } from 'react' -import { Save, Building2, Bell, Shield, Globe, CreditCard, BedDouble, Mail, MessageSquare, Users, Plus, X as XIcon } from 'lucide-react' +import { Save, Building2, Bell, Shield, Globe, CreditCard, BedDouble, Mail, MessageSquare, Users, Plus, X as XIcon, Send, CheckCircle2, Copy } from 'lucide-react' import { MOCK_HOTELS } from '../data/mockData' import { cn, PLAN_COLORS, PLAN_LABELS } from '../lib/utils' import { Badge } from '../components/ui/Badge' @@ -80,6 +80,42 @@ export function SettingsPage() { const [smsApiKey, setSmsApiKey] = useState('') const [smsSender, setSmsSender] = useState('') + // Telegram settings + const [tgBotToken, setTgBotToken] = useState('') + const [tgManagers, setTgManagers] = useState<{ id: string; name: string; chatId: string }[]>([]) + const [newTgName, setNewTgName] = useState('') + const [newTgChatId, setNewTgChatId] = useState('') + const [tgEvents, setTgEvents] = useState({ + newBooking: true, + cancellation: true, + checkIn: true, + checkOut: false, + channelError: true, + payment: false, + }) + const [tgTestSent, setTgTestSent] = useState(false) + const [copiedToken, setCopiedToken] = useState(false) + + const tgBotConfigured = tgBotToken.length > 10 + + const addTgManager = () => { + if (!newTgName.trim() || !newTgChatId.trim()) return + setTgManagers(prev => [...prev, { id: `tg-${Date.now()}`, name: newTgName.trim(), chatId: newTgChatId.trim() }]) + setNewTgName('') + setNewTgChatId('') + } + + const sendTgTest = () => { + setTgTestSent(true) + setTimeout(() => setTgTestSent(false), 3000) + } + + const copyBotLink = () => { + navigator.clipboard.writeText('https://t.me/HotelSyncBot?start=connect') + setCopiedToken(true) + setTimeout(() => setCopiedToken(false), 2000) + } + const handleSave = () => { setSaved(true) setTimeout(() => setSaved(false), 2000) @@ -436,6 +472,150 @@ export function SettingsPage() { + {/* Telegram */} +
+
+ +

Telegram-уведомления для менеджеров

+
+

+ Менеджеры получают уведомления о бронированиях прямо в Telegram. Каждый менеджер должен написать боту команду /start и сообщить свой Chat ID. +

+ + {/* How to connect — step instructions */} +
+

Как подключить менеджера:

+
    +
  1. Менеджер открывает Telegram и переходит в бота
  2. +
  3. Пишет /start — бот ответит его Chat ID
  4. +
  5. Менеджер сообщает Chat ID администратору — тот добавляет его ниже
  6. +
+ +
+ + {/* Bot token */} +
+ + setTgBotToken(e.target.value)} + /> +
+ + {/* Events to notify */} + {tgBotConfigured && ( + <> +
+

Уведомлять о событиях:

+
+ {([ + { key: 'newBooking' as const, label: 'Новое бронирование' }, + { key: 'cancellation' as const, label: 'Отмена брони' }, + { key: 'checkIn' as const, label: 'Заезд гостя' }, + { key: 'checkOut' as const, label: 'Выезд гостя' }, + { key: 'channelError' as const, label: 'Ошибка канала' }, + { key: 'payment' as const, label: 'Платёж / оплата' }, + ]).map(ev => ( + + ))} +
+
+ + {/* Manager list */} +
+

+ Менеджеры — получатели уведомлений + {tgManagers.length > 0 && ({tgManagers.length})} +

+
+ {tgManagers.length === 0 && ( +

+ Менеджеры ещё не добавлены +

+ )} + {tgManagers.map(m => ( +
+
+ {m.name[0]?.toUpperCase()} +
+
+

{m.name}

+

Chat ID: {m.chatId}

+
+ +
+ ))} +
+ + {/* Add manager */} +
+ setNewTgName(e.target.value)} + /> + setNewTgChatId(e.target.value)} + onKeyDown={e => { if (e.key === 'Enter') addTgManager() }} + /> + +
+
+ + {/* Test button */} + {tgManagers.length > 0 && ( + + )} + + )} +
+ {/* SMS */}