added data to sharing page

This commit is contained in:
polaris
2024-06-29 17:49:55 -04:00
parent 3e770e56b7
commit f8786d1ad7
3 changed files with 179 additions and 89 deletions

View File

@ -1,6 +1,7 @@
import { getAuth } from "@/auth/queries/getauth"; import { getAuth } from "@/auth/queries/getauth";
import { generatePlaylogId, getSongsWithTitles } from "@/lib/api"; import { generatePlaylogId, getSongsWithTitles } from "@/lib/api";
import { shareScore } from "../token"; import { shareScore } from "../token";
import { getDifficultyClass, getDifficultyText } from "@/lib/helpers";
export default async function Share({ export default async function Share({
params, params,
@ -13,18 +14,13 @@ export default async function Share({
const tokenResult = await shareScore(token); const tokenResult = await shareScore(token);
if (tokenResult.error) { if (tokenResult.error) {
return <p>{tokenResult.error}</p>; return <p>{tokenResult.error}</p>;
} }
const { user } = await getAuth(); const { user } = await getAuth();
if (!user?.UserId) { if (!user?.UserId) {
return { return <p>Error: No user ID found.</p>;
error:"no user id"
}
} }
const userId = user?.UserId; const userId = user?.UserId;
@ -33,17 +29,38 @@ export default async function Share({
const songsData = await getSongsWithTitles(userId); const songsData = await getSongsWithTitles(userId);
const playlogIds = await generatePlaylogId(playlogId); const playlogIds = await generatePlaylogId(playlogId);
const matchSongToPlaylogId = songsData.filter((song) => // Filter songsData to match the playlogIds
playlogIds.includes(song.id) const matchedSongs = songsData.filter((song) => playlogIds.includes(song.id));
);
const songTitles = matchSongToPlaylogId.map((song) => song.title);
return ( return (
<ul> <div className="flex justify-center items-center h-screen">
{songTitles.map((title) => ( {matchedSongs.map((song) => (
<li key={title}>{title}</li> <div
key={song.id}
className="bg-slate-500 h-200 w-400 flex justify-center items-center"
>
<div className="text-white text-lg">
<p>{song.title}</p>
<p>Artist: {song.artist}</p>
<p>Genre: {song.genre}</p>
<p>diff: {song.chartlevel}</p>
<p>Level: {song.level}</p>
<p>Full Combo: {song.isFullCombo ? "Yes" : "No"}</p>
<p>Score: {song.score}</p>
<div>
<span
className={`justify-center rounded-sm text-center text-sm font-bold ${getDifficultyClass(
song.chartId
)} text-white`}
>
{getDifficultyText(song.chartId)}
</span>
</div>
</div>
</div>
))} ))}
</ul> </div>
); );
} }

View File

@ -2,17 +2,20 @@
import { getAuth } from "@/auth/queries/getauth"; import { getAuth } from "@/auth/queries/getauth";
import { artemis, daphnis } from "@/lib/prisma"; import { artemis, daphnis } from "@/lib/prisma";
import type * as Prisma from '@prisma/client'; import type * as Prisma from "@prisma/client";
type ChuniScorePlaylog = Prisma.PrismaClient; type ChuniScorePlaylog = Prisma.PrismaClient;
type ChuniStaticMusic = Prisma.PrismaClient; type ChuniStaticMusic = Prisma.PrismaClient;
type LinkSharingToken = { type LinkSharingToken = {
playlogId: number; playlogId: number;
}; };
export async function getSongsWithTitles(userId: number) { export async function getSongsWithTitles(userId: number) {
try { try {
const songs: ChuniScorePlaylog[] = await artemis.chuni_score_playlog.findMany({ // Fetch songs played by the user
const songs: ChuniScorePlaylog[] =
await artemis.chuni_score_playlog.findMany({
where: { where: {
user: userId, user: userId,
}, },
@ -61,11 +64,14 @@ export async function getSongsWithTitles(userId: number) {
}, },
}); });
// Extract unique musicIds from the fetched songs
const musicIds = songs const musicIds = songs
.map((song) => song.musicId) .map((song) => song.musicId)
.filter((id) => id !== null) as number[]; .filter((id) => id !== null) as number[];
const staticMusicInfo: ChuniStaticMusic[] = await artemis.chuni_static_music.findMany({ // Fetch static music information for the extrcted musicIds
const staticMusicInfo: ChuniStaticMusic[] =
await artemis.chuni_static_music.findMany({
where: { where: {
songId: { songId: {
in: musicIds, in: musicIds,
@ -75,18 +81,32 @@ export async function getSongsWithTitles(userId: number) {
songId: true, songId: true,
title: true, title: true,
artist: true, artist: true,
chartId: true,
level: true,
genre: true,
worldsEndTag: true,
}, },
}); });
const songsWithTitles = songs.map((song) => ({ // Map each song with its corresponding static music information
const songsWithTitles = songs.map((song) => {
// Find static info corresponding to the song's musicId and level (chartId)
const staticInfo = staticMusicInfo.find(
(chuniStatiMusic) =>
chuniStatiMusic.songId === song.musicId &&
chuniStatiMusic.chartId === song.level
);
// Return mapped song with title, artist, genre, and correct level
return {
...song, ...song,
title: title: staticInfo?.title || "Unknown Title",
staticMusicInfo.find((title) => title.songId === song.musicId)?.title || artist: staticInfo?.artist || "Unknown Artist",
"Unknown Title", genre: staticInfo?.genre || "Unknown Genre",
artist: level: staticInfo?.level || "Unknown Level",
staticMusicInfo.find((artist) => artist.songId === song.musicId) chartlevel: song.level || "unkownlevel",
?.artist || "Unknown Artist", };
})); });
return songsWithTitles; return songsWithTitles;
} catch (error) { } catch (error) {
@ -97,14 +117,14 @@ export async function getSongsWithTitles(userId: number) {
export async function generatePlaylogId(playlogid: number) { export async function generatePlaylogId(playlogid: number) {
try { try {
const tokens = await daphnis.linkSharingToken.findMany({ const tokens = (await daphnis.linkSharingToken.findMany({
where: { where: {
playlogId: playlogid, playlogId: playlogid,
}, },
select: { select: {
playlogId: true, playlogId: true,
}, },
}) as LinkSharingToken[]; })) as LinkSharingToken[];
const playlogIds: number[] = tokens.map((token) => token.playlogId); const playlogIds: number[] = tokens.map((token) => token.playlogId);

53
lib/helpers.ts Normal file
View File

@ -0,0 +1,53 @@
export const getDifficultyClass = (level: number) => {
switch (level) {
case 0:
return "bg-green-500"; // Green for basic
case 1:
return "bg-yellow-500"; // Yellow for advance
case 2:
return "bg-red-500"; // Red for expert
case 3:
return "bg-purple-500"; // Purple for master
case 4:
return "bg-yellow-500"; // Example of gradient background
case 5:
return "bg-black"; // Black for worlds end
default:
return "bg-gray-500"; // Default to gray background for unknown difficulty
}
};
export const getDifficultyText = (chartId: number) => {
switch (chartId) {
case 0:
return "EASY"; // Text for difficulty
case 1:
return "ADVANCE";
case 2:
return "EXPERT";
case 3:
return "MASTER";
case 4:
return "ULTIMA";
case 5:
return "WORLDS END";
}
};
export const getGrade = (score: number) => {
if (score >= 1009000) return "SSS+";
if (score >= 1007500 && score <= 1008999) return "SSS";
if (score >= 1005000 && score <= 1007499) return "SS+";
if (score >= 1000000 && score <= 1004999) return "SS";
if (score >= 990000 && score <= 999999) return "S+";
if (score >= 975000 && score <= 990000) return "S";
if (score >= 950000 && score <= 974999) return "AAA";
if (score >= 925000 && score <= 949999) return "AA";
if (score >= 900000 && score <= 924999) return "A";
if (score >= 800000 && score <= 899999) return "BBB";
if (score >= 700000 && score <= 799999) return "BB";
if (score >= 600000 && score <= 699999) return "B";
if (score >= 500000 && score <= 599999) return "C";
if (score < 500000) return "D";
return "";
};