diff --git a/src/app/floor-plan/FloorPlanProvider.js b/src/app/floor-plan/FloorPlanProvider.js index 649deb78..efed75e6 100644 --- a/src/app/floor-plan/FloorPlanProvider.js +++ b/src/app/floor-plan/FloorPlanProvider.js @@ -2,7 +2,7 @@ import { correntObjectNoState } from '@/store/settingAtom' import { notFound, usePathname, useSearchParams } from 'next/navigation' -import { createContext, useReducer, useState } from 'react' +import { createContext, useReducer, useState, useEffect } from 'react' import { useSetRecoilState } from 'recoil' const reducer = (prevState, nextState) => { @@ -48,12 +48,14 @@ const FloorPlanProvider = ({ children }) => { const objectNo = searchParams.get('objectNo') const pid = searchParams.get('pid') - if (pathname === '/floor-plan') { - if (pid === undefined || pid === '' || pid === null || objectNo === undefined || objectNo === '' || objectNo === null) { - notFound() + useEffect(() => { // 오류 발생으로 useEffect 사용 + if (pathname === '/floor-plan') { + if (pid === undefined || pid === '' || pid === null || objectNo === undefined || objectNo === '' || objectNo === null) { + notFound() + } + setCurrentObjectNo(objectNo) } - setCurrentObjectNo(objectNo) - } + }, [pid, objectNo]) const [floorPlanState, setFloorPlanState] = useState({ // 플랜 파일 업로드 모달 오픈 제어 diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index 763e3c95..230eecd1 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -254,10 +254,19 @@ export default function Playground() { }) } - const [getFetcherCallFlag, setGetFetcherCallFlag] = useState(false) - const { data: tutoData, error, isLoading } = useSWR('http://localhost:8080/api/tutorial', getFetcher) + const [callFlag, setCallFlag] = useState(false) + // const { data: tutoData, error, isLoading } = useSWR('http://localhost:8080/api/tutorial', getFetcher) + const { data: tutoData, error, isLoading } = useSWR(callFlag ? 'http://localhost:8080/api/tutorial' : null, getFetcher) const { trigger, isMutating } = useSWRMutation('http://localhost:8080/api/tutorial', postFetcher) + if (isLoading) { + return
Loading...
+ } + + if (error) { + return
Error...
+ } + return ( <>
@@ -571,7 +580,12 @@ export default function Playground() { ))}
- + +
+
+
diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 6f5fb140..5ef2c9da 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -74,7 +74,6 @@ export default function Estimate({}) { const { estimateContextState, setEstimateContextState, addItem, handleEstimateFileDownload } = useEstimateController(currentPid) const { selectedPlan } = usePlan() - const router = useRouter() //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) @@ -299,12 +298,16 @@ export default function Estimate({}) { } else { if (originFiles.length > 0) { if (isEmptyArray(files)) { - let file - file = originFiles.filter((item) => item.delFlg === '0') - setEstimateContextState({ - originFiles: file, - }) - setOriginFiles(file) + if (originFiles[0].planNo !== estimateContextState.planNo) { + setOriginFiles([]) + } else { + let file + file = originFiles.filter((item) => item.delFlg === '0') + setEstimateContextState({ + originFiles: file, + }) + setOriginFiles(file) + } } } } @@ -1002,6 +1005,7 @@ export default function Estimate({}) {
{getMessage('estimate.detail.objectNo')}
+ {/* {objectNo} (Plan No: {estimateContextState.planNo}) */} {objectNo} (Plan No: {planNo})
diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index c3465ca6..c314dd2a 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -2,7 +2,7 @@ import { useContext, useEffect, useState } from 'react' -import { usePathname, useRouter } from 'next/navigation' +import { usePathname, useRouter, useSearchParams } from 'next/navigation' import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' @@ -63,7 +63,7 @@ export default function CanvasMenu(props) { const canvas = useRecoilValue(canvasState) const { handleZoomClear, handleZoom } = useCanvasEvent() const { handleMenu } = useMenu() - + // const urlParams = useSearchParams() const { handleEstimateSubmit, fetchSetting } = useEstimateController() const estimateRecoilState = useRecoilValue(estimateState) const [estimatePopupOpen, setEstimatePopupOpen] = useState(false) @@ -85,7 +85,6 @@ export default function CanvasMenu(props) { const selectedRoofMaterial = useRecoilValue(selectedRoofMaterialSelector) //견적서버튼 노출용 - const [buttonStyle, setButtonStyle] = useState('') //시연용 원복 const [buttonStyle1, setButtonStyle1] = useState('') //문서 다운로드 버튼 const [buttonStyle2, setButtonStyle2] = useState('') //저장 버튼 const [buttonStyle3, setButtonStyle3] = useState('') //초기화 버튼 @@ -173,6 +172,7 @@ export default function CanvasMenu(props) { setType('module') break case 5: + // let pid = urlParams.get('pid') promiseGet({ url: `/api/estimate/${objectNo}/${pid}/detail` }).then((res) => { if (res.status === 200) { const estimateDetail = res.data @@ -309,10 +309,9 @@ export default function CanvasMenu(props) { }, [type, globalLocale]) useEffect(() => { - console.log('🚀 ~ useEffect ~ basicSetting:', basicSetting) - if (Object.keys(basicSetting).length === 0 || !basicSetting.roofSizeSet) return - - // setMenuNumber(1) + if (!selectedRoofMaterial) return + //if (Object.keys(basicSetting).length === 0 || !basicSetting.roofSizeSet) return + setMenuNumber(1) // if ([2, 3].some((num) => num === canvasSetting?.roofSizeSet)) { // setMenuNumber(3) // setType('surface') @@ -322,7 +321,8 @@ export default function CanvasMenu(props) { // setType('outline') // setCurrentMenu(MENU.ROOF_COVERING.EXTERIOR_WALL_LINE) // } - }, [basicSetting]) + }, [selectedRoofMaterial]) + const checkMenuState = (menu) => { return (['2', '3'].includes(canvasSetting?.roofSizeSet) && menu.index === 2) || (menuNumber === 4 && menu.index === 2) } diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index b18821f3..f2bb0103 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -43,15 +43,15 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set //치수 입력방법(복시도입력/실측값입력/육지붕) const roofSizeSetArray = [ - { id: 'ra01', name: 'roofSizeSet', value: '1', checked: 'ture', message: 'modal.placement.initial.setting.size.roof' }, - { id: 'ra02', name: 'roofSizeSet', value: '2', checked: 'false', message: 'modal.placement.initial.setting.size.actual' }, - { id: 'ra03', name: 'roofSizeSet', value: '3', checked: 'false', message: 'modal.placement.initial.setting.size.none.pitch' }, + { id: 'ra01', name: 'roofSizeSet', value: '1', message: 'modal.placement.initial.setting.size.roof' }, + { id: 'ra02', name: 'roofSizeSet', value: '2', message: 'modal.placement.initial.setting.size.actual' }, + { id: 'ra03', name: 'roofSizeSet', value: '3', message: 'modal.placement.initial.setting.size.none.pitch' }, ] //지붕각도 설정(경사/각도) const roofAngleSetArray = [ - { id: 'ra04', name: 'roofAngleSet', value: 'slope', checked: 'true', message: 'modal.placement.initial.setting.roof.pitch'}, - { id: 'ra05', name: 'roofAngleSet', value: 'flat', checked: 'false', message: 'modal.placement.initial.setting.roof.angle' }, + { id: 'ra04', name: 'roofAngleSet', value: 'slope', message: 'modal.placement.initial.setting.roof.pitch'}, + { id: 'ra05', name: 'roofAngleSet', value: 'flat', message: 'modal.placement.initial.setting.roof.angle' }, ] // 데이터를 최초 한 번만 조회 @@ -59,12 +59,17 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set if (!basicSetting || !currentRoof || Object.keys(currentRoof).length === 0 || Object.keys(basicSetting).length === 0) return const raftCodeList = findCommonCode('203800') setRaftCodes(raftCodeList) - setCurrentRoof({ ...currentRoof, roofSizeSet: basicSetting.roofSizeSet, roofAngleSet: basicSetting.roofAngleSet }) - console.log('🚀 ~ fetchBasicSettings ~ currentRoof 11:', currentRoof) + + if (addedRoofs[0].roofAngleSet && addedRoofs[0].roofAngleSet?.length > 0) { + setCurrentRoof({ ...currentRoof, roofSizeSet: String(addedRoofs[0].roofSizeSet), roofAngleSet: addedRoofs[0].roofAngleSet }) + } else if (basicSetting.roofAngleSet && basicSetting.roofAngleSet?.length > 0) { + setCurrentRoof({ ...currentRoof, roofSizeSet: String(basicSetting.roofSizeSet), roofAngleSet: basicSetting.roofAngleSet }) + } }, []) useEffect(() => { - console.log('🚀 ~ fetchBasicSettings ~ currentRoof 22:', currentRoof) + console.log('🚀 ~ fetchBasicSettings ~ currentRoof :', currentRoof) + if(!currentRoof) return setBasicSettings({ ...basicSetting, roofSizeSet: String(currentRoof.roofSizeSet), @@ -194,14 +199,12 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set
{currentRoof && roofSizeSetArray.map((item) => ( -
+
setCurrentRoof({ ...currentRoof, roofSizeSet: e.target.value })} /> @@ -217,14 +220,12 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, set
{currentRoof && roofAngleSetArray.map((item) => ( -
+
setCurrentRoof({ ...currentRoof, roofAngleSet: e.target.value })} /> diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 263158a4..1a39e9e1 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -19,6 +19,8 @@ import { globalLocaleStore } from '@/store/localeAtom' import { stuffSearchState } from '@/store/stuffAtom' import { QcastContext } from '@/app/QcastProvider' +import { usePopup } from '@/hooks/usePopup' + export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) const ListItem = Array.from(listWrap.childNodes) @@ -39,6 +41,8 @@ export default function Header(props) { const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) + const { closeAll } = usePopup() + const { userSession } = props const [sessionState, setSessionState] = useRecoilState(sessionStore) const { getMessage } = useMessage() @@ -176,6 +180,9 @@ export default function Header(props) { onClick={() => { // moveHome() removeStuffRecoil(menu) + if (pathName === '/') { + window.location.reload() + } }} > {getMessage(menu.name)} @@ -226,6 +233,9 @@ export default function Header(props) { ...stuffSearch, code: 'DELETE', }) + if (pathName === '/') { + window.location.reload() + } }} > @@ -239,6 +249,7 @@ export default function Header(props) { href="#" onClick={() => { setUserInfoModal(true) + closeAll() }} > diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index cdcf8fe7..66b0974c 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -88,6 +88,8 @@ export const useEstimateController = (planNo) => { setIsGlobalLoading(false) } catch (error) { console.error('견적서 상세조회 Error: ', error) + + swalFire({ text: getMessage('estimate.menu.move.valid1') }) setIsLoading(true) setIsGlobalLoading(false) } diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 3b956843..39487361 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -156,7 +156,13 @@ export function useRoofAllocationSetting(id) { } setCurrentRoofList(selectRoofs) - setBasicSetting({ ...basicSetting, roofsData: roofsArray }) + //setBasicSetting({ ...basicSetting, roofsData: roofsArray }) + setBasicSetting({ + ...basicSetting, + roofSizeSet: res[0].roofSizeSet, + roofAngleSet: res[0].roofAngleSet, + roofsData: roofsArray, + }) }) } catch (error) { console.error('Data fetching error:', error) diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index f7848be5..db170dc7 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -14,7 +14,7 @@ import { useCanvas } from '@/hooks/useCanvas' import { SAVE_KEY } from '@/common/common' import { readImage, removeImage } from '@/lib/fileAction' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' - +import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' export function usePlan(params = {}) { const { floorPlanState } = useContext(FloorPlanContext) @@ -31,8 +31,9 @@ export function usePlan(params = {}) { const { swalFire } = useSwal() const { getMessage } = useMessage() - const { get, promisePost, promisePut, promiseDel } = useAxios() + const { get, promisePost, promisePut, promiseDel, promiseGet } = useAxios() + const { setEstimateContextState } = useEstimateController() /** * 마우스 포인터의 가이드라인을 제거합니다. */ @@ -203,12 +204,44 @@ export function usePlan(params = {}) { * 현재 plan의 작업상태를 저장 후 이동 */ const handleCurrentPlan = async (newCurrentId) => { - if (pathname === '/floor-plan') { - if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) { - await saveCanvas() - } - } - updateCurrentPlan(newCurrentId) + const orderingNo = plans?.find((obj) => obj.id === newCurrentId).ordering + const objectNo = floorPlanState.objectNo + await promiseGet({ url: `/api/estimate/${objectNo}/${orderingNo}/detail` }) + .then((res) => { + if (res.status === 200) { + const estimateDetail = res.data + if (estimateDetail.docNo) { + res.data.resetFlag = 'N' + + if (res.data.itemList.length > 0) { + res.data.itemList.map((item) => { + item.delFlg = '0' + }) + } + if (res.data.pkgAsp === null || res.data.pkgAsp == undefined) { + res.data.pkgAsp = '0.00' + } else { + const number = parseFloat(res.data.pkgAsp) + const roundedNumber = isNaN(number) ? '0.00' : number.toFixed(2) + + res.data.pkgAsp = roundedNumber.toString() + } + setEstimateContextState(res.data) + + if (pathname === '/floor-plan') { + if (!currentCanvasPlan || currentCanvasPlan.id !== newCurrentId) { + saveCanvas() + } + } + updateCurrentPlan(newCurrentId) + } else { + swalFire({ text: getMessage('estimate.menu.move.valid1') }) + } + } + }) + .catch((error) => { + swalFire({ text: getMessage('estimate.menu.move.valid1') }) + }) } const updateCurrentPlan = (newCurrentId) => {