Springboardmen commited on
Commit
82314df
ยท
verified ยท
1 Parent(s): 42d03a8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -57
app.py CHANGED
@@ -1,75 +1,182 @@
1
  import streamlit as st
2
- from auth import generate_otp, create_jwt, verify_jwt
3
- from email_utils import send_otp_email
4
- from dotenv import load_dotenv
5
- load_dotenv()
6
 
7
- st.set_page_config(page_title="FitPlan AI Login")
 
8
 
9
- # Initialize session state
10
- if "otp" not in st.session_state:
11
- st.session_state.otp = None
12
 
13
- if "authenticated" not in st.session_state:
14
- st.session_state.authenticated = False
 
15
 
16
- if "token" not in st.session_state:
17
- st.session_state.token = None
18
 
 
 
 
19
 
20
- st.title("๐Ÿ” FitPlan AI - OTP Login")
21
 
22
- # ------------------------
23
- # STEP 1: Enter Email
24
- # ------------------------
25
- if not st.session_state.authenticated:
26
 
27
- email = st.text_input("Enter your Email")
 
28
 
29
- if st.button("Send OTP"):
30
- if email:
31
- otp = generate_otp()
32
- st.session_state.otp = otp
33
- st.session_state.email = email
34
-
35
- send_otp_email(email, otp)
36
-
37
- st.success("OTP sent to your email ๐Ÿ“ง")
38
- else:
39
- st.error("Please enter email")
40
-
41
- # ------------------------
42
- # STEP 2: Verify OTP
43
- # ------------------------
44
- if st.session_state.otp:
45
- entered_otp = st.text_input("Enter OTP")
46
-
47
- if st.button("Verify OTP"):
48
- if entered_otp == st.session_state.otp:
49
- token = create_jwt(st.session_state.email)
50
- st.session_state.token = token
51
- st.session_state.authenticated = True
52
- st.success("Login Successful!")
53
  st.rerun()
54
  else:
55
- st.error("Invalid OTP")
56
 
57
 
58
- # ------------------------
59
- # Protected Page
60
- # ------------------------
 
61
  else:
62
- decoded = verify_jwt(st.session_state.token)
63
 
64
- if decoded:
65
- st.success(f"Welcome {decoded['email']} ๐ŸŽ‰")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
- st.write("You can now access FitPlan AI")
68
 
69
- if st.button("Logout"):
70
- st.session_state.authenticated = False
71
- st.session_state.token = None
72
- st.session_state.otp = None
73
- st.rerun()
74
- else:
75
- st.error("Session Expired")
 
1
  import streamlit as st
2
+ from database import create_tables, register_user, login_user, save_weight, get_weight_history
3
+ from model_api import query_model
4
+ from prompt_builder import build_prompt
 
5
 
6
+ # ---------------- INIT DB ----------------
7
+ create_tables()
8
 
9
+ # ---------------- PAGE CONFIG ----------------
10
+ st.set_page_config(page_title="FitPlan AI", layout="centered")
 
11
 
12
+ # ---------------- SESSION ----------------
13
+ if "user" not in st.session_state:
14
+ st.session_state.user = None
15
 
 
 
16
 
17
+ # =========================================================
18
+ # LOGIN / SIGNUP PAGE
19
+ # =========================================================
20
 
21
+ if st.session_state.user is None:
22
 
23
+ st.title("๐Ÿ‹๏ธ FitPlan AI Login")
 
 
 
24
 
25
+ menu = ["Login", "Signup"]
26
+ choice = st.sidebar.selectbox("Menu", menu)
27
 
28
+ email = st.text_input("Email")
29
+ password = st.text_input("Password", type="password")
30
+
31
+ # ---------------- SIGNUP ----------------
32
+ if choice == "Signup":
33
+
34
+ if st.button("Create Account"):
35
+
36
+ if register_user(email, password):
37
+ st.success("Account created successfully")
38
+ else:
39
+ st.error("User already exists")
40
+
41
+ # ---------------- LOGIN ----------------
42
+ if choice == "Login":
43
+
44
+ if st.button("Login"):
45
+
46
+ user = login_user(email, password)
47
+
48
+ if user:
49
+ st.session_state.user = email
50
+ st.success("Login successful")
 
