"use client"; import React, { useState, useRef, useMemo, JSX } from "react"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { motion } from "framer-motion"; import { useSmoothCount } from "use-smooth-count"; import useSWR from "swr"; import { getUserCount, isUserMonitored } from "@/utils/actions"; import { isSnowflake } from "@/utils/snowflake"; import Link from "next/link"; import { parameterInfo } from "@/utils/parameter"; import * as Icon from "lucide-react"; import { Checkbox } from "@/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/components/ui/tooltip"; import { Input } from "@/components/ui/input"; import { filterLetters } from "@/lib/utils"; import { Button } from "@/components/ui/button"; export default function Home() { const originUrl = useMemo( () => typeof window !== "undefined" ? window.location.origin : "https://lanyard.cnrad.dev", [], ); const [userId, setUserId] = useState(null); const [userError, setUserError] = useState(); const [userData, setUserData] = useState<{ userId: string } | null>(null); const [copyState, setCopyState] = useState("Copy"); const [outputType, setOutputType] = useState<"markdown" | "html" | "url">( "markdown", ); const [isLoading, setIsLoading] = useState(true); const [onImageLoaded, setOnImageLoaded] = useState(false); const [option, setOption] = useState< Array<{ name: string; value: string }> >([]); const userCount = useSWR("getUserCount", getUserCount); const countRef = useRef(null); useSmoothCount({ ref: countRef, target: userCount.data || 0, duration: 3, curve: [0, 1, 0, 1], }); const url = `${originUrl}/api/${userData?.userId}${option.length > 0 ? `?${option.map((o) => `${o.name}=${o.value}`).join("&")}` : ""}`; function outputText() { if (outputType === "html") { return ``; } else if (outputType === "url") { return `${url}`; } else { return `[![Discord Presence](${url})](https://discord.com/users/${userData?.userId})`; } } function copy() { navigator.clipboard.writeText(outputText()); setCopyState("Copied!"); setTimeout(() => setCopyState("Copy"), 1500); } async function submitDiscordId() { setIsLoading(true); setOnImageLoaded(false); setUserData(null); setUserError(undefined); if (!userId) return setUserError("Please enter a Discord ID"); if (!isSnowflake(userId)) return setUserError("Invalid Discord ID"); if ((await isUserMonitored(userId)) === false) return setUserError( <> User is not being monitored by Lanyard, please join{" "} this server {" "} and try again. , ); setUserData({ userId }); setIsLoading(false); } function modifyOption( data: | { type: "string"; name: string; data: string; event: React.ChangeEvent; } | { type: "list"; name: string; data: string; } | { type: "boolean"; name: string; data: string | boolean; }, ) { if (data.type === "string") { const filteredValue = encodeURIComponent( filterLetters( data.data, ( parameterInfo.find( (p) => p.type === "string" && p.parameter === data.name, ) as any ).options.omit, ), ); setOption((prev) => { if (data.data === "") { return prev?.filter((o) => o.name !== data.name) || []; } else { if (prev?.find((o) => o.name === data.name)) { return prev.map((o) => { if (o.name === data.name) { o.value = filteredValue; } return o; }); } else { return prev ? [ ...prev, { name: data.name, value: filteredValue, }, ] : [ { name: data.name, value: filteredValue, }, ]; } } }); } else if (data.type === "list") { setOption((prev) => { if (prev?.find((o) => o.name === data.name)) { return prev.map((o) => { if (o.name === data.name) { o.value = data.data; } return o; }); } else { return prev ? [...prev, { name: data.name, value: data.data }] : [{ name: data.name, value: data.data }]; } }); } else if (data.type === "boolean") { setOption((prev) => { if (prev?.find((o) => o.name === data.name)) { return prev .map((opt) => { const options = parameterInfo.find( (p) => p.type === "boolean" && p.parameter === data.name, )?.options as { defaultBool?: boolean }; if ( data.data === (options?.defaultBool! || false) ) { return null; } else { if (opt.name === data.name) { opt.value = data.data.toString(); } return opt; } }) .filter((opt) => opt !== null); } else { return prev ? [ ...prev, { name: data.name, value: data.data.toString() }, ] : [{ name: data.name, value: data.data.toString() }]; } }); } } return ( <>

lanyard profile readme 🏷️

Utilize Lanyard to display your Discord Presence in your GitHub Profile


{ e.preventDefault(); submitDiscordId(); }} > setUserId(e.target.value)} value={userId || ""} placeholder="Enter your Discord ID" />
* {userError}
{outputText()}
Option Option Select an option to enable/disable features to your Lanyard Profile
{parameterInfo.map((item, idx) => { return (

{item.title}

{ e.preventDefault(); }} >

{ item.description }

{item.type === "string" && ( modifyOption({ type: "string", name: item.parameter, data: e .target .value, event: e, }) } value={decodeURIComponent( option?.find( (o) => o.name === item.parameter, )?.value || "", )} /> )} {item.type === "boolean" && ( modifyOption({ type: "boolean", name: item.parameter, data: bool, }) } checked={ option?.find( (o) => o.name === item.parameter, )?.value === "true" ? true : option?.find( ( o, ) => o.name === item.parameter, ) ?.value === "false" ? false : item .options ?.defaultBool || false } /> )} {item.type === "list" && ( )}
); })}
setOnImageLoaded(true)} suppressHydrationWarning />
); }