/* @refresh reload */ import { type Component, createSignal, JSX, onMount, Setter, Show } from "solid-js" import Row from "./row" import { Icon } from "solid-heroicons" import { magnifyingGlass, xMark } from "solid-heroicons/solid" import { getElementById } from "../utils/dom" function setupEventListener(id: string, setIsHover: Setter): () => void { let isMounted = true function hover(hover: boolean): void { if (isMounted) { setIsHover(hover) } } const el = getElementById(id) el?.addEventListener("pointerenter", () => hover(true)) el?.addEventListener("pointerleave", () => hover(false)) return () => { el?.removeEventListener("pointerenter", () => hover(true)) el?.removeEventListener("pointerleave", () => hover(false)) isMounted = false } } /** * Sets isText to 'true' or 'false' using the setIsText function. * if the value of the input element is not empty and it's different from the current value */ function setSetIsText(id: string | undefined, isText: boolean, setIsText: Setter): void { if (id) { const el = getElementById(id) if (el && (el.value !== "") !== isText) { setIsText(el.value !== "") } } } interface Input extends InputProps { leading?: JSX.Element trailing?: JSX.Element onChange?: () => void inputClass?: string } export const Input: Component> = ( // TODO remove leading and trailing from component { className, id, name, type = "text", title, placeholder, required = false, onChange, leading, trailing, inputClass, ref } ): JSX.Element => { /** * Is 'true' if the input element is in focus */ const [isFocused, setIsFocused] = createSignal(false) /** * Is 'true' if the user is hovering over the input element */ const [isHover, setIsHover] = createSignal(false) /** * Is 'true' if the input element contains any characters */ const [isText, setIsText] = createSignal(false) onMount(() => { if (id && title) { setupEventListener(id, setIsHover) } }) return ( {leading} setIsFocused(true)} onBlur={() => setIsFocused(false)} name={name ?? undefined} type={type} placeholder={placeholder ?? undefined} required={required} onInput={() => { setSetIsText(id, isText(), setIsText) if (onChange) { onChange() } }} /> {trailing} ) } const HoverTitle: Component<{ title?: string; isActive?: boolean; htmlFor?: string }> = ({ title, isActive = false, htmlFor }) => (