diff --git a/src/app/api/mii/[id]/edit/route.ts b/src/app/api/mii/[id]/edit/route.ts index b2ed57b..28bcfaf 100644 --- a/src/app/api/mii/[id]/edit/route.ts +++ b/src/app/api/mii/[id]/edit/route.ts @@ -1,7 +1,7 @@ import { NextRequest, NextResponse } from "next/server"; import * as Sentry from "@sentry/nextjs"; import { z } from "zod"; -import { Mii, Prisma } from "@prisma/client"; +import { Mii, MiiMakeup, Prisma } from "@prisma/client"; import fs from "fs/promises"; import path from "path"; @@ -23,6 +23,7 @@ const editSchema = z.object({ name: nameSchema.optional(), tags: tagsSchema.optional(), description: z.string().trim().max(256).optional(), + makeup: z.enum(MiiMakeup).optional(), instructions: switchMiiInstructionsSchema, image1: z.union([z.instanceof(File), z.any()]).optional(), image2: z.union([z.instanceof(File), z.any()]).optional(), @@ -74,6 +75,7 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< name: formData.get("name") ?? undefined, tags: rawTags, description: formData.get("description") ?? undefined, + makeup: formData.get("makeup") ?? undefined, instructions: minifiedInstructions, image1: formData.get("image1"), image2: formData.get("image2"), @@ -81,7 +83,7 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< }); if (!parsed.success) return rateLimit.sendResponse({ error: parsed.error.issues[0].message }, 400); - const { name, tags, description, instructions, image1, image2, image3 } = parsed.data; + const { name, tags, description, makeup, instructions, image1, image2, image3 } = parsed.data; // Validate image files const images: File[] = []; @@ -102,6 +104,7 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< if (name !== undefined) updateData.name = profanity.censor(name); // Censor potentially inappropriate words if (tags !== undefined) updateData.tags = tags.map((t) => profanity.censor(t)); if (description !== undefined) updateData.description = profanity.censor(description); + if (makeup !== undefined) updateData.makeup = makeup; if (instructions !== undefined) updateData.instructions = instructions; if (images.length > 0) updateData.imageCount = images.length; diff --git a/src/components/submit-form/edit-form.tsx b/src/components/submit-form/edit-form.tsx index a576ebd..8c77db0 100644 --- a/src/components/submit-form/edit-form.tsx +++ b/src/components/submit-form/edit-form.tsx @@ -4,7 +4,7 @@ import { redirect } from "next/navigation"; import { useCallback, useEffect, useRef, useState } from "react"; import { FileWithPath } from "react-dropzone"; -import { Mii } from "@prisma/client"; +import { Mii, MiiMakeup } from "@prisma/client"; import { nameSchema, tagsSchema } from "@/lib/schemas"; import { defaultInstructions, minifyInstructions } from "@/lib/switch"; @@ -18,6 +18,7 @@ import SubmitButton from "../submit-button"; import Dropzone from "../dropzone"; import MiiEditor from "./mii-editor"; import SwitchSubmitTutorialButton from "../tutorial/switch-submit"; +import { Icon } from "@iconify/react"; interface Props { mii: Mii; @@ -42,6 +43,7 @@ export default function EditForm({ mii, likes }: Props) { const [name, setName] = useState(mii.name); const [tags, setTags] = useState(mii.tags); const [description, setDescription] = useState(mii.description); + const [makeup, setMakeup] = useState(mii.makeup ?? "NONE"); const hasFilesChanged = useRef(false); const instructions = useRef({ ...defaultInstructions, ...(mii.instructions as object as Partial) }); @@ -64,6 +66,7 @@ export default function EditForm({ mii, likes }: Props) { if (name != mii.name) formData.append("name", name); if (tags != mii.tags) formData.append("tags", JSON.stringify(tags)); if (description && description != mii.description) formData.append("description", description); + if (makeup != mii.makeup) formData.append("makeup", makeup); if (minifyInstructions(structuredClone(instructions.current)) !== (mii.instructions as object)) formData.append("instructions", JSON.stringify(instructions.current)); @@ -190,6 +193,53 @@ export default function EditForm({ mii, likes }: Props) { {/* Instructions (Switch only) */} {mii.platform === "SWITCH" && ( <> +
+ + +
+ {/* Full Makeup */} + + + {/* Partial Makeup */} + + + {/* No Makeup */} + +
+
+

Instructions