/* eslint-disable react-hooks/exhaustive-deps */ "use client"; import { useCallback, useEffect, useMemo } from "react"; import RelicMaker from "../relicBar"; import { motion } from "framer-motion"; import useUserDataStore from "@/stores/userDataStore"; import { useTranslations } from "next-intl"; import RelicCard from "../card/relicCard"; import useModelStore from '@/stores/modelStore'; import { replaceByParam } from '@/helper'; import useRelicMakerStore from '@/stores/relicMakerStore'; import QuickView from "../quickView"; import { ModalConfig } from "@/types"; import useCurrentDataStore from "@/stores/currentDataStore"; import useDetailDataStore from "@/stores/detailDataStore"; import { getLocaleName } from '@/helper'; import useLocaleStore from "@/stores/localeStore"; export default function RelicsInfo() { const { avatars, setAvatars } = useUserDataStore() const { setSelectedRelicSlot, selectedRelicSlot, setSelectedMainStat, setSelectedRelicSet, setSelectedRelicLevel, setListSelectedSubStats, resetHistory, resetSubStat, listSelectedSubStats, } = useRelicMakerStore() const { isOpenRelic, setIsOpenRelic, isOpenQuickView, setIsOpenQuickView } = useModelStore() const transI18n = useTranslations("DataPage") const { avatarSelected } = useCurrentDataStore() const { mapRelicSet, subAffix } = useDetailDataStore() const { locale } = useLocaleStore() const handleShow = (modalId: string) => { const modal = document.getElementById(modalId) as HTMLDialogElement | null; if (modal) { modal.showModal(); } }; // Close modal handler const handleCloseModal = (modalId: string) => { const modal = document.getElementById(modalId) as HTMLDialogElement | null; if (modal) { modal.close(); } }; const getRelic = useCallback((slot: string) => { const avatar = avatars[avatarSelected?.ID.toString() || ""]; if (avatar) { return avatar.profileList[avatar.profileSelect]?.relics[slot] || null; } return null; }, [avatars, avatarSelected]); const handlerDeleteRelic = (slot: string) => { const avatar = avatars[avatarSelected?.ID.toString() || ""]; if (avatar) { delete avatar.profileList[avatar.profileSelect].relics[slot] setAvatars({ ...avatars }); } } const handlerChangeRelic = (slot: string) => { const relic = getRelic(slot) setSelectedRelicSlot(slot) resetSubStat() resetHistory(null) if (relic) { setSelectedMainStat(relic.main_affix_id.toString()) setSelectedRelicSet(relic.relic_set_id.toString()) setSelectedRelicLevel(relic.level) const newSubAffixes: { affixId: string, property: string, rollCount: number, stepCount: number }[] = [...listSelectedSubStats]; relic.sub_affixes.forEach((item, index) => { newSubAffixes[index].affixId = item.sub_affix_id.toString(); newSubAffixes[index].property = subAffix["5"][item.sub_affix_id.toString()]?.Property || ""; newSubAffixes[index].rollCount = item.count || 0; newSubAffixes[index].stepCount = item.step || 0; }) setListSelectedSubStats(newSubAffixes) } else { setSelectedMainStat("") setSelectedRelicSet("") setSelectedRelicLevel(15) const newSubAffixes: { affixId: string, property: string, rollCount: number, stepCount: number }[] = [...listSelectedSubStats]; newSubAffixes.forEach((item) => { item.affixId = "" item.property = "" item.rollCount = 0 item.stepCount = 0 }) setListSelectedSubStats(newSubAffixes) } setIsOpenRelic(true) handleShow("action_detail_modal") } const relicEffects = useMemo(() => { const avatar = avatars[avatarSelected?.ID.toString() || ""]; const relicCount: { [key: string]: number } = {}; if (avatar) { for (const relic of Object.values(avatar.profileList[avatar.profileSelect].relics)) { if (relicCount[relic.relic_set_id]) { relicCount[relic.relic_set_id]++; } else { relicCount[relic.relic_set_id] = 1; } } } const listEffects: { key: string, count: number }[] = []; Object.entries(relicCount).forEach(([key, value]) => { if (value >= 2) { listEffects.push({ key: key, count: value }); } }); return listEffects; }, [avatars, avatarSelected]); const modalConfigs: ModalConfig[] = [ { id: "action_detail_modal", title: "", isOpen: isOpenRelic, onClose: () => { setIsOpenRelic(false) handleCloseModal("action_detail_modal") }, content: }, { id: "quick_view_modal", title: transI18n("quickView").toUpperCase(), isOpen: isOpenQuickView, onClose: () => { setIsOpenQuickView(false) handleCloseModal("quick_view_modal") }, content: } ] // Handle ESC key to close modal useEffect(() => { for (const item of modalConfigs) { if (!item?.isOpen) { handleCloseModal(item?.id || "") } } const handleEscKey = (event: KeyboardEvent) => { if (event.key === 'Escape') { for (const item of modalConfigs) { handleCloseModal(item?.id || "") } } }; window.addEventListener('keydown', handleEscKey); return () => window.removeEventListener('keydown', handleEscKey); }, [isOpenRelic]); return (
{/* Left Section - Items Grid */}

{transI18n("relics")}

{["1", "2", "3", "4", "5", "6"].map((item, index) => (
{ if (item === selectedRelicSlot) { setSelectedRelicSlot("") } else { setSelectedRelicSlot(item) } handlerChangeRelic(item) }} className="cursor-pointer" >
{getRelic(item) && ( )}
))}
{/* Right Section - Stats and Set Effects */}
{/* Set Effects Panel */}

{transI18n("setEffects")}

{relicEffects.map((setEffect, index) => { const relicInfo = mapRelicSet[setEffect.key]; if (!relicInfo) return null; return (
{setEffect.count && ( ({setEffect.count}) )}
{Object.entries(relicInfo.Skills).map(([requireNum, value]) => { if (Number(requireNum) > Number(setEffect.count)) return null; return (
{requireNum}-PC:
) })}
) })}
{modalConfigs.map(({ id, title, onClose, content }) => (
{title && (

{title}

)} {content}
))}
); }