"use client"; import { CircleOff } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/router"; import { useEffect, useRef, useState } from "react"; import Input from "~/components/custom_ui/input"; import { StaggeredFade } from "~/components/custom_ui/staggered-fade"; import { useClickOutside } from "~/hooks/useClickOutside"; import { cn } from "~/lib/utils"; import { useTranslation } from "~/providers/I18nProvider"; import { api } from "~/utils/api"; export const CodiceBox = ({ className, optionBoxClassName, optionsClassName, containerClassName, }: { className?: string; optionBoxClassName?: string; optionsClassName?: string; containerClassName?: string; }) => { const { data: codici, isLoading: loading } = api.annunci.getCodici.useQuery(); const { locale } = useTranslation(); return ( ); }; type SearchBoxProps = { options: string[]; loading: boolean; className?: string; optionBoxClassName?: string; optionsClassName?: string; containerClassName?: string; }; const AutocompleteSearchBox = ({ options, loading, className, optionBoxClassName, optionsClassName, containerClassName, }: SearchBoxProps) => { const router = useRouter(); const [open, setOpen] = useState(false); const [results, setResults] = useState(options); const [isFocused, setIsFocused] = useState(false); const [searchValue, setSearchValue] = useState(""); const [navigationEnter, setNavigationEnter] = useState(false); const wrapperRef = useRef(null); const listRef = useRef(null); useClickOutside([wrapperRef, listRef], () => setOpen(false)); useEffect(() => { if (searchValue.trim() === "" || searchValue.length === 0) { setResults(options); } else { setResults( options.filter((option) => option.includes(searchValue.trim())), ); } }, [searchValue, options]); return (
{ setIsFocused(false); }} onChange={(e) => setSearchValue(e.target.value)} onFocus={() => { setOpen(true); setIsFocused(true); }} onKeyDown={async (e) => { if (e.key === "Enter" && results[0] && results.length > 0) { setNavigationEnter(true); await router.push(`/annuncio/${results[0].trim()}`); } }} type="search" value={searchValue} />
{open && (
    li:first-child>a]:bg-neutral-100 [&>li:first-child>a]:underline [&>li:first-child>a]:underline-offset-2", )} // biome-ignore lint/a11y/noNoninteractiveElementToInteractiveRole: role="listbox" > {loading ? (
  • Caricamento...
  • ) : ( <> {results.length === 0 && (
  • )} {results.map((item) => (
  • {item}
  • ))} )}
)}
); }; const backupFrase = "Inserisci il codice 👈"; const MovingText = ({ hidden }: { hidden: boolean }) => { const { t } = useTranslation(); const [randomFrase, setRandomFrase] = useState( t.code_search_frases[0] || backupFrase, ); useEffect(() => { const interval = setInterval(() => { const randomIndex = Math.floor( Math.random() * t.code_search_frases.length, ); setRandomFrase(t.code_search_frases[randomIndex] || backupFrase); }, 5000); return () => clearInterval(interval); }, [t]); return ( ); };