75 lines
2.0 KiB
Python
75 lines
2.0 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
|
|
from views.vk_sources import VkSourcesView
|
|
|
|
_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)
|
|
if sub == "vk":
|
|
return VkSourcesView(page)
|
|
return DashboardView(page)
|
|
|
|
return NewsFeedView(page)
|
|
|
|
|
|
async def handle_route(page: ft.Page):
|
|
route = page.route or "/"
|
|
page.window.on_focus = None
|
|
|
|
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)
|