import { useState } from "react"; import { Paintbrush } from "lucide-react"; import { toast } from "sonner"; import { Button } from "@/components/ui/button"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Input } from "@/components/ui/input"; import Loading from "@/components/loading"; import { api } from "@/lib/api"; export function ReImagine({ onRedesign, }: { onRedesign: (md: string) => void; }) { const [url, setUrl] = useState<string>(""); const [open, setOpen] = useState(false); const [isLoading, setIsLoading] = useState(false); const checkIfUrlIsValid = (url: string) => { const urlPattern = new RegExp( /^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([/\w .-]*)*\/?$/, "i" ); return urlPattern.test(url); }; const handleClick = async () => { if (isLoading) return; // Prevent multiple clicks while loading if (!url) { toast.error("Please enter a URL."); return; } if (!checkIfUrlIsValid(url)) { toast.error("Please enter a valid URL."); return; } setIsLoading(true); const response = await api.put("/re-design", { url: url.trim(), }); if (response?.data?.ok) { setOpen(false); setUrl(""); onRedesign(response.data.markdown); toast.success("DeepSite is redesigning your site! Let him cook... 🔥"); } else { toast.error(response?.data?.error || "Failed to redesign the site."); } setIsLoading(false); }; return ( <Popover open={open} onOpenChange={setOpen}> <form> <PopoverTrigger asChild> <Button size="iconXs" variant="outline" className="!border-neutral-600 !text-neutral-400 !hover:!border-neutral-500 hover:!text-neutral-300" > <Paintbrush className="size-4" /> </Button> </PopoverTrigger> <PopoverContent align="start" className="!rounded-2xl !p-0 !bg-white !border-neutral-100 min-w-xs text-center overflow-hidden" > <header className="bg-neutral-50 p-6 border-b border-neutral-200/60"> <div className="flex items-center justify-center -space-x-4 mb-3"> <div className="size-9 rounded-full bg-pink-200 shadow-2xs flex items-center justify-center text-xl opacity-50"> 🎨 </div> <div className="size-11 rounded-full bg-amber-200 shadow-2xl flex items-center justify-center text-2xl z-2"> 🥳 </div> <div className="size-9 rounded-full bg-sky-200 shadow-2xs flex items-center justify-center text-xl opacity-50"> 💎 </div> </div> <p className="text-xl font-semibold text-neutral-950"> Redesign your Site! </p> <p className="text-sm text-neutral-500 mt-1.5"> Try our new Redesign feature to give your site a fresh look. </p> </header> <main className="space-y-4 p-6"> <div> <p className="text-sm text-neutral-700 mb-2"> Enter your website URL to get started: </p> <Input type="text" placeholder="https://example.com" value={url} onChange={(e) => setUrl(e.target.value)} onBlur={(e) => { const inputUrl = e.target.value.trim(); if (!inputUrl) { setUrl(""); return; } if (!checkIfUrlIsValid(inputUrl)) { toast.error("Please enter a valid URL."); return; } setUrl(inputUrl); }} className="!bg-white !border-neutral-300 !text-neutral-800 !placeholder:text-neutral-400 selection:!bg-blue-100" /> </div> <div> <p className="text-sm text-neutral-700 mb-2"> Then, let's redesign it! </p> <Button variant="black" onClick={handleClick} className="relative w-full" > {isLoading ? ( <> <Loading overlay={false} className="ml-2 size-4 animate-spin" /> Fetching your site... </> ) : ( <> Redesign <Paintbrush className="size-4" /> </> )} </Button> </div> </main> </PopoverContent> </form> </Popover> ); }