File size: 1,879 Bytes
89d9642 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | """Shared session state and small navigation helpers."""
from __future__ import annotations
import streamlit as st
from nutriweb.profile.model import UserProfile
# Page paths, so navigation targets are declared in one place.
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
|