import flet as ft from views.news_feed import NewsFeedView from views.news_detail import NewsDetailView from views.login import LoginView from views.dashboard import DashboardView from views.articles_list import ArticlesListView from views.article_editor import ArticleEditorView from views.categories import CategoriesView from views.media_library import MediaLibraryView _PUBLIC = {"/", "/admin/login"} def _is_admin(route: str) -> bool: return route.startswith("/admin") and route != "/admin/login" def _parts(route: str) -> list[str]: return [p for p in route.strip("/").split("/") if p] def resolve_view(page: ft.Page, route: str): parts = _parts(route) if not parts or route == "/": return NewsFeedView(page) if parts[0] == "news" and len(parts) >= 2: return NewsDetailView(page, slug=parts[1]) if parts[0] == "admin": if len(parts) == 1: return DashboardView(page) sub = parts[1] if sub == "login": return LoginView(page) if sub == "articles": if len(parts) == 2: return ArticlesListView(page) if len(parts) >= 3: aid = parts[2] return ArticleEditorView(page, article_id=None if aid == "new" else aid) if sub == "categories": return CategoriesView(page) if sub == "media": return MediaLibraryView(page) return DashboardView(page) return NewsFeedView(page) async def handle_route(page: ft.Page): route = page.route or "/" if _is_admin(route): token = page.session.get("token") if not token: page.go("/admin/login") return view = resolve_view(page, route) flet_view = view.build_page_view() page.views.clear() page.views.append(flet_view) page.update() if hasattr(view, "load"): page.run_task(view.load)