'use client' import { useEffect, useState, memo, useCallback } from 'react' import { Button, Checkbox, CheckboxGroup, RadioGroup, Radio, Input, Select, SelectItem } from '@nextui-org/react' import { useRecoilState, useRecoilValue } from 'recoil' import { modalContent, modalState } from '@/store/modalAtom' import { canvasSettingState } from '@/store/canvasAtom' import { useAxios } from '@/hooks/useAxios' import { get, post } from '@/lib/Axios' export default function InitSettingsModal(props) { const [objectNo, setObjectNo] = useState('test123240909002') // 후에 삭제 필요 const [lastRoofSeq, setLastRoofSeq] = useState(0) // 마지막 roofSeq를 추적 const [open, setOpen] = useRecoilState(modalState) const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) const [roofMaterials, setRoofMaterials] = useState([]) const [basicSetting, setBasicSettings] = useState({ roofDrawingSet: '1', roofSizeSet: '1', roofAngleSet: 'slope', roofs: [], }) const modelProps = { open, setOpen, } //const { get, post } = useAxios() useEffect(() => { get({ url: '/api/roof-material/roof-material-infos' }).then((res) => { //TODO: error handling if (!res) return setRoofMaterials(res) }) get({ url: `/api/canvas-management/canvas-basic-settings/by-object/${objectNo}` }).then((res) => { if (res.length == 0) return // 'roofs' 배열을 생성하여 각 항목을 추가 const roofsRow = res.map((item) => { return { roofDrawingSet: String(item.roofDrawingSet), roofSizeSet: String(item.roofSizeSet), roofAngleSet: item.roofAngleSet, } }) const roofsArray = res.some((item) => !item.roofSeq) ? null //지붕재 추가 정보가 없다면 roofsArray를 null 처리하여 지붕재 추가 정보가 보이지 않게 한다. : res.map((item) => ({ roofSeq: String(item.roofSeq), roofType: String(item.roofType), roofWidth: String(item.roofWidth), roofHeight: String(item.roofHeight), roofGap: String(item.roofGap), roofLayout: item.roofLayout, })) // 나머지 데이터와 함께 'roofs' 배열을 patternData에 넣음 const patternData = { roofDrawingSet: roofsRow[0].roofDrawingSet, // 첫 번째 항목의 값을 사용 roofSizeSet: roofsRow[0].roofSizeSet, // 첫 번째 항목의 값을 사용 roofAngleSet: roofsRow[0].roofAngleSet, // 첫 번째 항목의 값을 사용 roofs: roofsArray, // 만들어진 roofs 배열 } // 데이터 설정 setBasicSettings({ ...patternData }) // 초기 roofSeq 값을 업데이트 if (roofsArray == null) { //roofs(지붕재추가) 값이 없으면 lastRoofSeq는 1 설정 setLastRoofSeq(1) } else { setLastRoofSeq(roofsArray.length + 1) } }) if (!(Object.keys(canvasSetting).length === 0 && canvasSetting.constructor === Object)) { setBasicSettings({ ...canvasSetting }) } }, []) //기본 설정값 변경 함수 const handleBasicSetting = (event) => { const newBasicSetting = { ...basicSetting, [event.target.name]: event.target.value } setBasicSettings(newBasicSetting) } //배열 추가 함수 const addRoofSetting = () => { if (basicSetting.roofs != null && basicSetting.roofs.length === 4) { alert('지붕재는 최대 4종까지 선택할 수 있습니다.') return } //roofs가 null인 경우 배열 생성 if (basicSetting.roofs == null) { basicSetting.roofs = [] } //기본값 const newRoofSettings = { //roofSeq: basicSetting.roofs.length + 1, roofSeq: lastRoofSeq, // 마지막 roofSeq를 1 증가 roofType: '3', roofWidth: '200', roofHeight: '200', roofGap: '0', roofLayout: 'parallel', } setBasicSettings((prevState) => ({ ...prevState, roofs: [...prevState.roofs, newRoofSettings], })) setLastRoofSeq(newRoofSettings.roofSeq + 1) // roofSeq 값을 업데이트 } //배열 값 변경 함수 const handleRoofSettings = (id, event) => { console.log(id) // 기본 세팅에서 roofs 배열을 복사 const updatedRoofs = [...basicSetting.roofs] // roofSeq가 id와 일치하는 항목의 인덱스 찾기 const index = updatedRoofs.findIndex((roof) => roof.roofSeq === id) if (index !== -1) { // 해당 인덱스의 항목을 수정 updatedRoofs[index] = { ...updatedRoofs[index], [event.target.name]: event.target.value, } // 수정된 배열을 상태에 반영 setBasicSettings((prevState) => ({ ...prevState, roofs: updatedRoofs, })) } // const roof = basicSetting.roofs.map((roof, i) => (id === roof.roofSeq ? { ...roof, [event.target.name]: event.target.value } : roof)) // setBasicSettings((prevState) => ({ // ...prevState, // roofs: [...roof], // })) } //저장 const submitCanvasConfig = async () => { if (!objectNo) { alert('object_no를 입력하세요.') return } const patternData = { objectNo, roofDrawingSet: basicSetting.roofDrawingSet, roofSizeSet: basicSetting.roofSizeSet, roofAngleSet: basicSetting.roofAngleSet, roofMaterialsAddList: basicSetting.roofs, } await post({ url: `/api/canvas-management/canvas-basic-settings`, data: patternData }) //Recoil 설정 setCanvasSetting({ ...basicSetting }) // 저장 후 재조회 //await handleSelect() } // 삭제버튼 클릭시 해당 요소 id를 targetId로 전달받음 const onRemove = async (targetId) => { console.log(targetId) setBasicSettings((prevState) => ({ ...prevState, roofs: prevState.roofs.filter((roof) => roof.roofSeq !== targetId), })) // setBasicSettings({ ...newRoofSettings }) // 삭제한 데이터 배열을 setData()에 상태를 변화시킴 } return ( <>