Spaces:
Sleeping
Sleeping
import streamlit as st | |
import requests | |
API_BASE = "https://news-recommender-system-o7n3.onrender.com" | |
# ---------------- Session State Initialization ---------------- | |
if "token" not in st.session_state: | |
st.session_state.token = None | |
if "page" not in st.session_state: | |
st.session_state.page = "Login" | |
# ------------------ API Call Helpers ------------------ | |
def login_api(email, password): | |
res = requests.post(f"{API_BASE}/login", json={"email": email, "password": password}) | |
return res.json(), res.status_code | |
def register_api(username, email, password): | |
res = requests.post(f"{API_BASE}/register", json={ | |
"username": username, | |
"email": email, | |
"password": password | |
}) | |
return res.json(), res.status_code | |
def get_news(): | |
headers = {"Authorization": f"Bearer {st.session_state.token}"} | |
res = requests.get(f"{API_BASE}/news", headers=headers) | |
return res.json() | |
def get_recommendations(): | |
headers = {"Authorization": f"Bearer {st.session_state.token}"} | |
res = requests.get(f"{API_BASE}/recommend", headers=headers) | |
return res.json() | |
def like_article(news_id): | |
headers = {"Authorization": f"Bearer {st.session_state.token}"} | |
res = requests.post(f"{API_BASE}/like/{news_id}", headers=headers) | |
return res.json() | |
# ------------------ Page Functions ------------------ | |
def login(): | |
st.title("π Login") | |
email = st.text_input("Email") | |
password = st.text_input("Password", type="password") | |
if st.button("Login"): | |
data, code = login_api(email, password) | |
if code == 200: | |
st.session_state.token = data['token'] | |
st.session_state.page = "Articles" | |
st.success("Login successful!") | |
st.rerun() | |
else: | |
st.error(data.get("error", "Login failed")) | |
def register(): | |
st.title("π Register") | |
username = st.text_input("Username") | |
email = st.text_input("Email") | |
password = st.text_input("Password", type="password") | |
if st.button("Register"): | |
data, code = register_api(username, email, password) | |
if code == 201: | |
st.session_state.token = data['token'] | |
st.session_state.page = "Articles" | |
st.success("Registration successful!") | |
st.rerun() | |
else: | |
st.error(data.get("error", "Registration failed")) | |
def show_articles(news_list): | |
st.title("π° Your News Feed") | |
# Initialize liked_news in session state | |
if "liked_news" not in st.session_state: | |
st.session_state.liked_news = set() | |
for article in news_list: | |
with st.container(): | |
st.subheader(article['title']) | |
st.write(article['description']) | |
st.caption(f"Category: {article['category']}") | |
# Disable like button if already liked | |
if article['id'] in st.session_state.liked_news: | |
st.button("β Liked", key=f"liked_{article['id']}", disabled=True) | |
else: | |
if st.button("π Like", key=f"like_{article['id']}"): | |
like_article(article['id']) # Call API to like | |
st.session_state.liked_news.add(article['id']) # Track locally | |
st.success("Liked!") | |
def articles_page(): | |
news_list = get_recommendations() | |
if not news_list: | |
st.info("No news found.") | |
return | |
show_articles(news_list) | |
# ------------------ Main Navigation Logic ------------------ | |
def main(): | |
st.sidebar.title("π§ Navigation") | |
# Ensure session state variables are initialized | |
if "token" not in st.session_state: | |
st.session_state.token = None | |
if "page" not in st.session_state: | |
st.session_state.page = "Login" | |
if st.session_state.token: # User is logged in | |
nav_options = ["Articles", "Recommendations", "Logout"] | |
if st.session_state.page not in nav_options: | |
st.session_state.page = "Articles" | |
choice = st.sidebar.radio("Go to", nav_options, index=nav_options.index(st.session_state.page)) | |
if choice == "Articles": | |
st.session_state.page = "Articles" | |
articles_page() | |
elif choice == "Recommendations": | |
st.session_state.page = "Recommendations" | |
news_list = get_recommendations() | |
show_articles(news_list) | |
elif choice == "Logout": | |
st.session_state.token = None | |
st.session_state.page = "Login" | |
st.success("β Logged out successfully.") | |
st.rerun() | |
else: # User is not logged in | |
nav_options = ["Login", "Register"] | |
if st.session_state.page not in nav_options: | |
st.session_state.page = "Login" | |
choice = st.sidebar.radio("Go to", nav_options, index=nav_options.index(st.session_state.page)) | |
if choice == "Login": | |
st.session_state.page = "Login" | |
login() | |
elif choice == "Register": | |
st.session_state.page = "Register" | |
register() | |
# ------------- Entry Point ------------- | |
if __name__ == "__main__": | |
main() |