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)