51
  st.rerun()
52
  else:
53
+ st.error("Invalid email or password")
54
 
55
 
56
+ # =========================================================
57
+ # MAIN APP
58
+ # =========================================================
59
+
60
  else:
 
61
 
62
+ st.title("๐Ÿ‹๏ธ FitPlan AI โ€” Personalized Workout Generator")
63
+
64
+ st.sidebar.success(f"Logged in as {st.session_state.user}")
65
+
66
+ if st.sidebar.button("Logout"):
67
+ st.session_state.user = None
68
+ st.rerun()
69
+
70
+ st.write("Fill your fitness details to generate a workout plan.")
71
+
72
+ # ---------------- USER INPUT ----------------
73
+
74
+ name = st.text_input("Name")
75
+
76
+ age = st.number_input(
77
+ "Age",
78
+ min_value=10,
79
+ max_value=100
80
+ )
81
+
82
+ gender = st.radio("Gender", ["Male", "Female"])
83
+
84
+ height = st.number_input(
85
+ "Height (cm)",
86
+ min_value=100.0,
87
+ max_value=250.0
88
+ )
89
+
90
+ weight = st.number_input(
91
+ "Weight (kg)",
92
+ min_value=30.0,
93
+ max_value=200.0
94
+ )
95
+
96
+ goal = st.selectbox(
97
+ "Fitness Goal",
98
+ [
99
+ "Build Muscle",
100
+ "Lose Weight",
101
+ "Improve Endurance",
102
+ "General Fitness"
103
+ ]
104
+ )
105
+
106
+ fitness_level = st.radio(
107
+ "Fitness Level",
108
+ ["Beginner", "Intermediate", "Advanced"]
109
+ )
110
+
111
+ equipment = st.multiselect(
112
+ "Available Equipment",
113
+ [
114
+ "No Equipment",
115
+ "Dumbbells",
116
+ "Barbell",
117
+ "Pull-up Bar",
118
+ "Resistance Bands",
119
+ "Treadmill",
120
+ "Kettlebells",
121
+ "Full Gym"
122
+ ]
123
+ )
124
+
125
+ # ---------------- SAVE WEIGHT ----------------
126
+
127
+ if st.button("Save Today's Weight"):
128
+ save_weight(st.session_state.user, weight)
129
+ st.success("Weight saved")
130
+
131
+ # ---------------- WEIGHT HISTORY ----------------
132
+
133
+ if st.button("View Weight History"):
134
+
135
+ data = get_weight_history(st.session_state.user)
136
+
137
+ if data:
138
+ st.write("๐Ÿ“Š Weight History")
139
+ st.table(data)
140
+ else:
141
+ st.info("No weight history available")
142
+
143
+ # ---------------- GENERATE WORKOUT ----------------
144
+
145
+ if st.button("Generate Workout Plan"):
146
+
147
+ if not name:
148
+ st.warning("Please enter your name")
149
+
150
+ elif not equipment:
151
+ st.warning("Select equipment")
152
+
153
+ else:
154
+
155
+ prompt, bmi, bmi_status = build_prompt(
156
+ name,
157
+ age,
158
+ gender,
159
+ height,
160
+ weight,
161
+ goal,
162
+ fitness_level,
163
+ equipment
164
+ )
165
+
166
+ with st.spinner("Generating AI workout plan..."):
167
+ response = query_model(prompt)
168
+
169
+ st.subheader("๐Ÿ“‹ Your Workout Plan")
170
+ st.write(response)
171
+
172
+ st.info(f"""
173
+ **Profile Summary**
174
+
175
+ BMI: {bmi:.2f} ({bmi_status})
176
+
177
+ Goal: {goal}
178
 
179
+ Fitness Level: {fitness_level}
180
 
181
+ Equipment: {", ".join(equipment)}
182
+ """)