CommTutor / app.py
ankban's picture
Update app.py
4c67946 verified
Raw
History Blame Contribute Delete
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)