Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,90 +1,83 @@
|
|
| 1 |
import streamlit as st
|
| 2 |
from auth import generate_otp, create_jwt, verify_jwt
|
| 3 |
-
from emails_utils import send_otp_email
|
| 4 |
from dotenv import load_dotenv
|
| 5 |
from model_api import query_model
|
| 6 |
from prompt_builder import build_prompt
|
| 7 |
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
|
| 10 |
-
# Initialize session state
|
| 11 |
if "otp" not in st.session_state:
|
| 12 |
st.session_state.otp = None
|
| 13 |
|
| 14 |
-
if "authenticated" not in st.session_state:
|
| 15 |
-
st.session_state.authenticated = False
|
| 16 |
-
|
| 17 |
-
if "token" not in st.session_state:
|
| 18 |
-
st.session_state.token = None
|
| 19 |
|
|
|
|
| 20 |
|
| 21 |
-
|
| 22 |
|
| 23 |
-
|
| 24 |
-
# STEP 1: Enter Email
|
| 25 |
-
# ------------------------
|
| 26 |
-
if not st.session_state.authenticated:
|
| 27 |
|
| 28 |
email = st.text_input("Enter your Email")
|
| 29 |
|
| 30 |
-
if st.
|
| 31 |
-
|
|
|
|
|
|
|
| 32 |
otp = generate_otp()
|
|
|
|
| 33 |
st.session_state.otp = otp
|
| 34 |
st.session_state.email = email
|
| 35 |
-
|
|
|
|
| 36 |
send_otp_email(email, otp)
|
| 37 |
-
|
| 38 |
-
st.success("OTP sent to your email ๐ง")
|
| 39 |
-
else:
|
| 40 |
-
st.error("Please enter email")
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
|
| 48 |
if st.button("Verify OTP"):
|
| 49 |
-
|
|
|
|
|
|
|
| 50 |
token = create_jwt(st.session_state.email)
|
| 51 |
-
st.session_state.token = token
|
| 52 |
-
st.session_state.authenticated = True
|
| 53 |
-
st.success("Login Successful!")
|
| 54 |
-
st.rerun()
|
| 55 |
-
else:
|
| 56 |
-
st.error("Invalid OTP")
|
| 57 |
|
|
|
|
|
|
|
| 58 |
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
# ------------------------
|
| 62 |
-
else:
|
| 63 |
-
decoded = verify_jwt(st.session_state.token)
|
| 64 |
|
| 65 |
-
|
| 66 |
-
|
| 67 |
|
| 68 |
-
|
| 69 |
|
| 70 |
-
if st.button("Logout"):
|
| 71 |
-
st.session_state.authenticated = False
|
| 72 |
-
st.session_state.token = None
|
| 73 |
-
st.session_state.otp = None
|
| 74 |
-
st.rerun()
|
| 75 |
-
else:
|
| 76 |
-
st.error("Session Expired")
|
| 77 |
|
|
|
|
| 78 |
|
| 79 |
st.title("๐๏ธ AI Personalized 5-Day Workout Planner")
|
| 80 |
|
| 81 |
name = st.text_input("Name")
|
| 82 |
-
|
|
|
|
| 83 |
|
| 84 |
gender = st.selectbox("Gender", ["Male", "Female", "Other"])
|
| 85 |
|
| 86 |
-
height = st.number_input("Height (cm)",
|
| 87 |
-
|
|
|
|
| 88 |
|
| 89 |
goal = st.selectbox(
|
| 90 |
"Fitness Goal",
|
|
@@ -116,7 +109,7 @@ if st.button("Generate 5-Day Plan ๐ช"):
|
|
| 116 |
goal, fitness_level, equipment
|
| 117 |
)
|
| 118 |
|
| 119 |
-
st.subheader(f"BMI: {bmi} ({bmi_status})")
|
| 120 |
|
| 121 |
with st.spinner("Generating workout plan..."):
|
| 122 |
result = query_model(prompt)
|
|
|
|
| 1 |
import streamlit as st
|
| 2 |
from auth import generate_otp, create_jwt, verify_jwt
|
| 3 |
+
from emails_utils import send_otp_email
|
| 4 |
from dotenv import load_dotenv
|
| 5 |
from model_api import query_model
|
| 6 |
from prompt_builder import build_prompt
|
| 7 |
|
| 8 |
+
load_dotenv()
|
| 9 |
+
|
| 10 |
+
st.set_page_config(page_title="FitPlan AI", page_icon="๐๏ธ", layout="centered")
|
| 11 |
+
|
| 12 |
+
# ---------------- SESSION STATE ---------------- #
|
| 13 |
+
|
| 14 |
+
if "logged_in" not in st.session_state:
|
| 15 |
+
st.session_state.logged_in = False
|
| 16 |
+
|
| 17 |
+
if "otp_sent" not in st.session_state:
|
| 18 |
+
st.session_state.otp_sent = False
|
| 19 |
|
|
|
|
| 20 |
if "otp" not in st.session_state:
|
| 21 |
st.session_state.otp = None
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
|
| 24 |
+
# ---------------- LOGIN PAGE ---------------- #
|
| 25 |
|
| 26 |
+
if not st.session_state.logged_in:
|
| 27 |
|
| 28 |
+
st.title("๐ FitPlan AI - OTP Login")
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
email = st.text_input("Enter your Email")
|
| 31 |
|
| 32 |
+
if not st.session_state.otp_sent:
|
| 33 |
+
|
| 34 |
+
if st.button("Send OTP"):
|
| 35 |
+
|
| 36 |
otp = generate_otp()
|
| 37 |
+
|
| 38 |
st.session_state.otp = otp
|
| 39 |
st.session_state.email = email
|
| 40 |
+
st.session_state.otp_sent = True
|
| 41 |
+
|
| 42 |
send_otp_email(email, otp)
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
+
st.success("OTP sent to your email")
|
| 45 |
+
|
| 46 |
+
else:
|
| 47 |
+
|
| 48 |
+
otp_input = st.text_input("Enter OTP")
|
| 49 |
|
| 50 |
if st.button("Verify OTP"):
|
| 51 |
+
|
| 52 |
+
if otp_input == st.session_state.otp:
|
| 53 |
+
|
| 54 |
token = create_jwt(st.session_state.email)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
|
| 56 |
+
st.session_state.jwt = token
|
| 57 |
+
st.session_state.logged_in = True
|
| 58 |
|
| 59 |
+
st.success("Login Successful")
|
| 60 |
+
st.rerun()
|
|
|
|
|
|
|
|
|
|
| 61 |
|
| 62 |
+
else:
|
| 63 |
+
st.error("Invalid OTP")
|
| 64 |
|
| 65 |
+
st.stop()
|
| 66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
+
# ---------------- APP CONTENT ---------------- #
|
| 69 |
|
| 70 |
st.title("๐๏ธ AI Personalized 5-Day Workout Planner")
|
| 71 |
|
| 72 |
name = st.text_input("Name")
|
| 73 |
+
|
| 74 |
+
age = st.number_input("Age", 0, 100)
|
| 75 |
|
| 76 |
gender = st.selectbox("Gender", ["Male", "Female", "Other"])
|
| 77 |
|
| 78 |
+
height = st.number_input("Height (cm)", 0, 250)
|
| 79 |
+
|
| 80 |
+
weight = st.number_input("Weight (kg)", 0, 200)
|
| 81 |
|
| 82 |
goal = st.selectbox(
|
| 83 |
"Fitness Goal",
|
|
|
|
| 109 |
goal, fitness_level, equipment
|
| 110 |
)
|
| 111 |
|
| 112 |
+
st.subheader(f"BMI: {bmi:.2f} ({bmi_status})")
|
| 113 |
|
| 114 |
with st.spinner("Generating workout plan..."):
|
| 115 |
result = query_model(prompt)
|