Files
news_all_spo/web/router.py
2026-05-13 19:05:07 +05:00

71 lines
1.9 KiB
Python

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)