diff --git a/packages/skin-database/app/(modern)/scroll/SkinPage.tsx b/packages/skin-database/app/(modern)/scroll/SkinPage.tsx index dcbdbf73..1da39bc5 100644 --- a/packages/skin-database/app/(modern)/scroll/SkinPage.tsx +++ b/packages/skin-database/app/(modern)/scroll/SkinPage.tsx @@ -1,20 +1,20 @@ "use client"; // @ts-expect-error - unstable_ViewTransition is not yet in @types/react -import { useEffect, unstable_ViewTransition as ViewTransition } from "react"; +import { unstable_ViewTransition as ViewTransition } from "react"; import { ClientSkin } from "./SkinScroller"; import SkinActionIcons from "./SkinActionIcons"; +import WebampComponent from "./Webamp"; type Props = { skin: ClientSkin; index: number; sessionId: string; + focused: boolean; }; -export default function SkinPage({ skin, index, sessionId }: Props) { - useEffect(() => { - console.log("Mount SkinPage"); - }, []); +export default function SkinPage({ skin, index, sessionId, focused }: Props) { + const showWebamp = focused && false; // Disable for now return (
+ {showWebamp && ( + {}} + loaded={() => {}} + /> + )} diff --git a/packages/skin-database/app/(modern)/scroll/SkinScroller.tsx b/packages/skin-database/app/(modern)/scroll/SkinScroller.tsx index 878c2abe..18da3b4d 100644 --- a/packages/skin-database/app/(modern)/scroll/SkinScroller.tsx +++ b/packages/skin-database/app/(modern)/scroll/SkinScroller.tsx @@ -8,6 +8,7 @@ import { MOBILE_MAX_WIDTH } from "../../../legacy-client/src/constants"; export type ClientSkin = { screenshotUrl: string; + skinUrl: string; fileName: string; md5: string; readmeStart: string; @@ -190,6 +191,7 @@ export default function SkinScroller({ key={skin.md5} skin={skin} index={i} + focused={i === visibleSkinIndex} sessionId={sessionId} /> ); diff --git a/packages/skin-database/app/(modern)/scroll/Webamp.tsx b/packages/skin-database/app/(modern)/scroll/Webamp.tsx new file mode 100644 index 00000000..1fd92321 --- /dev/null +++ b/packages/skin-database/app/(modern)/scroll/Webamp.tsx @@ -0,0 +1,204 @@ +import React, { useEffect, useRef } from "react"; +import { + SCREENSHOT_HEIGHT, + SCREENSHOT_WIDTH, +} from "../../../legacy-client/src/constants"; + +type Props = { + skinUrl: string; + closeModal: () => void; + loaded: () => void; +}; + +export default function WebampComponent({ + skinUrl, + closeModal, + loaded, +}: Props) { + const ref = useRef(null); + const outerRef = useRef(null); + // @ts-ignore + const webampRef = useRef(null); + + useEffect(() => { + let disposed = false; + let cleanup = () => {}; + + async function loadWebamp() { + // @ts-ignore + const { default: Webamp } = await import("webamp"); + + if (disposed) return; + + const webamp = new Webamp({ + initialSkin: { url: skinUrl }, + initialTracks, + hotkeys: true, + zIndex: 1001, + }); + + webampRef.current = webamp; + cleanup = () => webamp.dispose(); + + webamp.onClose(closeModal); + await webamp.renderWhenReady(ref.current); + const { width } = outerRef.current!.getBoundingClientRect(); + const zoom = width / SCREENSHOT_WIDTH; + console.log("Setting zoom:", zoom); + document + .getElementById("webamp") + ?.style.setProperty("zoom", String(zoom)); + + if (!disposed) loaded(); + } + + loadWebamp(); + + return () => { + disposed = true; + cleanup(); + }; + }, [skinUrl, closeModal, loaded]); + + return ( +
+
+
+ ); +} + +const album = "netBloc Vol. 24: tiuqottigeloot"; + +const initialTracks = [ + { + metaData: { + artist: "DJ Mike Llama", + title: "Llama Whippin' Intro", + }, + url: "/llama.mp3", + duration: 5.322286, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Diablo_Swing_Orchestra_-_01_-_Heroines.mp3", + duration: 322.612245, + metaData: { + title: "Heroines", + artist: "Diablo Swing Orchestra", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Eclectek_-_02_-_We_Are_Going_To_Eclecfunk_Your_Ass.mp3", + duration: 190.093061, + metaData: { + title: "We Are Going To Eclecfunk Your Ass", + artist: "Eclectek", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Auto-Pilot_-_03_-_Seventeen.mp3", + duration: 214.622041, + metaData: { + title: "Seventeen", + artist: "Auto-Pilot", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Muha_-_04_-_Microphone.mp3", + duration: 181.838367, + metaData: { + title: "Microphone", + artist: "Muha", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Just_Plain_Ant_-_05_-_Stumble.mp3", + duration: 86.047347, + metaData: { + title: "Stumble", + artist: "Just Plain Ant", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Sleaze_-_06_-_God_Damn.mp3", + duration: 226.795102, + metaData: { + title: "God Damn", + artist: "Sleaze", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Juanitos_-_07_-_Hola_Hola_Bossa_Nova.mp3", + duration: 207.072653, + metaData: { + title: "Hola Hola Bossa Nova", + artist: "Juanitos", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Entertainment_for_the_Braindead_-_08_-_Resolutions_Chris_Summer_Remix.mp3", + duration: 314.331429, + metaData: { + title: "Resolutions (Chris Summer Remix)", + artist: "Entertainment for the Braindead", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Nobara_Hayakawa_-_09_-_Trail.mp3", + duration: 204.042449, + metaData: { + title: "Trail", + artist: "Nobara Hayakawa", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/Paper_Navy_-_10_-_Tongue_Tied.mp3", + duration: 201.116735, + metaData: { + title: "Tongue Tied", + artist: "Paper Navy", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/60_Tigres_-_11_-_Garage.mp3", + duration: 245.394286, + metaData: { + title: "Garage", + artist: "60 Tigres", + album, + }, + }, + { + url: "https://raw.githubusercontent.com/captbaritone/webamp-music/4b556fbf/CM_aka_Creative_-_12_-_The_Cycle_Featuring_Mista_Mista.mp3", + duration: 221.44, + metaData: { + title: "The Cycle (Featuring Mista Mista)", + artist: "CM aka Creative", + album, + }, + }, +]; diff --git a/packages/skin-database/app/(modern)/scroll/getClientSkins.ts b/packages/skin-database/app/(modern)/scroll/getClientSkins.ts index e39a1540..038c4929 100644 --- a/packages/skin-database/app/(modern)/scroll/getClientSkins.ts +++ b/packages/skin-database/app/(modern)/scroll/getClientSkins.ts @@ -24,7 +24,7 @@ export async function getSkinForSession( ctx: UserContext, sessionId: string, md5: string -) { +): Promise { const model = await SkinModel.fromMd5Assert(ctx, md5); const readmeText = await model.getReadme(); const fileName = await model.getFileName(); @@ -35,6 +35,7 @@ export async function getSkinForSession( return { screenshotUrl: model.getScreenshotUrl(), + skinUrl: model.getSkinUrl(), md5, // TODO: Normalize to .wsz fileName: fileName,