Spaces:
Running
Running
import { useState } from "react"; | |
import classNames from "classnames"; | |
import { CircleCheck, OctagonX } from "lucide-react"; | |
import { check_user } from "@/app/actions/check_user"; | |
import { on } from "events"; | |
interface Props { | |
value?: string; | |
onChange: (s?: string) => void; | |
} | |
export const Input: React.FC<Props> = ({ onChange, value }) => { | |
const [error, setError] = useState<boolean>(false); | |
const [valid, setValid] = useState<boolean>(false); | |
const [username, setUsername] = useState<string>(""); | |
const handleCheckUser = async (username: string) => { | |
const user = await check_user(username); | |
if (!user) { | |
setError(true); | |
setValid(false); | |
onChange(undefined); | |
} else { | |
setError(false); | |
setValid(true); | |
onChange(username); | |
} | |
}; | |
return ( | |
<div | |
className={classNames( | |
"rounded-md mr-2 border border-gray-200 relative ring-transparent text-zinc-600 focus-within:ring-amber-500/20 ring-[3px] flex items-center justify-center overflow-hidden", | |
{ | |
"!border-emerald-500/50 focus-within:!ring-emerald-500/20 !text-emerald-500 ring-emerald-500/20": | |
valid, | |
"!border-red-500/50 focus-within:!ring-red-500/20 !text-red-500": | |
error, | |
} | |
)} | |
> | |
<div className="bg-zinc-100 border-r border-zinc-200 text-zinc-500 text-sm px-3 h-[40px] flex items-center justify-center"> | |
<span className="max-lg:hidden">https://</span>huggingface.co/ | |
</div> | |
<input | |
value={username} | |
onChange={(e) => { | |
onChange(""); | |
setUsername(e.target.value); | |
}} | |
onBlur={(e) => handleCheckUser(e.target.value)} | |
placeholder="enzostvs" | |
className="outline-none bg-transparent border-none w-full text-sm px-3 py-2.5 flex-1" | |
/> | |
{error && <OctagonX className="text-red-500 w-5 h-5 absolute right-3" />} | |
{valid && ( | |
<CircleCheck className="text-emerald-500 w-5 h-5 absolute right-3" /> | |
)} | |
</div> | |
); | |
}; | |