"use client" import useFreeSRStore from "@/stores/freesrStore"; import useModelStore from "@/stores/modelStore"; import useUserDataStore from "@/stores/userDataStore"; import { CharacterInfoCardType } from "@/types"; import { useState } from "react"; import CharacterInfoCard from "../card/characterInfoCard"; import { freeSRJsonSchema } from "@/zod"; import { toast } from "react-toastify"; import { converterOneFreeSRDataToAvatarStore } from "@/helper"; import { useTranslations } from "next-intl"; export default function FreeSRImport() { const { avatars, setAvatar } = useUserDataStore(); const { setIsOpenImport } = useModelStore() const [isLoading, setIsLoading] = useState(false) const [Error, setError] = useState("") const { freeSRData, setFreeSRData, selectedCharacters, setSelectedCharacters } = useFreeSRStore() const transI18n = useTranslations("DataPage") const handleCharacterToggle = (character: CharacterInfoCardType) => { if (selectedCharacters.some((selectedCharacter) => selectedCharacter.key === character.key)) { setSelectedCharacters(selectedCharacters.filter((selectedCharacter) => selectedCharacter.key !== character.key)); return; } setSelectedCharacters([...selectedCharacters, character]); }; const clearSelection = () => { setSelectedCharacters([]); }; const selectAll = () => { if (freeSRData) { setSelectedCharacters(Object.values(freeSRData?.avatars).map((character) => { const lightcone = freeSRData.lightcones.find((lightcone) => lightcone.equip_avatar === character.avatar_id) const relics = freeSRData.relics.filter((relic) => relic.equip_avatar === character.avatar_id) return { key: character.avatar_id, avatar_id: character.avatar_id, rank: character.data.rank ?? 0, level: character.level, lightcone: { level: lightcone?.level ?? 0, rank: lightcone?.rank ?? 0, item_id: lightcone?.item_id ?? "", }, relics: relics.map((relic) => ({ level: relic.level, relic_id: relic.relic_id, relic_set_id: relic.relic_set_id, })), } as CharacterInfoCardType })); } }; const handlerReadFile = (event: React.ChangeEvent) => { setIsLoading(true) const file = event.target.files?.[0]; console.log(event.target.files) if (!file) { setSelectedCharacters([]) setFreeSRData(null) setError(transI18n("pleaseSelectAFile")) setIsLoading(false) return } if (!file.name.endsWith(".json") || file.type !== "application/json") { setSelectedCharacters([]) setFreeSRData(null) setError(transI18n("fileMustBeAValidJsonFile")) setIsLoading(false) return } if (file) { const reader = new FileReader(); reader.onload = (e) => { try { const data = JSON.parse(e.target?.result as string); const parsed = freeSRJsonSchema.parse(data) setFreeSRData(parsed) setError("") setSelectedCharacters(Object.values(parsed?.avatars || {}).map((character) => { const lightcone = parsed?.lightcones.find((lightcone) => lightcone.equip_avatar === character.avatar_id) const relics = parsed?.relics.filter((relic) => relic.equip_avatar === character.avatar_id) return { key: character.avatar_id, avatar_id: character.avatar_id, rank: character.data.rank ?? 0, level: character.level, lightcone: { level: lightcone?.level ?? 0, rank: lightcone?.rank ?? 0, item_id: lightcone?.item_id ?? "", }, relics: relics?.map((relic) => ({ level: relic.level, relic_id: relic.relic_id, relic_set_id: relic.relic_set_id, })) ?? [], } as CharacterInfoCardType })); } catch (e) { console.log(e) setSelectedCharacters([]) setFreeSRData(null) setError(transI18n("fileMustBeAValidJsonFile")) } }; reader.readAsText(file); setIsLoading(false) } setIsLoading(false) }; const handleImport = () => { if (selectedCharacters.length === 0) { setError(transI18n("pleaseSelectAtLeastOneCharacter")); return; } if (!freeSRData) { setError(transI18n("noDataToImport")); return; } setError(""); const listAvatars = { ...avatars } const filterData = Object.values(freeSRData?.avatars || {}).filter((character) => selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatar_id)) filterData.forEach((character) => { const newAvatar = { ...listAvatars[character.avatar_id] } if (Object.keys(newAvatar).length !== 0) { newAvatar.level = character.level newAvatar.promotion = character.promotion newAvatar.data = { rank: character.data.rank ?? 0, skills: character.data.skills } const newProfile = converterOneFreeSRDataToAvatarStore(freeSRData, newAvatar.profileList.length, character.avatar_id) if (newProfile) { newAvatar.profileList.push(newProfile) newAvatar.profileSelect = newAvatar.profileList.length - 1 } setAvatar(newAvatar) } }) setIsOpenImport(false) toast.success(transI18n("importFreeSRDataSuccess")) } return (
{/* Header */}

{transI18n("freeSRImport")}

{transI18n("pickAFile")}
{selectedCharacters.length > 0 && ( )}
{Error && (
😭 {Error}
)} {/* Selection Info */}
{transI18n("selectedCharacters")}: {selectedCharacters.length}
{isLoading && (
)} {/* Character Grid */}
{Object.values(freeSRData?.avatars || {}).map((character) => { const lightcone = freeSRData?.lightcones.find((lightcone) => lightcone.equip_avatar === character.avatar_id) const relics = freeSRData?.relics.filter((relic) => relic.equip_avatar === character.avatar_id) return ( ({ level: relic.level, relic_id: relic.relic_id, relic_set_id: relic.relic_set_id, })) ?? [], } as CharacterInfoCardType } selectedCharacters={selectedCharacters} onCharacterToggle={handleCharacterToggle} /> ) })}
) }