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)