import flet as ft from view import resolve_view, PUBLIC_ROUTES, PROTECTED_PREFIXES import theme_manager as tm async def _redirect_to_login(page: ft.Page): """Сброс сессии и принудительный редирект на логин.""" page.session.store.remove("auth_token") page.session.store.remove("url_key") page.session.store.remove("session_key") page.session.store.remove("user_id") await page.push_route("/login") async def _handle_route_change(page: ft.Page, e: ft.RouteChangeEvent): route = page.route token = page.session.store.get("auth_token") url_key = page.session.store.get("url_key") or "" session_key = page.session.store.get("session_key") or "" # Публичные маршруты — без проверки токена if route in PUBLIC_ROUTES: views = resolve_view(page, route) page.views.clear() page.views.extend(views) page.update() return # Защищённый маршрут без токена → логин if not token: await page.push_route("/login") return # Маршруты с ключом — первый сегмент после префикса = url_key for prefix in PROTECTED_PREFIXES: if route.startswith(prefix): rest = route[len(prefix):] key_in_url = rest.split("/")[0] # берём только первый сегмент if not url_key or not session_key or key_in_url != url_key: await _redirect_to_login(page) return break views = resolve_view(page, route) # Применяем сохранённые настройки пользователя перед построением виджетов tm.apply_scale(page) tm.apply_theme(page) # Неизвестный маршрут → на страницу пользователя if views is None: await page.push_route(f"/user/{url_key}") return page.views.clear() page.views.extend(views) page.update() # Запустить асинхронную загрузку данных, если вью её поддерживает last_view = views[-1] if views else None if last_view is not None and hasattr(last_view, "load"): page.run_task(last_view.load) def setup_router(page: ft.Page): """Привязывает router к странице. Вызывается один раз в main().""" async def _on_route_change(e: ft.RouteChangeEvent): await _handle_route_change(page, e) def _on_resize(e): """Пересчитать масштаб при изменении размера окна/повороте телефона, но только если пользователь не менял его вручную (нет сохранён. префа).""" uid = tm._get_uid(page) if uid not in tm._user_prefs: new_scale = tm.auto_scale(page) if abs(new_scale - (page.session.store.get("ds_scale_last") or 0)) > 0.05: page.session.store.set("ds_scale_last", new_scale) tm.apply_scale(page, new_scale) # перезагрузим текущий маршрут чтобы виджеты пересоздались page.go(page.route) page.on_route_change = _on_route_change page.on_resize = _on_resize