| 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(): |
| |
| with gr.Column(scale=1, min_width=220, elem_id="sidebar") as sidebar: |
| gr.Markdown(""" |
| <div id="brand-header"> |
| <h1>ChatterNest</h1> |
| </div> |
| """) |
|
|
| 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("---") |
|
|
| |
| 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) |
|
|
| |
| def toggle_sidebar(current): |
| return gr.update(visible=not current), not current |
|
|
| |
| 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 |
|
|
| |
| 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) |
|
|