Compare commits

..

1 commit

Author SHA1 Message Date
radishsoups
18c1a627e1
Merge d331d8ed46 into 7e10cef0b8 2026-04-29 13:30:50 +08:00
6 changed files with 70 additions and 806 deletions

View file

@ -38,7 +38,7 @@ const submitSchema = z.object({
.trim() .trim()
.transform((val) => (val === "" ? null : val)) .transform((val) => (val === "" ? null : val))
.refine((val) => val === null || /^[a-zA-Z0-9_-]{11}$/.test(val), "Invalid YouTube video ID") .refine((val) => val === null || /^[a-zA-Z0-9_-]{11}$/.test(val), "Invalid YouTube video ID")
.nullish(), .optional(),
way: z.enum(["savedata", "manual"]).optional(), way: z.enum(["savedata", "manual"]).optional(),
@ -102,8 +102,8 @@ export async function POST(request: NextRequest) {
gender: formData.get("gender") ?? undefined, // ZOD MOMENT gender: formData.get("gender") ?? undefined, // ZOD MOMENT
makeup: formData.get("makeup") ?? undefined, makeup: formData.get("makeup") ?? undefined,
miiPortraitImage: formData.get("miiPortraitImage"), miiPortraitImage: formData.get("miiPortraitImage"),
youtubeId: formData.get("youtubeId") ?? undefined, youtubeId: formData.get("youtubeId"),
way: formData.get("way") ?? undefined, way: formData.get("way"),
miiDataFile: formData.get("miiDataFile") ?? undefined, miiDataFile: formData.get("miiDataFile") ?? undefined,

View file

@ -31,7 +31,6 @@
"react-image-crop": "^11.0.10", "react-image-crop": "^11.0.10",
"react-router": "^7.14.1", "react-router": "^7.14.1",
"tailwindcss": "^4.2.2", "tailwindcss": "^4.2.2",
"vite-plugin-node-polyfills": "^0.26.0",
"zod": "^4.3.6" "zod": "^4.3.6"
}, },
"devDependencies": { "devDependencies": {

View file

@ -1,54 +1,54 @@
import { useState } from "react"; import { useState } from "react";
import { createPortal } from "react-dom"; import { createPortal } from "react-dom";
import { Icon } from "@iconify/react"; import { Icon } from "@iconify/react";
import Tutorial from "."; import Tutorial from ".";
export default function ThreeDsScanTutorialButton() { export default function ThreeDsScanTutorialButton() {
const [isOpen, setIsOpen] = useState(false); const [isOpen, setIsOpen] = useState(false);
return ( return (
<> <>
<button aria-label="Tutorial" type="button" onClick={() => setIsOpen(true)} className="text-3xl cursor-pointer"> <button aria-label="Tutorial" type="button" onClick={() => setIsOpen(true)} className="text-3xl cursor-pointer">
<Icon icon="fa:question-circle" /> <Icon icon="fa:question-circle" />
<span>Tutorial</span> <span>Tutorial</span>
</button> </button>
{isOpen && {isOpen &&
createPortal( createPortal(
<Tutorial <Tutorial
tutorials={[ tutorials={[
{ {
title: "Adding Mii", title: "Adding Mii",
steps: [ steps: [
{ {
text: "1. Enter the town hall", text: "1. Enter the town hall",
imageSrc: "/tutorial/3ds/step1.png", imageSrc: "/tutorial/3ds/step1.png",
}, },
{ {
text: "2. Go into 'QR Code'", text: "2. Go into 'QR Code'",
imageSrc: "/tutorial/3ds/adding-mii/step2.png", imageSrc: "/tutorial/3ds/adding-mii/step2.png",
}, },
{ {
text: "3. Press 'Scan QR Code'", text: "3. Press 'Scan QR Code'",
imageSrc: "/tutorial/3ds/adding-mii/step3.png", imageSrc: "/tutorial/3ds/adding-mii/step3.png",
}, },
{ {
text: "4. Click on the QR code below the Mii's image", text: "4. Click on the QR code below the Mii's image",
imageSrc: "/tutorial/3ds/adding-mii/step4.png", imageSrc: "/tutorial/3ds/adding-mii/step4.png",
}, },
{ {
text: "5. Scan with your 3DS", text: "5. Scan with your 3DS",
imageSrc: "/tutorial/3ds/adding-mii/step5.png", imageSrc: "/tutorial/3ds/adding-mii/step5.png",
}, },
{ type: "finish" }, { type: "finish" },
], ],
}, },
]} ]}
isOpen={isOpen} isOpen={isOpen}
setIsOpen={setIsOpen} setIsOpen={setIsOpen}
/>, />,
document.body, document.body,
)} )}
</> </>
); );
} }

View file

@ -23,7 +23,7 @@ import SwitchFileUpload from "../components/submit-form/switch-file-upload";
import SwitchSubmitTutorialButton from "../components/tutorial/switch-submit"; import SwitchSubmitTutorialButton from "../components/tutorial/switch-submit";
import QrUpload from "../components/submit-form/qr-upload"; import QrUpload from "../components/submit-form/qr-upload";
import Camera from "../components/submit-form/camera"; import Camera from "../components/submit-form/camera";
import ThreeDsSubmitTutorialButton from "../components/tutorial/3ds-submit"; import ThreeDsScanTutorialButton from "../components/tutorial/3ds-scan";
import Dropzone from "../components/dropzone"; import Dropzone from "../components/dropzone";
import ImageList from "../components/submit-form/image-list"; import ImageList from "../components/submit-form/image-list";
import SubmitButton from "../components/submit-button"; import SubmitButton from "../components/submit-button";
@ -472,7 +472,7 @@ export default function SubmitPage() {
Use your camera Use your camera
</button> </button>
<Camera isOpen={isQrScannerOpen} setIsOpen={setIsQrScannerOpen} setQrBytesRaw={setQrBytesRaw} /> <Camera isOpen={isQrScannerOpen} setIsOpen={setIsQrScannerOpen} setQrBytesRaw={setQrBytesRaw} />
<ThreeDsSubmitTutorialButton /> <ThreeDsScanTutorialButton />
<span className="text-xs text-zinc-400">For emulators, aes_keys.txt is required.</span> <span className="text-xs text-zinc-400">For emulators, aes_keys.txt is required.</span>
</div> </div>
</div> </div>

View file

@ -1,20 +1,8 @@
import { defineConfig } from "vite"; import { defineConfig } from "vite";
import react from "@vitejs/plugin-react"; import react from "@vitejs/plugin-react";
import tailwindcss from "@tailwindcss/vite"; import tailwindcss from "@tailwindcss/vite";
import { nodePolyfills } from "vite-plugin-node-polyfills";
// https://vite.dev/config/ // https://vite.dev/config/
export default defineConfig(({ command }) => ({ export default defineConfig({
plugins: [react(), tailwindcss(), nodePolyfills()], plugins: [react(), tailwindcss()],
resolve: { });
alias:
command === "build"
? [
{
find: "vite-plugin-node-polyfills/shims/buffer",
replacement: require.resolve("vite-plugin-node-polyfills/shims/buffer"),
},
]
: [],
},
}));

File diff suppressed because it is too large Load diff