"use client"; import { useState } from "react"; import { MdLibraryMusic } from "react-icons/md"; import { FaCopy, FaCheck, FaExternalLinkAlt } from "react-icons/fa"; import { Root, Navbar, Logo, LogoIcon, NavLink } from "../styles/shared"; import { Content, Heading, Subheading, Form, FieldGroup, Label, Input, Divider, Row, GenerateButton, OutputSection, OutputLabel, CodeBox, CopyButton, OpenLink, } from "./page.styles"; interface Payload { lrc?: string; srv3?: string; file1?: string; file2?: string; offset?: number; offset2?: number; } export default function CreatePage() { const [lrc, setLrc] = useState(""); const [srv3, setSrv3] = useState(""); const [file1, setFile1] = useState(""); const [file2, setFile2] = useState(""); const [offset, setOffset] = useState(""); const [offset2, setOffset2] = useState(""); const [code, setCode] = useState(null); const [copiedCode, setCopiedCode] = useState(false); const [copiedUrl, setCopiedUrl] = useState(false); const generate = () => { const payload: Payload = {}; if (lrc.trim()) payload.lrc = lrc.trim(); if (srv3.trim()) payload.srv3 = srv3.trim(); if (file1.trim()) payload.file1 = file1.trim(); if (file2.trim()) payload.file2 = file2.trim(); if (offset.trim() !== "") payload.offset = Number(offset); if (offset2.trim() !== "") payload.offset2 = Number(offset2); setCode(btoa(JSON.stringify(payload))); setCopiedCode(false); setCopiedUrl(false); }; const copy = (text: string, which: "code" | "url") => { navigator.clipboard.writeText(text); if (which === "code") { setCopiedCode(true); setTimeout(() => setCopiedCode(false), 2000); } else { setCopiedUrl(true); setTimeout(() => setCopiedUrl(false), 2000); } }; const shareUrl = code ? `${typeof window !== "undefined" ? window.location.origin : ""}/player?code=${code}` : ""; return ( LRC-Karaoke-Player ← Back Create a Karaoke Code Fill in the URLs and offsets for your session, then generate a shareable code.
setFile1(e.target.value)} /> setLrc(e.target.value)} /> setSrv3(e.target.value)} /> setFile2(e.target.value)} /> setOffset(e.target.value)} step="25" /> setOffset2(e.target.value)} step="25" /> Generate Code {code && (
Code {code} copy(code, "code")} aria-label="Copy code" > {copiedCode ? : }
Share URL {shareUrl} copy(shareUrl, "url")} aria-label="Copy URL" > {copiedUrl ? : }
Open in Player
)}
); }