import os from pathlib import Path from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import flet as ft import flet.fastapi as flet_fastapi import designer as d import theme_manager from router import handle_route from editor_page import router as editor_router from public_pages import router as public_router UPLOAD_DIR = os.getenv("FLET_UPLOAD_DIR", "/tmp/flet_uploads") os.makedirs(UPLOAD_DIR, exist_ok=True) async def main(page: ft.Page): page.title = "Новости" page.padding = 0 page.spacing = 0 page.window.width = 1280 page.window.min_width = 360 page.fonts = { "Merriweather": "https://cdn.jsdelivr.net/npm/@fontsource/merriweather@latest/files/merriweather-latin-400-normal.woff2", "Inter": "https://cdn.jsdelivr.net/npm/@fontsource/inter@latest/files/inter-latin-400-normal.woff2", "Playfair Display": "https://cdn.jsdelivr.net/npm/@fontsource/playfair-display@latest/files/playfair-display-latin-400-normal.woff2", "JetBrains Mono": "https://cdn.jsdelivr.net/npm/@fontsource/jetbrains-mono@latest/files/jetbrains-mono-latin-400-normal.woff2", "Roboto": "https://cdn.jsdelivr.net/npm/@fontsource/roboto@latest/files/roboto-latin-400-normal.woff2", } theme_manager.apply(page, "light") async def on_route_change(e: ft.RouteChangeEvent): theme_manager.reset_font(page) await handle_route(page) def on_view_pop(e: ft.ViewPopEvent): page.views.pop() if page.views: page.go(page.views[-1].route) page.on_route_change = on_route_change page.on_view_pop = on_view_pop await handle_route(page) # Custom routes must be registered on a WRAPPER app BEFORE mounting Flet. # flet_fastapi registers a catch-all handler internally; anything added to # the same app via include_router() ends up AFTER that catch-all and is # never reached. The wrapper ensures our routes are checked first. _flet = flet_fastapi.app(main, upload_dir=UPLOAD_DIR) app = FastAPI() app.include_router(public_router) # GET /article/{slug} app.include_router(editor_router) # GET /editor/{id} + /api/* proxy # Serve React editor static assets (JS/CSS chunks built by Vite) _editor_dist = Path(__file__).parent / "editor-ui" / "dist" if _editor_dist.exists(): app.mount("/editor-assets", StaticFiles(directory=str(_editor_dist)), name="editor-assets") app.mount("/", _flet) # everything else → Flet SPA