"use client"; import { useEffect, useMemo, useState } from "react"; import { Plus, Trash2, ChevronUp, ChevronDown, Search, CopyPlus, } from "lucide-react"; import useMazeStore from "@/stores/mazeStore"; import useUserDataStore from "@/stores/userDataStore"; import useMonsterStore from "@/stores/monsterStore"; import useLocaleStore from "@/stores/localeStore"; import { getLocaleName } from "@/helper"; import Image from "next/image"; import { MonsterBasic } from "@/types"; import { useTranslations } from "next-intl"; import useGlobalStore from "@/stores/globalStore"; export default function CeBar() { const [searchTerm, setSearchTerm] = useState(""); const [showSearchWaveId, setShowSearchWaveId] = useState(null); const { Stage } = useMazeStore() const { ce_config, setCeConfig } = useUserDataStore() const { listMonster, mapMonster } = useMonsterStore() const { locale } = useLocaleStore() const transI18n = useTranslations("DataPage") const [showSearchStage, setShowSearchStage] = useState(false) const [stageSearchTerm, setStageSearchTerm] = useState("") const [stagePage, setStagePage] = useState(1) const { extraData, setExtraData } = useGlobalStore() const pageSize = 30 const pageSizeMonsters = 30 const [monsterPage, setMonsterPage] = useState(1) const filteredMonsters = useMemo(() => { const newlistMonster = new Set() for (const monster of listMonster) { if (getLocaleName(locale, monster).toLowerCase().includes(searchTerm.toLowerCase())) { newlistMonster.add(monster) } if (monster.id.toLowerCase().includes(searchTerm.toLowerCase())) { newlistMonster.add(monster) } } return Array.from(newlistMonster) }, [listMonster, locale, searchTerm]); const paginatedMonsters = useMemo(() => filteredMonsters.slice((monsterPage - 1) * pageSizeMonsters, monsterPage * pageSizeMonsters), [filteredMonsters, monsterPage] ) const hasMoreMonsterPages = useMemo( () => monsterPage * pageSizeMonsters < filteredMonsters.length, [monsterPage, filteredMonsters] ) useEffect(() => { setMonsterPage(1) }, [searchTerm]) const stageList = useMemo(() => Object.values(Stage).map((stage) => ({ id: stage.stage_id.toString(), name: `${stage.stage_type} (${stage.stage_id})`, })), [Stage]) const filteredStages = useMemo(() => stageList.filter((s) => s.name.toLowerCase().includes(stageSearchTerm.toLowerCase()) ), [stageList, stageSearchTerm]) const paginatedStages = useMemo(() => filteredStages.slice( (stagePage - 1) * pageSize, stagePage * pageSize ), [filteredStages, stagePage, pageSize]) const hasMorePages = useMemo(() => stagePage * pageSize < filteredStages.length, [stagePage, filteredStages]) useEffect(() => { setStagePage(1) }, [stageSearchTerm]) useEffect(() => { if (!ce_config) return if (!extraData || !extraData.theory_craft?.mode) return const newExtraData = structuredClone(extraData) if (!newExtraData?.theory_craft?.hp) { newExtraData.theory_craft!.hp = {} } for (let i = 0; i < ce_config.monsters.length; i++) { const waveKey = (i + 1).toString() if (!newExtraData.theory_craft!.hp[waveKey]) { newExtraData.theory_craft!.hp[waveKey] = [] } for (let j = 0; j < ce_config.monsters[i].length; j++) { if (newExtraData.theory_craft!.hp[waveKey][j] === undefined) { newExtraData.theory_craft!.hp[waveKey][j] = 0 } } } setExtraData(newExtraData) // eslint-disable-next-line react-hooks/exhaustive-deps }, [ce_config]) return (
{ setShowSearchWaveId(null) setShowSearchStage(false) }}>
{showSearchStage && (
e.stopPropagation()} className="absolute top-full mt-2 w-full z-50 border bg-base-200 border-slate-600 rounded-lg p-4 shadow-lg">
{paginatedStages.length > 0 ? ( <> {paginatedStages.map((stage) => (
{ if (ce_config.stage_id !== Number(stage.id)) { setCeConfig({ ...ce_config, stage_id: Number(stage.id), cycle_count: 30 }) } setShowSearchStage(false) setStageSearchTerm("") }} > {stage.name}
))} ) : (
{transI18n("noStageFound")}
)}
{paginatedStages.length > 0 && (
)}
)}
{ce_config.monsters.map((wave, waveIndex) => (

{transI18n("wave")} {waveIndex + 1}

{wave.map((member, memberIndex) => (
{mapMonster?.[member.monster_id.toString()]?.icon && Enemy Icon}
{mapMonster?.[member.monster_id.toString()]?.weak?.map((icon, iconIndex) => ( {icon} ))}
{getLocaleName(locale, mapMonster?.[member.monster_id.toString()])} {`(${member.monster_id})`}
LV. { const val = Number(e.target.value) if (isNaN(val) || val < 1 || val > 95) return if (ce_config.monsters[waveIndex][memberIndex].level === val) return const newCeConfig = structuredClone(ce_config) newCeConfig.monsters[waveIndex][memberIndex].level = val setCeConfig(newCeConfig) }} />
{(extraData?.theory_craft?.mode === true && (
HP { const val = Number(e.target.value) if (isNaN(val) || val < 0) return const newData = structuredClone(extraData) if (!newData?.theory_craft?.hp?.[(waveIndex + 1).toString()]) { newData.theory_craft!.hp![(waveIndex + 1).toString()] = [] } newData.theory_craft!.hp![(waveIndex + 1).toString()][memberIndex] = val setExtraData(newData) }} />
))}
))} {/* Add Member Button + Search */}
e.stopPropagation()} > {showSearchWaveId === waveIndex && (
{paginatedMonsters.length > 0 ? ( paginatedMonsters.map((monster) => (
{ const newCeConfig = structuredClone(ce_config) newCeConfig.monsters[waveIndex].push({ monster_id: Number(monster.id), level: 95, amount: 1, }) setCeConfig(newCeConfig) setShowSearchWaveId(null) }} >
{mapMonster?.[monster.id.toString()]?.icon && ( Enemy Icon )}
{getLocaleName(locale, monster)} {`(${monster.id})`}
)) ) : (
{transI18n("noMonstersFound")}
)}
{filteredMonsters.length > 0 && (
)}
)}
))} {/* Add New Wave Button */}
); }