"use client"; import React, { FC, useEffect, useState } from "react"; import { chuni_static_avatar } from "@/prisma/schemas/artemis/generated/artemis"; import { Check, ChevronsUpDown } from "lucide-react"; import { getCurrentAvatarParts } from "./actions"; import { cn } from "@/lib/utils"; import { Button } from "@/components/ui/button"; import { Command, CommandEmpty, CommandGroup, CommandItem, CommandList, } from "@/components/ui/command"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { z } from "zod"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { toast } from "../../ui/use-toast"; import { updateAvatarParts } from "./actions"; type chunithm_avatar = chuni_static_avatar; const getAvatarTextureSrc = (id: number | undefined) => { if (id === undefined) return ""; return `avatarAccessory/CHU_UI_Avatar_Tex_0${id}.png`; }; type AvatarSelectionProps = { avatarHeadSelectionData: { avatarParts: chunithm_avatar[]; }; avatarFaceSelectionData: { avatarParts: chunithm_avatar[]; }; avatarItemSelectionData: { avatarParts: chunithm_avatar[]; }; avatarBackSelectionData: { avatarParts: chunithm_avatar[]; }; avatarWearSelectionData: { avatarParts: chunithm_avatar[]; }; }; export const AvatarCustomization: FC = ({ avatarHeadSelectionData, avatarFaceSelectionData, avatarItemSelectionData, avatarBackSelectionData, avatarWearSelectionData, }) => { const FormSchema = z.object({ AvatarHeadAccessory: z.number().optional(), AvatarFaceAccessory: z.number().optional(), AvatarItemAccessory: z.number().optional(), AvatarBackAccessory: z.number().optional(), AvatarWearAccessory: z.number().optional(), }); const form = useForm>({ resolver: zodResolver(FormSchema), }); const [avatarFaceId, setAvatarFaceId] = useState( undefined, ); const [avatarSkinId, setAvatarSkinId] = useState( undefined, ); const [avatarHeadId, setAvatarHeadId] = useState( undefined, ); const [avatarWearId, setAvatarWearId] = useState( undefined, ); const [avatarBackId, setAvatarBackId] = useState( undefined, ); const [avatarItemId, setAvatarItemId] = useState( undefined, ); useEffect(() => { const fetchAvatarParts = async () => { try { const data = await getCurrentAvatarParts(); setAvatarFaceId(data[0].avatarFace!); setAvatarSkinId(data[0].avatarSkin!); setAvatarHeadId(data[0].avatarHead!); setAvatarWearId(data[0].avatarWear!); setAvatarBackId(data[0].avatarBack!); setAvatarItemId(data[0].avatarItem!); } catch (error) { console.error("Error fetching avatar parts:", error); } }; fetchAvatarParts(); }, []); function onSubmit(data: z.infer) { // Existing state const defaultHeadId = avatarHeadId; const defaultFaceId = avatarFaceId; const defaultBackId = avatarBackId; const defaultWearId = avatarWearId; const defaultItemId = avatarItemId; // either change to the new body part id or fallback to the default if nothing has changed const newHeadId = data.AvatarHeadAccessory ?? defaultHeadId; const newFaceId = data.AvatarFaceAccessory ?? defaultFaceId; const newBackId = data.AvatarBackAccessory ?? defaultBackId; const newWearId = data.AvatarWearAccessory ?? defaultWearId; const newItemId = data.AvatarItemAccessory ?? defaultItemId; updateAvatarParts(newHeadId, newFaceId, newBackId, newWearId, newItemId) .then(() => { setAvatarHeadId(newHeadId); setAvatarFaceId(newFaceId); setAvatarBackId(newBackId); setAvatarWearId(newWearId); setAvatarItemId(newItemId); toast({ title: "Avatar updated successfully!", description: (
              
                {JSON.stringify(data, null, 2)}
              
            
), }); resetFormValues(); }) .catch((error) => { toast({ title: "Error updating avatar", description: error.message, variant: "destructive", }); }); } function resetFormValues() { form.reset({ AvatarHeadAccessory: undefined, AvatarFaceAccessory: undefined, AvatarItemAccessory: undefined, AvatarBackAccessory: undefined, AvatarWearAccessory: undefined, }); } const getTexture = (id: number | undefined, defaultSrc: string) => { return id ? getAvatarTextureSrc(id) : defaultSrc; }; const AvatarTextures = { AvatarHeadAccessory: { src: getTexture( form.watch("AvatarHeadAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarHeadId}.png`, ), className: "avatar_head", }, AvatarFaceAccessory: { src: getTexture( form.watch("AvatarFaceAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarFaceId}.png`, ), className: "avatar_face", }, AvatarItemAccessoryR: { src: getTexture( form.watch("AvatarItemAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarItemId}.png`, ), className: "avatar_item_r ", }, AvatarItemAccessoryL: { src: getTexture( form.watch("AvatarItemAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarItemId}.png`, ), className: "avatar_item_l ", }, AvatarBackAccessory: { src: getTexture( form.watch("AvatarBackAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarBackId}.png`, ), className: "avatar_back", }, AvatarWearAccessory: { src: getTexture( form.watch("AvatarWearAccessory"), `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarWearId}.png`, ), className: "avatar_wear", }, avatarSkinAccessory: { src: getTexture( avatarSkinId, `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarSkinId}.png`, ), className: "avatar_skin", }, AvatarRightHand: { src: "avatarStatic/CHU_UI_Avatar_Tex_RightHand.png", className: "avatar_hand_r", }, AvatarSkinFootR: { src: `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarSkinId}.png`, className: "avatar_skinfoot_r", }, AvatarLeftHand: { src: "avatarStatic/CHU_UI_Avatar_Tex_LeftHand.png", className: "avatar_hand_l", }, AvatarSkinFootL: { src: `avatarAccessory/CHU_UI_Avatar_Tex_0${avatarSkinId}.png`, className: "avatar_skinfoot_l", }, AvatarFaceStatic: { src: "avatarStatic/CHU_UI_Avatar_Tex_Face.png", className: "avatar_face_static", }, }; return (
{/* Avatar Customization Section */}
{Object.entries(AvatarTextures).map(([key, { className, src }]) => (
{""}
))}
( Avatar Head Item No avatar part found. {avatarHeadSelectionData.avatarParts.map((part) => ( { form.setValue( "AvatarHeadAccessory", part.avatarAccessoryId!, ); }} > {part.name} ))} )} /> ( Avatar Face Item No avatar part found. {avatarFaceSelectionData.avatarParts.map((part) => ( { form.setValue( "AvatarFaceAccessory", part.avatarAccessoryId!, ); }} > {part.name} ))} )} /> ( Avatar Hand Item No avatar part found. {avatarItemSelectionData.avatarParts.map((part) => ( { form.setValue( "AvatarItemAccessory", part.avatarAccessoryId!, ); }} > {part.name} ))} )} /> ( Avatar Back Item No avatar part found. {avatarBackSelectionData.avatarParts.map((part) => ( { form.setValue( "AvatarBackAccessory", part.avatarAccessoryId!, ); }} > {part.name} ))} )} /> ( Avatar Clothing Item No avatar part found. {avatarWearSelectionData.avatarParts.map((part) => ( { form.setValue( "AvatarWearAccessory", part.avatarAccessoryId!, ); }} > {part.name} ))} )} />
{/* Avatar Customization Section */}
); };