feat: allow admins to accept miis in queue

This commit is contained in:
trafficlunar 2026-04-01 12:01:30 +01:00
parent 147d005a14
commit 12c0205bf5
5 changed files with 60 additions and 10 deletions

View file

@ -15,10 +15,10 @@ import MiiGrid from "./mii-grid";
interface Props {
searchParams: { [key: string]: string | string[] | undefined };
userId?: number; // Profiles
inLikesPage?: boolean; // Self-explanatory
parentPage?: "likes" | "admin";
}
export default async function MiiList({ searchParams, userId, inLikesPage }: Props) {
export default async function MiiList({ searchParams, userId, parentPage }: Props) {
const session = await auth();
const parsed = searchSchema.safeParse(searchParams);
if (!parsed.success) return <h1>{parsed.error.issues[0].message}</h1>;
@ -28,7 +28,7 @@ export default async function MiiList({ searchParams, userId, inLikesPage }: Pro
// My Likes page
let miiIdsLiked: number[] | undefined = undefined;
if (inLikesPage && session?.user?.id) {
if (parentPage === "likes" && session?.user?.id) {
const likedMiis = await prisma.like.findMany({
where: { userId: Number(session.user.id) },
select: { miiId: true },
@ -36,10 +36,10 @@ export default async function MiiList({ searchParams, userId, inLikesPage }: Pro
miiIdsLiked = likedMiis.map((like) => like.miiId);
}
const where: Prisma.MiiWhereInput = {
in_queue: false,
const where: Prisma.MiiWhereInput = {
in_queue: parentPage === "admin",
// Only show liked miis on likes page
...(inLikesPage && miiIdsLiked && { id: { in: miiIdsLiked } }),
...(parentPage === "likes" && miiIdsLiked && { id: { in: miiIdsLiked } }),
// Searching
...(query && {
OR: [{ name: { contains: query, mode: "insensitive" } }, { tags: { has: query } }, { description: { contains: query, mode: "insensitive" } }],
@ -184,7 +184,7 @@ export default async function MiiList({ searchParams, userId, inLikesPage }: Pro
</div>
</div>
<MiiGrid miis={miis} userId={userId} />
<MiiGrid miis={miis} userId={userId} parentPage={parentPage} />
<Pagination lastPage={lastPage} />
</div>
);

View file

@ -13,11 +13,12 @@ import Carousel from "@/components/carousel";
interface Props {
miis: Prisma.MiiGetPayload<{ include: { user: { select: { id: true; name: true } }; _count: { select: { likedBy: true } } } }>[];
userId?: number;
parentPage?: string;
}
const fetcher = (url: string) => fetch(url).then((res) => res.json());
export default function MiiGrid({ miis, userId }: Props) {
export default function MiiGrid({ miis, userId, parentPage }: Props) {
const session = useSession();
const ids = miis.map((m) => m.id).join(",");
const { data } = useSWR<number[]>(session.data?.user && miis.length > 0 ? `/api/mii/has-liked?ids=${ids}` : null, fetcher, {
@ -79,6 +80,13 @@ export default function MiiGrid({ miis, userId }: Props) {
<DeleteMiiButton miiId={mii.id} miiName={mii.name} likes={mii._count.likedBy} />
</div>
)}
{parentPage === "admin" && (
<div className="flex gap-1 text-2xl justify-end text-zinc-400">
<button onClick={() => fetch(`/api/admin/accept-mii?id=${mii.id}`, { method: "PATCH" })} className="cursor-pointer">
<Icon icon="material-symbols:check-rounded" />
</button>
</div>
)}
</div>
</div>
</div>