diff --git a/gooey_ui/components.py b/gooey_ui/components.py index 85806e39d..f9edd0323 100644 --- a/gooey_ui/components.py +++ b/gooey_ui/components.py @@ -62,6 +62,11 @@ def html(body: str, **props): return _node("html", body=body, **props) +def only_loading_html(body: str, **props): + props["className"] = props.get("className", "") + " gui-html-container" + return _node("loading", body=body, **props) + + def write(*objs: typing.Any, unsafe_allow_html=False, **props): for obj in objs: markdown( diff --git a/recipes/QRCodeGenerator.py b/recipes/QRCodeGenerator.py index 9baddde76..f61831105 100644 --- a/recipes/QRCodeGenerator.py +++ b/recipes/QRCodeGenerator.py @@ -63,7 +63,7 @@ class RequestModel(BaseModel): qr_code_data: str | None qr_code_input_image: str | None - vcard_data: dict | None + vcard_data: dict | str | None use_url_shortener: bool | None @@ -169,96 +169,120 @@ def render_form_v2(self): st.caption( "We'll use the prompt above to create a beautiful QR code that when scanned on a phone, will add the info below as a contact. Great for conferences and geeky parties." ) - fields = st.session_state.get("vcard_data", {}) - for field in fields: - st.session_state.setdefault("__" + field, fields.get(field, None)) - - fields["email"] = st.text_input( - "Email", key="__email", placeholder="dev@gooey.ai" + st.session_state.setdefault( + "__upload_vcard", + isinstance(st.session_state.get("vcard_data", {}), str), ) - fields = {"email": fields.get("email", "")} - if st.button( - "Import other contact info from my email - magic!", - className="link-button", + if st.checkbox( + "Upload vCard (e.g. from MacOS Contacts export or another website)", + key="__upload_vcard", ): - if not fields.get("email"): - st.caption("Please provide an email address to import from") - else: - ( - photo_url, - name, - url, - title, - company, - gender, - notes, - ) = get_account_info_from_email(fields["email"]) - if name: - st.session_state["__format_name"] = name - if photo_url: - st.session_state["__photo_url"] = photo_url - if url: - st.session_state["__urls"] = [url] - if title: - st.session_state["__job_title"] = title - if company: - st.session_state["__organization"] = company - if gender: - st.session_state["__gender"] = gender - if notes: - st.session_state["__note"] = notes - if name or photo_url or url or title or company or gender or notes: - st.experimental_rerun() - - fields["format_name"] = st.text_input( - "Name*", - key="__format_name", - placeholder="Supreme Overlord Alex Metzger, PhD", - ) - fields["tel"] = st.text_input( - "Phone Number", key="__tel", placeholder="+1 (420) 669-6969" - ) - fields["role"] = st.text_input("Role", key="__role", placeholder="Intern") - fields["organization"] = st.text_input( - "Organization", key="__organization", placeholder="Gooey.AI" - ) - urls = st.session_state.get("__urls", []) - st.session_state["__urls"] = ( - "\n".join(urls) if isinstance(urls, list) else urls - ) - fields["urls"] = st.text_area( - "Link(s)", - key="__urls", - placeholder="https://www.gooey.ai\nhttps://farmer.chat", - ).split("\n") - fields["photo_url"] = ( - st.file_uploader("Photo", key="__photo_url", accept=["image/*"]) - if not st.session_state.get("__photo_url") - else st.text_input("Photo", key="__photo_url") - ) - with st.expander("More Contact Fields"): - fields["gender"] = st.text_input( - "Gender", key="__gender", placeholder="F" + st.session_state["vcard_data"] = st.file_uploader( + "", accept=["text/vcard"] ) - fields["calendar_url"] = st.text_input( - "Calendar Link ([calend.ly](calend.ly))", - key="__calendar_url", - placeholder="https://calendar.google.com/calendar/u/0/r", + else: + fields = st.session_state.get("vcard_data", {}) + if isinstance(fields, str): + fields = {} + for field in fields: + st.session_state.setdefault("__" + field, fields.get(field, None)) + + fields["email"] = st.text_input( + "Email", key="__email", placeholder="dev@gooey.ai" ) - fields["note"] = st.text_area( - "Notes", - key="__note", - placeholder="- awesome person\n- loves pizza\n- plays tons of chess\n- absolutely a genius", + fields = {"email": fields.get("email", "")} + if st.button( + "Import other contact info from my email - magic!", + className="link-button", + ): + if not fields.get("email"): + st.caption("Please provide an email address to import from") + else: + ( + photo_url, + name, + url, + title, + company, + gender, + notes, + ) = get_account_info_from_email(fields["email"]) + if name: + st.session_state["__format_name"] = name + if photo_url: + st.session_state["__photo_url"] = photo_url + if url: + st.session_state["__urls"] = [url] + if title: + st.session_state["__job_title"] = title + if company: + st.session_state["__organization"] = company + if gender: + st.session_state["__gender"] = gender + if notes: + st.session_state["__note"] = notes + if ( + name + or photo_url + or url + or title + or company + or gender + or notes + ): + st.experimental_rerun() + + fields["format_name"] = st.text_input( + "Name*", + key="__format_name", + placeholder="Supreme Overlord Alex Metzger, PhD", ) - st.session_state["__address"] = st.session_state.get( - "__address", "" - ).replace(";", "\n") - fields["address"] = st.text_area( - "Address", - key="__address", - placeholder="123 Main St\nSan Francisco\nCA 94105", - ).replace("\n", ";") - st.session_state["vcard_data"] = fields + fields["tel"] = st.text_input( + "Phone Number", key="__tel", placeholder="+1 (420) 669-6969" + ) + fields["role"] = st.text_input( + "Role", key="__role", placeholder="Intern" + ) + fields["organization"] = st.text_input( + "Organization", key="__organization", placeholder="Gooey.AI" + ) + urls = st.session_state.get("__urls", []) + st.session_state["__urls"] = ( + "\n".join(urls) if isinstance(urls, list) else urls + ) + fields["urls"] = st.text_area( + "Link(s)", + key="__urls", + placeholder="https://www.gooey.ai\nhttps://farmer.chat", + ).split("\n") + fields["photo_url"] = ( + st.file_uploader("Photo", key="__photo_url", accept=["image/*"]) + if not st.session_state.get("__photo_url") + else st.text_input("Photo", key="__photo_url") + ) + with st.expander("More Contact Fields"): + fields["gender"] = st.text_input( + "Gender", key="__gender", placeholder="F" + ) + fields["calendar_url"] = st.text_input( + "Calendar Link ([calend.ly](calend.ly))", + key="__calendar_url", + placeholder="https://calendar.google.com/calendar/u/0/r", + ) + fields["note"] = st.text_area( + "Notes", + key="__note", + placeholder="- awesome person\n- loves pizza\n- plays tons of chess\n- absolutely a genius", + ) + st.session_state["__address"] = st.session_state.get( + "__address", "" + ).replace(";", "\n") + fields["address"] = st.text_area( + "Address", + key="__address", + placeholder="123 Main St\nSan Francisco\nCA 94105", + ).replace("\n", ";") + st.session_state["vcard_data"] = fields if index == 1 or index == 2: st.session_state["qr_code_data"] = None @@ -271,9 +295,10 @@ def validate_form_v2(self): assert st.session_state["text_prompt"], "Please provide a prompt" if st.session_state.get("vcard_data"): - assert st.session_state["vcard_data"][ - "format_name" - ], "Please provide a name" + assert ( + isinstance(st.session_state["vcard_data"], str) + or st.session_state["vcard_data"]["format_name"] + ), "Please provide a name" return qr_code_data = st.session_state.get("qr_code_data") @@ -450,7 +475,10 @@ def run(self, state: dict) -> typing.Iterator[str | None]: if request.vcard_data: yield "Saving vCard..." - plain_text = format_vcard_string(**request.vcard_data) + if isinstance(request.vcard_data, str): + plain_text = requests.get(request.vcard_data).text + else: + plain_text = format_vcard_string(**request.vcard_data) request.qr_code_data = upload_file_from_bytes( "vCard.vcf", plain_text.encode(), "text/vcard" )