Files
TMS/transportmanager/client/main.py
2025-08-31 17:55:26 +03:00

108 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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,
)