import { Show, createEffect, createSignal } from "solid-js"; import { JSX } from "solid-js/jsx-runtime"; import QR from "qrcode"; import { CopyIcon } from "../../icons/CopyIcon"; import { XIcon } from "../../icons/XIcon"; import { Person } from "../../types/Person"; import { PersonDisplay } from "./PersonDisplay"; import { PersonRegister } from "./PersonRegister"; type HTMLButtonEvent = JSX.EventHandlerUnion; /* Form that retrieves a user from the DB given an ID */ export function Search(props: {setPerson: (p: Person | null) => void}) { const [dni, setDni] = createSignal(""); const [loading, setLoading] = createSignal(false); const [error, setError] = createSignal(""); const [qrBase64, setQrBase64] = createSignal(null); const [person, setPerson] = createSignal(null); const [manualCreate, setManualCreate] = createSignal(false); // Update QR and automatically search when DNI is changed createEffect(() => { const dniT = dni(); if (dniT.length >= 8) { search(); QR.toDataURL(`https://eegsac.com/certificado/${dniT}`, {margin: 1}, (err, res) => { if (err) { console.error("Error creating QR code"); return; } setQrBase64(res); }); } else { setQrBase64(null); setPerson(null); props.setPerson(null); } }); /* Get the user data from the DB */ const search = async() => { setLoading(true); setError(""); try { const response = await fetch(`${import.meta.env.VITE_BACKEND_URL}/api/person/${dni()}`); const body = await response.json(); if (response.ok) { setPerson(body); props.setPerson(body); setManualCreate(false); } else if (response.status === 404) { console.error(body); setError("No encontrado. Ingresar datos manualmente."); setManualCreate(true); props.setPerson(null); } else { setError(body); setManualCreate(false); } } catch (e) { setError(JSON.stringify(e)); } setLoading(false); }; return (
ev.preventDefault()} class="px-4">

Error: {error()}

); } function InputBox(props: { loading: boolean, value: string, setValue: (v: string) => void, }) { let inputElement: HTMLInputElement | undefined; const copyToClipboard: HTMLButtonEvent = (ev) => { ev.preventDefault(); if (props.value.length === 8) { navigator.clipboard.writeText(props.value); } }; const clearDni: HTMLButtonEvent = (ev) => { ev.preventDefault(); props.setValue(""); (inputElement as HTMLInputElement).focus(); }; return (
props.setValue(e.target.value)} disabled={props.loading} />
); }