Download app.py from ankban/CommTutor: direct link, hf CLI and curl.
- Browser
- Download file 3.79 kB
-
https://huggingface.co/spaces/ankban/CommTutor/resolve/main/app.py
- Command line
-
hf download hf://spaces/ankban/CommTutor/app.py
-
curl -L -o app.py https://huggingface.co/spaces/ankban/CommTutor/resolve/main/app.py
3.79 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") | |
| 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(""" | |
| <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("---") | |
| # === 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) | |