"""Настройки: Telegram, Gitea.""" import flet as ft from app.core import notify from app.ui.components import snack class SettingsPage(ft.Column): def __init__(self, page: ft.Page, go): super().__init__(expand=True, scroll=ft.ScrollMode.AUTO, spacing=12) self._page = page cfg = notify.get_config() self.tg_token = ft.TextField(label="Bot token", value=cfg["token"], password=True, width=400) self.tg_chat = ft.TextField(label="Chat ID", value=cfg["chat_id"], width=400) self.tg_enabled = ft.Checkbox(label="Уведомления включены", value=cfg["enabled"]) self.tg_alert = ft.Checkbox(label="Алерты мониторинга", value=cfg["on_alert"]) self.tg_task = ft.Checkbox(label="Завершение задач", value=cfg["on_task_done"]) self.tg_status = ft.Text("", size=12) self.controls = [ ft.Text("Настройки", size=28, weight=ft.FontWeight.BOLD), ft.Card(content=ft.Container(padding=16, content=ft.Column([ ft.Text("Интерфейс", weight=ft.FontWeight.BOLD, size=16), ft.Row([ ft.Text("Тема:", size=13), ft.FilledButton( "Сменить тему (тёмная/светлая)", icon=ft.Icons.BRIGHTNESS_6, on_click=self._toggle_theme, ), ]), ], spacing=10))), ft.Card(content=ft.Container(padding=16, content=ft.Column([ ft.Text("Telegram-уведомления", weight=ft.FontWeight.BOLD, size=16), ft.Text("Создайте бота через @BotFather, узнайте chat_id через @userinfobot", size=12, color=ft.Colors.GREY_500), self.tg_token, self.tg_chat, self.tg_enabled, self.tg_alert, self.tg_task, ft.Row([ ft.FilledButton("Сохранить", icon=ft.Icons.SAVE, on_click=self._save), ft.OutlinedButton("Тест", icon=ft.Icons.SEND, on_click=self._test), ]), self.tg_status, ], spacing=10))), ] def _toggle_theme(self, e): from app.db.database import get_session from app.db.models import Setting new = "light" if self._page.theme_mode == ft.ThemeMode.DARK else "dark" self._page.theme_mode = ft.ThemeMode.LIGHT if new == "light" else ft.ThemeMode.DARK with get_session() as s: row = s.get(Setting, "theme") or Setting(key="theme") row.value = new s.add(row) s.commit() self._page.update() def _save(self, e): notify.save_config(self.tg_token.value, self.tg_chat.value, self.tg_enabled.value, self.tg_alert.value, self.tg_task.value) snack(self._page, "Настройки сохранены") def _test(self, e): self._save(e) async def _t(): ok, msg = await notify.test() self.tg_status.value = ("✅ " if ok else "❌ ") + msg self.tg_status.color = ft.Colors.GREEN_300 if ok else ft.Colors.RED_300 self._page.update() self._page.run_task(_t)