"use client"; import { Suspense, useCallback, useEffect, useMemo, useRef, useState, } from "react"; import Link from "next/link"; import { debounce } from "lodash"; import { useTranslations } from "next-intl"; import { HexColorPicker } from "react-colorful"; import { getQRAsCanvas, getQRAsSVGDataUri, getQRData } from "@/lib/qr"; import { WRDO_QR_LOGO } from "@/lib/qr/constants"; import { extractHost } from "@/lib/utils"; import { Badge } from "../ui/badge"; import { Button } from "../ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "../ui/dropdown-menu"; import { Input } from "../ui/input"; import { Skeleton } from "../ui/skeleton"; import { Switch } from "../ui/switch"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "../ui/tooltip"; import BlurImage from "./blur-image"; import { CopyButton } from "./copy-button"; import { Icons } from "./icons"; export default function QRCodeEditor({ user, url, }: { user: { id: string; apiKey: string; team: string }; url: string; }) { const t = useTranslations("List"); const [params, setParams] = useState({ key: user.apiKey, url, logo: "", size: 600, level: "Q", fgColor: "#d1ffb5", bgColor: "#000000", margin: 2, hideLogo: false, }); const [qrCodeUrl, setQrCodeUrl] = useState(""); const anchorRef = useRef(null); const generateQrCodeUrl = () => { const queryParams = new URLSearchParams({ key: params.key, url: params.url, size: params.size.toString(), level: params.level, fgColor: params.fgColor, bgColor: params.bgColor, margin: params.margin.toString(), hideLogo: params.hideLogo.toString(), }); if (params.logo) { queryParams.set("logo", params.logo); } return `/api/v1/scraping/qrcode?${queryParams.toString()}`; }; useEffect(() => { setQrCodeUrl(generateQrCodeUrl()); }, [params]); const handleColorChange = useCallback( debounce((color: string, type: "fgColor" | "bgColor") => { setParams((prev) => ({ ...prev, [type]: color })); }, 300), [], ); const handleToggleLogo = (v: boolean) => { setParams((prev) => ({ ...prev, hideLogo: !v })); }; function download(url: string, extension: string) { if (!anchorRef.current) return; anchorRef.current.href = url; anchorRef.current.download = `${extractHost(params.url)}-qrcode.${extension}`; anchorRef.current.click(); } const handleChangeUrl = useCallback( debounce((value) => { setParams((prev) => ({ ...prev, url: value })); }, 300), [], ); const handleChangeLogo = useCallback( debounce((value) => { setParams((prev) => ({ ...prev, logo: value })); }, 300), [], ); const colorOptions = [ "#000000", // Black "#c73e33", // Red-orange "#df6547", // Light orange "#f4b3d7", // Pink "#f6cf54", // Light yellow "#49a065", // Green "#2146b7", // Blue "#ae49bf", // Purple "#ffffff", ]; const qrData = useMemo( () => url ? getQRData({ url: params.url, bgColor: params.bgColor, fgColor: params.fgColor, logo: params.logo, size: params.size, level: params.level, margin: params.margin, hideLogo: params.hideLogo, }) : null, [url, params], ); return (

{t("QR Code Design")}

{/* QR Code Preview */}

{t("Preview")}

{ qrData && download(await getQRAsSVGDataUri(qrData), "svg"); }} >
{t("Download SVG")}
{ qrData && download( (await getQRAsCanvas(qrData, "image/png")) as string, "png", ); }} >
{t("Download PNG")}
{ qrData && download( (await getQRAsCanvas(qrData, "image/jpeg")) as string, "jpg", ); }} >
{t("Download JPG")}
} > {qrCodeUrl && ( )}

{t("Url")}

handleChangeUrl(e.target.value)} />

{t("Logo")}

{t("Display your logo in the center of the QR code")}.{" "} {t("Learn more")} . handleToggleLogo(v)} />

{t("Custom Logo")}

Premium {t("Customize your QR code logo")}.{" "} {t("Learn more")} .
handleChangeLogo(e.target.value)} />

{t("Front Color")}

handleColorChange(e.target.value, "fgColor") } />
handleColorChange(color, "fgColor")} />
{colorOptions.map((color) => (

{t("Background Color")}

handleColorChange(e.target.value, "bgColor") } />
handleColorChange(color, "bgColor")} />
{colorOptions.map((color) => (
{/* Api Key Mask */} {!user.apiKey && (

{t("Please create a api key before use this feature")}.
{" "} {t("Learn more about")}{" "} Api key .

)}
); }