import gradio as gr import os import json from file_utils import ( extract_text_from_file, call_llm, save_study_guide, fetch_study_guides ) def file_study_guide_dashboard(nickname): uploaded_files = gr.State([]) file_sections = gr.State({}) file_texts = gr.State({}) with gr.Column(scale=4, elem_id="main-column") as guide_content: nickname_input = nickname file_upload = gr.File(label="📤 Upload File for Study Guide", file_types=[".pdf", ".txt", ".md", ".pptx"]) study_guide_output = gr.Textbox(label="📘 Generated Study Guide", lines=10, interactive=False) save_guide_btn = gr.Button("📌 Save Study Guide") saved_guides_dropdown = gr.Dropdown(label="📚 Your Saved Guides", choices=[], interactive=True) saved_guide_display = gr.Textbox(label="📖 Selected Guide Content", lines=10, interactive=False) def generate_study_guide(file, current_files, section_map, text_map): if file is None: return current_files, section_map, text_map, "No file uploaded." text = extract_text_from_file(file) filename = os.path.basename(file.name) prompt = f"Divide this document into 4–6 learning sections. For each section, include a bold title and 2–3 line explanation.\n\n{text}" response = call_llm(prompt, system_message="You are an AI tutor creating study guides.") updated_files = current_files + [filename] if filename not in current_files else current_files section_map[filename] = response text_map[filename] = text return updated_files, section_map, text_map, response def save_guide_to_db(user, uploaded_files, section_map): if not uploaded_files or user.strip() == "": return filename = uploaded_files[-1] guide = section_map.get(filename, "") if guide: save_study_guide(user=user, filename=filename, guide=guide) def load_user_guides(user): guides = fetch_study_guides(user) return [f"{g.filename} ({g.timestamp})" for g in guides] def show_saved_guide(user, label): guides = fetch_study_guides(user) for g in guides: if label.startswith(g.filename): return g.guide return "" file_upload.change( fn=generate_study_guide, inputs=[file_upload, uploaded_files, file_sections, file_texts], outputs=[uploaded_files, file_sections, file_texts, study_guide_output] ) save_guide_btn.click( fn=save_guide_to_db, inputs=[nickname_input, uploaded_files, file_sections], outputs=[] ) nickname_input.change( fn=load_user_guides, inputs=[nickname_input], outputs=[saved_guides_dropdown] ) saved_guides_dropdown.change( fn=show_saved_guide, inputs=[nickname_input, saved_guides_dropdown], outputs=[saved_guide_display] ) return guide_content