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") dark_mode_state = gr.State("light") sidebar_visible = gr.State(True) with gr.Row(): # === Sidebar === with gr.Column(scale=1, min_width=220, elem_id="sidebar") as sidebar: gr.Markdown("""

ChatterNest

""") 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) nickname_input.change(fn=handle_nickname, inputs=[nickname_input], outputs=[nickname_display]) gr.Markdown("---") btn_spoken = gr.Button("🗣 Speaking Coach", elem_classes=["sidebar-btn"]) btn_written = gr.Button("✍️ Writing Coach", elem_classes=["sidebar-btn"]) btn_file_view = gr.Button("📁 Interactive Files", elem_classes=["sidebar-btn"]) btn_file_study = gr.Button("📘 Study Guides (IN-PROGRESS)", elem_classes=["sidebar-btn"]) gr.Markdown("---") # === Main View Panels === with gr.Column(scale=4, elem_classes=["main-content"], elem_id="main-column") as main_column: nickname_display with gr.Column(visible=True, elem_id="module-wrapper") as spoken_panel: spoken_dashboard(nickname_input) with gr.Column(visible=False, elem_id="module-wrapper") as written_panel: written_dashboard(nickname_input) file_router, switch_view, study_panel, file_panel = file_based_learning_router(nickname_input) # === Toggle Sidebar Logic === def toggle_sidebar(current): return gr.update(visible=not current), not current # === Toggle Dark Mode Logic === def toggle_theme(current_theme): new_theme = "dark" if current_theme == "light" else "light" app.add_body_class(f"{new_theme}-mode") return new_theme # === Mode Switching 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 ) 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)