File size: 3,791 Bytes
b0d77d1 4080454 a8a31ab ed68fd4 fee1ded cfa4630 e0ba2d0 cfa4630 e0ba2d0 ed68fd4 cfa4630 24c1240 a9d33ce e0ba2d0 ed68fd4 b819932 ed68fd4 b819932 ed68fd4 4c67946 63d5bd5 513eda1 cfa4630 1105178 cfa4630 1105178 cfa4630 1105178 b819932 e0ba2d0 cfa4630 708ab16 cfa4630 e0ba2d0 513eda1 5028943 e0ba2d0 5028943 e0ba2d0 ac86e3d cfa4630 981c6f0 b819932 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 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)
|