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