CommTutor / app.py
ankban's picture
Update app.py
71e5d38 verified
Raw
History Blame
3.23 kB
import gradio as gr
from spoken_module import spoken_dashboard
from written_module import written_dashboard
from file_dashboard import file_based_learning_router
from file_utils import save_nickname_to_db, load_latest_nickname
def main_app():
with gr.Blocks(css="light_mode_chatter_owl.css") as app:
current_mode = gr.State("spoken")
nickname = gr.State(load_latest_nickname()) # Load from DB on start
with gr.Row():
# === Sidebar ===
with gr.Column(scale=1, min_width=220, elem_id="sidebar"):
gr.Markdown("### πŸŽ“ Educare")
nickname_input = gr.Textbox(value=load_latest_nickname(), label="πŸ‘€ Your Nickname", placeholder="Enter your name")
nickname_display = gr.Markdown(visible=False)
def handle_nickname(name):
save_nickname_to_db(name)
return gr.update(value=f"βœ… Hi, {name}!", visible=True), name
nickname_input.change(fn=handle_nickname, inputs=[nickname_input], outputs=[nickname_display, nickname])
gr.Markdown("---")
# Navigation
btn_spoken = gr.Button("πŸ—£ Spoken Communication")
btn_written = gr.Button("✍️ Written Communication")
gr.Markdown("### πŸ“„ File-Based Learning")
btn_file_study = gr.Button("β€ƒπŸ“˜ Study Guides")
btn_file_view = gr.Button("β€ƒπŸ“ Files")
gr.Markdown("---")
# === Main View Panels ===
with gr.Column(scale=4, elem_classes=["main-content"]):
nickname_display # Render at top
with gr.Column(visible=True, elem_id="module-wrapper") as spoken_panel:
spoken_dashboard()
with gr.Column(visible=False, elem_id="module-wrapper") as written_panel:
written_dashboard()
file_router, switch_view, study_panel, file_panel = file_based_learning_router(nickname)
# === Mode Visibility Logic ===
def switch_mode(mode):
return (
gr.update(visible=(mode == "spoken")),
gr.update(visible=(mode == "written")),
gr.update(visible=(mode == "study")),
gr.update(visible=(mode == "file")),
mode
)
# === Button Hooks ===
btn_spoken.click(fn=switch_mode, inputs=[gr.State("spoken")],
outputs=[spoken_panel, written_panel, study_panel, file_panel, current_mode])
btn_written.click(fn=switch_mode, inputs=[gr.State("written")],
outputs=[spoken_panel, written_panel, study_panel, file_panel, current_mode])
btn_file_study.click(fn=switch_mode, inputs=[gr.State("study")],
outputs=[spoken_panel, written_panel, study_panel, file_panel, current_mode])
btn_file_view.click(fn=switch_mode, inputs=[gr.State("file")],
outputs=[spoken_panel, written_panel, study_panel, file_panel, current_mode])
return app
if __name__ == "__main__":
main_app().launch(server_name="0.0.0.0", server_port=7860)