Stub out permalink page

This commit is contained in:
Jordan Eldredge 2025-11-07 19:12:08 -08:00
parent 811fc977c4
commit f1339901e6
4 changed files with 73 additions and 38 deletions

View file

@ -0,0 +1,47 @@
import UserContext from "../../../data/UserContext";
import SessionModel from "../../../data/SessionModel";
import { ClientSkin } from "./SkinScroller";
import { getScrollPage } from "../../../data/skins";
import SkinModel from "../../../data/SkinModel";
// Ensure each page load gets a new session
export const dynamic = "force-dynamic";
export async function getClientSkins(sessionId: string): Promise<ClientSkin[]> {
"use server";
const ctx = new UserContext();
const page = await getScrollPage(sessionId);
return await Promise.all(
page.map(async (item) => {
return getSkinForSession(ctx, sessionId, item.md5);
})
);
}
export async function getSkinForSession(
ctx: UserContext,
sessionId: string,
md5: string
) {
const model = await SkinModel.fromMd5Assert(ctx, md5);
const readmeText = await model.getReadme();
const fileName = await model.getFileName();
const tweet = await model.getTweet();
const likeCount = tweet ? tweet.getLikes() : 0;
SessionModel.addSkin(sessionId, md5);
return {
screenshotUrl: model.getScreenshotUrl(),
md5,
// TODO: Normalize to .wsz
fileName: fileName,
readmeStart: readmeText ? readmeText.slice(0, 200) : "",
downloadUrl: model.getSkinUrl(),
shareUrl: `https://skins.webamp.org/scroll/skin/${md5}`,
nsfw: await model.getIsNsfw(),
likeCount: likeCount,
};
}

View file

@ -2,6 +2,7 @@
import { ReactNode } from "react";
import BottomMenuBar from "./BottomMenuBar";
import "./scroll.css";
type LayoutProps = {
children: ReactNode;

View file

@ -1,46 +1,10 @@
import UserContext from "../../../data/UserContext";
import SessionModel from "../../../data/SessionModel";
import "./scroll.css";
import SkinScroller, { ClientSkin } from "./SkinScroller";
import { getScrollPage } from "../../../data/skins";
import SkinModel from "../../../data/SkinModel";
import { getClientSkins } from "./getClientSkins";
import SkinScroller from "./SkinScroller";
// Ensure each page load gets a new session
export const dynamic = "force-dynamic";
async function getClientSkins(sessionId: string): Promise<ClientSkin[]> {
"use server";
const ctx = new UserContext();
const page = await getScrollPage(sessionId);
const skins = await Promise.all(
page.map(async (item) => {
const model = await SkinModel.fromMd5Assert(ctx, item.md5);
const readmeText = await model.getReadme();
const fileName = await model.getFileName();
const tweet = await model.getTweet();
const likeCount = tweet ? tweet.getLikes() : 0;
return {
screenshotUrl: model.getScreenshotUrl(),
md5: item.md5,
// TODO: Normalize to .wsz
fileName: fileName,
readmeStart: readmeText ? readmeText.slice(0, 200) : "",
downloadUrl: model.getSkinUrl(),
shareUrl: `https://skins.webamp.org/skin/${item.md5}`,
nsfw: await model.getIsNsfw(),
likeCount: likeCount,
};
})
);
for (const skin of skins) {
SessionModel.addSkin(sessionId, skin.md5);
}
return skins;
}
/**
* A tik-tok style scroll page where we display one skin at a time in full screen
*/

View file

@ -0,0 +1,23 @@
import SessionModel from "../../../../../data/SessionModel";
import UserContext from "../../../../../data/UserContext";
import { getClientSkins, getSkinForSession } from "../../getClientSkins";
import SkinScroller from "../../SkinScroller";
export default async function Skin({ params }) {
const { md5 } = await params;
// Create the session in the database
const sessionId = await SessionModel.create();
const ctx = new UserContext();
const linked = await getSkinForSession(ctx, sessionId, md5);
const initialSkins = await getClientSkins(sessionId);
return (
<SkinScroller
initialSkins={[linked, ...initialSkins]}
getSkins={getClientSkins}
sessionId={sessionId}
/>
);
}