| """Shared session state and small navigation helpers.""" |
|
|
| from __future__ import annotations |
|
|
| import streamlit as st |
|
|
| from nutriweb.profile.model import UserProfile |
|
|
| |
| SEARCH = "views/search.py" |
| PRODUCT = "views/product.py" |
| RECOMMEND = "views/recommend.py" |
| COMPARE = "views/compare.py" |
| PROFILE = "views/profile_page.py" |
|
|
|
|
| def init() -> None: |
| st.session_state.setdefault("profile", UserProfile()) |
| st.session_state.setdefault("selected_code", None) |
| st.session_state.setdefault("compare_codes", []) |
| st.session_state.setdefault("last_query", "") |
|
|
|
|
| def profile() -> UserProfile: |
| return st.session_state.profile |
|
|
|
|
| def profile_is_empty() -> bool: |
| """True when the user has told us nothing we could filter on.""" |
| p = profile() |
| return not ( |
| p.allergens or p.diets or p.high_blood_pressure |
| or p.high_cholesterol or p.avoid_flagged_additives |
| ) |
|
|
|
|
| def open_product(code: str) -> None: |
| st.session_state.selected_code = code |
| st.switch_page(PRODUCT) |
|
|
|
|
| def open_recommendations(code: str) -> None: |
| st.session_state.selected_code = code |
| st.switch_page(RECOMMEND) |
|
|
|
|
| def add_to_compare(code: str) -> str: |
| codes: list[str] = st.session_state.compare_codes |
| if code in codes: |
| return "already" |
| if len(codes) >= 3: |
| return "full" |
| codes.append(code) |
| return "added" |
|
|
|
|
| def sign_out() -> None: |
| st.session_state.profile = UserProfile() |
| st.session_state.selected_code = None |
| st.session_state.compare_codes = [] |
|
|
|
|
| def require_selection() -> str | None: |
| """Guard for pages that need a chosen product.""" |
| code = st.session_state.get("selected_code") |
| if not code: |
| st.info("Pick a product from Search first.") |
| if st.button("Go to Search"): |
| st.switch_page(SEARCH) |
| return None |
| return code |
|
|