Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -176,8 +176,10 @@ def tts_engine(text):
|
|
| 176 |
def toggle_sidebar():
|
| 177 |
return gr.update(visible=True, elem_classes="sidebar-mobile open")
|
| 178 |
|
| 179 |
-
def
|
| 180 |
-
|
|
|
|
|
|
|
| 181 |
user_id = get_user_id(username)
|
| 182 |
user_html = f"""
|
| 183 |
<div class='user-card'>
|
|
@@ -192,23 +194,17 @@ def login_event(username):
|
|
| 192 |
def load_history_buttons(store, username):
|
| 193 |
user_id = get_user_id(username)
|
| 194 |
if user_id in store and "workspaces" in store[user_id]:
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
|
|
|
| 203 |
|
| 204 |
-
|
| 205 |
-
user_id = get_user_id(username)
|
| 206 |
-
if user_id in store and session_id in store[user_id]["workspaces"]:
|
| 207 |
-
history = store[user_id]["workspaces"][session_id]["history"]
|
| 208 |
-
return history, session_id
|
| 209 |
-
return [], session_id
|
| 210 |
-
|
| 211 |
-
# 5. GIAO DIỆN CHÍNH
|
| 212 |
with gr.Blocks(title="NodeAI Genesis Pro") as demo:
|
| 213 |
chat_store = gr.State(load_db())
|
| 214 |
session_id = gr.State(str(uuid.uuid4()))
|
|
@@ -222,7 +218,7 @@ with gr.Blocks(title="NodeAI Genesis Pro") as demo:
|
|
| 222 |
with gr.Column(elem_classes="sidebar-mobile", visible=False) as sidebar:
|
| 223 |
gr.HTML("<div class='logo-text'>NODEAI GENESIS</div>")
|
| 224 |
|
| 225 |
-
#
|
| 226 |
login_btn = gr.LoginButton(value="🔐 ĐĂNG NHẬP HF", elem_classes="orange-btn", scale=1)
|
| 227 |
|
| 228 |
# USER INFO
|
|
@@ -232,9 +228,9 @@ with gr.Blocks(title="NodeAI Genesis Pro") as demo:
|
|
| 232 |
# TẠO WORKSPACE MỚI
|
| 233 |
new_btn = gr.Button("+ TẠO KHÔNG GIAN MỚI", elem_classes="orange-btn", scale=1)
|
| 234 |
|
| 235 |
-
# LỊCH SỬ CHAT
|
| 236 |
gr.HTML("<h3 style='color: #a0aec0; margin: 25px 0 15px 0;'>📚 LỊCH SỬ</h3>")
|
| 237 |
-
|
| 238 |
|
| 239 |
# MAIN CHAT
|
| 240 |
with gr.Column(elem_classes="chat-container"):
|
|
@@ -252,18 +248,17 @@ with gr.Blocks(title="NodeAI Genesis Pro") as demo:
|
|
| 252 |
container=False
|
| 253 |
)
|
| 254 |
|
| 255 |
-
# EVENTS
|
| 256 |
hamburger.click(toggle_sidebar, outputs=sidebar)
|
| 257 |
|
| 258 |
-
#
|
| 259 |
-
login_btn.
|
| 260 |
-
|
| 261 |
-
inputs=current_user,
|
| 262 |
outputs=[user_card, current_user]
|
| 263 |
).then(
|
| 264 |
load_history_buttons,
|
| 265 |
inputs=[chat_store, current_user],
|
| 266 |
-
outputs=
|
| 267 |
)
|
| 268 |
|
| 269 |
# TẠO MỚI
|
|
|
|
| 176 |
def toggle_sidebar():
|
| 177 |
return gr.update(visible=True, elem_classes="sidebar-mobile open")
|
| 178 |
|
| 179 |
+
def handle_login(profile):
|
| 180 |
+
"""Xử lý đăng nhập từ LoginButton"""
|
| 181 |
+
if profile and hasattr(profile, 'name') and profile.name:
|
| 182 |
+
username = profile.name
|
| 183 |
user_id = get_user_id(username)
|
| 184 |
user_html = f"""
|
| 185 |
<div class='user-card'>
|
|
|
|
| 194 |
def load_history_buttons(store, username):
|
| 195 |
user_id = get_user_id(username)
|
| 196 |
if user_id in store and "workspaces" in store[user_id]:
|
| 197 |
+
html_buttons = []
|
| 198 |
+
for sid, data in sorted(store[user_id]["workspaces"].items(), key=lambda x: x[1]["created"], reverse=True):
|
| 199 |
+
html_buttons.append(f"""
|
| 200 |
+
<div class="hist-btn" style="cursor: pointer; margin-bottom: 8px;">
|
| 201 |
+
💬 {data['title']} ({len(data['history'])//2} tin)
|
| 202 |
+
</div>
|
| 203 |
+
""")
|
| 204 |
+
return gr.update(value="".join(html_buttons))
|
| 205 |
+
return gr.update(value="<div>Chưa có lịch sử chat</div>")
|
| 206 |
|
| 207 |
+
# 5. GIAO DIỆN CHÍNH - FIX LOGINBUTTON
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 208 |
with gr.Blocks(title="NodeAI Genesis Pro") as demo:
|
| 209 |
chat_store = gr.State(load_db())
|
| 210 |
session_id = gr.State(str(uuid.uuid4()))
|
|
|
|
| 218 |
with gr.Column(elem_classes="sidebar-mobile", visible=False) as sidebar:
|
| 219 |
gr.HTML("<div class='logo-text'>NODEAI GENESIS</div>")
|
| 220 |
|
| 221 |
+
# ✅ FIX: LoginButton dùng .click() thay vì .change()
|
| 222 |
login_btn = gr.LoginButton(value="🔐 ĐĂNG NHẬP HF", elem_classes="orange-btn", scale=1)
|
| 223 |
|
| 224 |
# USER INFO
|
|
|
|
| 228 |
# TẠO WORKSPACE MỚI
|
| 229 |
new_btn = gr.Button("+ TẠO KHÔNG GIAN MỚI", elem_classes="orange-btn", scale=1)
|
| 230 |
|
| 231 |
+
# LỊCH SỬ CHAT
|
| 232 |
gr.HTML("<h3 style='color: #a0aec0; margin: 25px 0 15px 0;'>📚 LỊCH SỬ</h3>")
|
| 233 |
+
history_display = gr.HTML(value="Chưa có lịch sử chat")
|
| 234 |
|
| 235 |
# MAIN CHAT
|
| 236 |
with gr.Column(elem_classes="chat-container"):
|
|
|
|
| 248 |
container=False
|
| 249 |
)
|
| 250 |
|
| 251 |
+
# ✅ EVENTS - FIX LOGINBUTTON
|
| 252 |
hamburger.click(toggle_sidebar, outputs=sidebar)
|
| 253 |
|
| 254 |
+
# LoginButton chỉ có .click()
|
| 255 |
+
login_btn.click(
|
| 256 |
+
handle_login,
|
|
|
|
| 257 |
outputs=[user_card, current_user]
|
| 258 |
).then(
|
| 259 |
load_history_buttons,
|
| 260 |
inputs=[chat_store, current_user],
|
| 261 |
+
outputs=history_display
|
| 262 |
)
|
| 263 |
|
| 264 |
# TẠO MỚI
|