JerameeUC
1st Commit
46bca93
# /app/components/FAQViewer.py
from __future__ import annotations
import gradio as gr
from typing import List, Dict
def build_faq_viewer(faqs: List[Dict[str, str]] | None = None):
"""
Build a simple searchable FAQ viewer.
Returns (search_box, results_html, set_data_fn)
"""
faqs = faqs or []
search = gr.Textbox(label="Search FAQs", placeholder="Type to filter…")
results = gr.HTML()
def _render(query: str):
q = (query or "").strip().lower()
items = [f for f in faqs if (q in f["q"].lower() or q in f["a"].lower())] if q else faqs
if not items:
return "<em>No results.</em>"
parts = []
for f in items[:50]:
parts.append(
f"<div style='margin:8px 0;'><b>{f['q']}</b><br/><span style='color:#334155'>{f['a']}</span></div>"
)
return "\n".join(parts)
search.change(fn=_render, inputs=search, outputs=results)
# Initial render
results.value = _render("")
# return a small setter if caller wants to replace faq list later
def set_data(new_faqs: List[Dict[str, str]]):
nonlocal faqs
faqs = new_faqs
return {results: _render(search.value)}
return search, results, set_data