/* eslint-disable @typescript-eslint/no-explicit-any */
import { memo, useCallback, useEffect, useMemo, useRef } from "react"
import * as THREE from "three"
import PanelDimensions from "@/assets/PanelDimension.json"
import ExtrudeSettings from "@/assets/ExtrudeSetting.json"
import { useDraggable } from "@/store/useDraggable"
import { useShallow } from "zustand/react/shallow"
import { ThreeEvent, useFrame } from "@react-three/fiber"
import { useMaterialStore } from "@/store/useMaterialStore"
import { throttle } from 'lodash'
import { useWallModuleCalculator } from "@/utils/useWallModuleCalculator"
// import DoorList from "@/assets/3dObject/DoorMeta.json"
import BattenDimension from "@/assets/BattenDimesion.json"
interface PanelProps {
wallWidth: number
eaveHeight: number
rotation: number[]
position: number[]
planePos: number[]
planeRotY: number,
label: string
}
type CategorizedModel = {
key: number;
position: number;
};
const Panel = ({
wallWidth,
rotation,
position,
eaveHeight,
planePos,
planeRotY,
label
}: PanelProps) => {
const modelList = useRef<any>({
window: [],
doorM12: [],
doorM25: [],
doorM30: [],
doorM50: [],
});
const moduleList = useRef<any>([]);
const [
dragItem,
objectPosition,
isOnWall,
alignModelList,
addAlignModel,
setObjectPosition,
setIsOnWall,
setRotY,
] = useDraggable(useShallow((state) => [
state.dragItem,
state.objectPosition,
state.isOnWall,
state.alignModelList,
state.addAlignModel,
state.setObjectPosition,
state.setIsOnWall,
state.setRotY,
]))
const handlePointerMove = (e: ThreeEvent<PointerEvent>) => {
e.stopPropagation()
}
const handlePointerEnter = (e: ThreeEvent<PointerEvent>) => {
e.stopPropagation()
console.log('Pointer entered mesh:', label);
if (!dragItem) return
setRotY(planeRotY)
setIsOnWall(true)
}
useEffect(() => {
if (!dragItem) return;
const categorizedModels: Record<string, CategorizedModel[]> = {
window: [],
doorM12: [],
doorM25: [],
doorM30: [],
doorM50: [],
}
const tempList = [...alignModelList.models]
// if (updateDrag > -1)
// tempList = tempList.filter((_, index) => (index !== updateDrag))
tempList.forEach((item, i) => {
if (item.label !== label) return
const pos = (label === 'front' || label === 'back') ? item.position[0] : item.position[2]
categorizedModels[item.type]?.push({
key: i,
position: wallWidth / 2 + pos
})
})
modelList.current = categorizedModels
}, [dragItem])
const handlePointerLeave = (e: ThreeEvent<PointerEvent>) => {
e.stopPropagation()
setIsOnWall(false)
if (dragItem) {
setObjectPosition(null)
}
}
const handlePointerUp = (e: ThreeEvent<PointerEvent>) => {
e.stopPropagation()
if (dragItem && isOnWall && objectPosition) {
const collector: any = []
moduleList.current.map((item: any) => {
const pos = (label === "front") ? item.Pos - wallWidth / 2 : ((label === "back") ? -item.Pos + wallWidth / 2 : ((label === "right") ? item.Pos - wallWidth / 2 : -item.Pos + wallWidth / 2))
collector.push([pos, item.Size, label, item.Module])
})
const updates = moduleList.current
.filter((ele: any) => ele.Contain !== '')
.map((ele: any) => ({
type: label,
pos: ele.Pos - wallWidth / 2,
index: ele.key ?? 0,
}));
addAlignModel({
model: {
...dragItem,
position: objectPosition,
rotation: [0, planeRotY - Math.PI / 2, 0],
scale: [1, 1, 1],
label: label
},
collector: collector,
updates: updates
})
} else
setIsOnWall(false)
}
return (
<mesh
ref={meshRef}
onPointerMove={handlePointerMove}
onPointerEnter={handlePointerEnter}
onPointerLeave={handlePointerLeave}
onPointerOut={handlePointerLeave}
onPointerUp={handlePointerUp}
rotation={[0, planeRotY, 0]}
position={[planePos[0], planePos[1], planePos[2]]}
>
<planeGeometry args={[wallWidth, eaveHeight]} />
<meshBasicMaterial color="white" side={THREE.DoubleSide} transparent opacity={0} />
</mesh>
)
}
export default memo(Panel)```