108 lines
3.2 KiB
Python
108 lines
3.2 KiB
Python
import flet as ft
|
||
from pages.auth_page import Auth
|
||
from pages.dashboard_page import DashboardPage
|
||
from pages.admin_page import Admin
|
||
from pages.reset_password_page import ResetPasswordPage
|
||
import os
|
||
import requests
|
||
from config import API_BASE_URL, FLET_SERVER_PORT
|
||
|
||
os.environ["FLET_SECRET_KEY"] = os.urandom(12).hex()
|
||
|
||
def main(page: ft.Page):
|
||
page.title = "Transport Manager"
|
||
page.theme_mode = ft.ThemeMode.LIGHT
|
||
page.theme = ft.Theme(color_scheme=ft.ColorScheme(primary=ft.Colors.BLUE))
|
||
page.vertical_alignment = ft.MainAxisAlignment.CENTER
|
||
page.horizontal_alignment = ft.CrossAxisAlignment.CENTER
|
||
page.padding = 0
|
||
|
||
def is_token_valid(token: str) -> bool:
|
||
if not token:
|
||
return False
|
||
try:
|
||
resp = requests.get(
|
||
f"{API_BASE_URL}/auth/validate_token",
|
||
headers={"Authorization": f"Bearer {token}"},
|
||
timeout=5,
|
||
)
|
||
return resp.status_code == 200
|
||
except Exception:
|
||
# If the server can't be reached, treat as invalid to avoid granting access
|
||
return False
|
||
|
||
def route_change(e):
|
||
# Current path
|
||
route = page.route
|
||
|
||
# Determine auth state by validating token with backend
|
||
token = page.client_storage.get("token")
|
||
valid_token = is_token_valid(token) if token else False
|
||
is_authenticated = bool(valid_token and page.session.get('user_id'))
|
||
|
||
# If token is invalid but present, clean it up
|
||
if token and not valid_token:
|
||
try:
|
||
page.client_storage.remove("token")
|
||
except Exception:
|
||
pass
|
||
try:
|
||
page.session.pop("user_id", None)
|
||
except Exception:
|
||
pass
|
||
|
||
# Clear current UI
|
||
page.controls.clear()
|
||
|
||
# 1) Reset Password – allow opening directly from email link
|
||
if route and "reset_password" in route:
|
||
reset_page = ResetPasswordPage(page)
|
||
page.add(reset_page.build())
|
||
page.update()
|
||
return
|
||
|
||
# 2) Auth route – if already logged in with a valid token, go to dashboard
|
||
if route == "/auth":
|
||
if is_authenticated:
|
||
page.go("/dashboard")
|
||
return
|
||
login = Auth(page)
|
||
page.add(login.build())
|
||
page.update()
|
||
return
|
||
|
||
# 3) Admin (protect)
|
||
if route == "/admin":
|
||
if not is_authenticated:
|
||
page.go("/auth")
|
||
return
|
||
admin = Admin(page)
|
||
page.add(admin.build())
|
||
page.update()
|
||
return
|
||
|
||
# 4) Dashboard & root
|
||
if route in ("/dashboard", "/", None):
|
||
if not is_authenticated:
|
||
page.go("/auth")
|
||
return
|
||
dashboard = DashboardPage(page)
|
||
page.add(dashboard.build())
|
||
page.update()
|
||
return
|
||
|
||
# 5) Fallback 404
|
||
page.add(ft.Text("404: Page not found"))
|
||
page.update()
|
||
|
||
page.on_route_change = route_change
|
||
page.go(page.route or "/auth")
|
||
|
||
ft.app(
|
||
target=main,
|
||
assets_dir="assets",
|
||
upload_dir="uploads",
|
||
view=ft.WEB_BROWSER,
|
||
host="0.0.0.0",
|
||
port=FLET_SERVER_PORT,
|
||
) |