"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 `avatarAccessories/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 avatarData = await getCurrentAvatarParts(); const [currentAvatarParts] = avatarData; if (currentAvatarParts) { setAvatarFaceId(currentAvatarParts.avatarFace ?? undefined); setAvatarSkinId(currentAvatarParts.avatarSkin ?? undefined); setAvatarHeadId(currentAvatarParts.avatarHead ?? undefined); setAvatarWearId(currentAvatarParts.avatarWear ?? undefined); setAvatarBackId(currentAvatarParts.avatarBack ?? undefined); setAvatarItemId(currentAvatarParts.avatarItem ?? undefined); // Set initial form values based on fetched data form.reset({ AvatarHeadAccessory: currentAvatarParts.avatarHead ?? undefined, AvatarFaceAccessory: currentAvatarParts.avatarFace ?? undefined, AvatarItemAccessory: currentAvatarParts.avatarItem ?? undefined, AvatarBackAccessory: currentAvatarParts.avatarBack ?? undefined, AvatarWearAccessory: currentAvatarParts.avatarWear ?? undefined, }); } } catch (error) { console.error("Error fetching avatar parts:", error); } }; fetchAvatarParts(); }, [form]); function onSubmit(data: z.infer) { const newHeadId = data.AvatarHeadAccessory ?? avatarHeadId; const newFaceId = data.AvatarFaceAccessory ?? avatarFaceId; const newBackId = data.AvatarBackAccessory ?? avatarBackId; const newWearId = data.AvatarWearAccessory ?? avatarWearId; const newItemId = data.AvatarItemAccessory ?? avatarItemId; 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"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarHeadId}.png`, ), className: "avatar_head", }, AvatarFaceAccessory: { src: getTexture( form.watch("AvatarFaceAccessory"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarFaceId}.png`, ), className: "avatar_face", }, AvatarItemAccessoryR: { src: getTexture( form.watch("AvatarItemAccessory"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarItemId}.png`, ), className: "avatar_item_r ", }, AvatarItemAccessoryL: { src: getTexture( form.watch("AvatarItemAccessory"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarItemId}.png`, ), className: "avatar_item_l ", }, AvatarBackAccessory: { src: getTexture( form.watch("AvatarBackAccessory"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarBackId}.png`, ), className: "avatar_back", }, AvatarWearAccessory: { src: getTexture( form.watch("AvatarWearAccessory"), `avatarAccessories/CHU_UI_Avatar_Tex_0${avatarWearId}.png`, ), className: "avatar_wear", }, avatarSkinAccessory: { src: getTexture( avatarSkinId, `avatarAccessories/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: `avatarAccessories/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: `avatarAccessories/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 }]) => (
{key}
))}
( 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} ))} )} />
); };