mirror of
https://github.com/captbaritone/webamp.git
synced 2026-01-23 02:15:01 +00:00
Stub out permalink page
This commit is contained in:
parent
811fc977c4
commit
f1339901e6
4 changed files with 73 additions and 38 deletions
47
packages/skin-database/app/(modern)/scroll/getClientSkins.ts
Normal file
47
packages/skin-database/app/(modern)/scroll/getClientSkins.ts
Normal 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,
|
||||
};
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
import { ReactNode } from "react";
|
||||
import BottomMenuBar from "./BottomMenuBar";
|
||||
import "./scroll.css";
|
||||
|
||||
type LayoutProps = {
|
||||
children: ReactNode;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
/>
|
||||
);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue