diff --git a/src/app/layout.js b/src/app/layout.js index 4f7acb9d..b77e75d0 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -31,6 +31,28 @@ export default async function RootLayout({ children }) { // const isLoggedIn = await checkSession() const session = await getSession() console.log('session[layout]:', session) + + let sessionProps = {} + + if (session.isLoggedIn) { + sessionProps = { + userId: session.userId, + saleStoreId: session.saleStoreId, + name: session.name, + mail: session.mail, + tel: session.tel, + storeId: session.storeId, + userNm: session.userNm, + userNmKana: session.userNmKana, + category: session.category, + telNo: session.telNo, + fax: session.fax, + email: session.email, + pwdInitYn: session.pwdInitYn, + isLoggedIn: session.isLoggedIn, + } + } + if (!headerPathname.includes('/login') && !session.isLoggedIn) { redirect('/login') } @@ -41,7 +63,7 @@ export default async function RootLayout({ children }) { {/*{headerPathname !== '/login' && }*/}
-
+
diff --git a/src/components/floor-plan/modal/grid/DotLineGrid.jsx b/src/components/floor-plan/modal/grid/DotLineGrid.jsx index a8828b81..9494a6e6 100644 --- a/src/components/floor-plan/modal/grid/DotLineGrid.jsx +++ b/src/components/floor-plan/modal/grid/DotLineGrid.jsx @@ -2,21 +2,225 @@ import WithDraggable from '@/components/common/draggable/withDraggable' import QSelectBox from '@/components/common/select/QSelectBox' import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' +import { canvasState, dotLineGridSettingState, dotLineIntervalSelector } from '@/store/canvasAtom' +import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil' +import { onlyNumberInputChange } from '@/util/input-utils' +import { fabric } from 'fabric' + +const TYPE = { + DOT: 'DOT', + LINE: 'LINE', +} export default function DotLineGrid(props) { // const [modalOption, setModalOption] = useRecoilState(modalState); //modal 열림닫힘 state const [close, setClose] = useState(false) const { setShowDotLineGridModal } = props + const canvas = useRecoilValue(canvasState) + + const [dotLineGridSetting, setDotLineGridSettingState] = useRecoilState(dotLineGridSettingState) + const resetDotLineGridSetting = useResetRecoilState(dotLineGridSettingState) + const interval = useRecoilValue(dotLineIntervalSelector) + const { getMessage } = useMessage() const SelectOption = [ - { id: 1, name: getMessage('modal.canvas.setting.grid.dot.line.setting.line.origin') }, - { id: 2, name: '1/2' }, + { id: 1, name: getMessage('modal.canvas.setting.grid.dot.line.setting.line.origin'), value: 1 }, + { id: 2, name: '1/2', value: 1 / 2 }, { id: 3, name: '1/4', + value: 1 / 4, }, - { id: 4, name: '1/10' }, + { id: 4, name: '1/10', value: 1 / 10 }, ] + const [selectOption, setSelectOption] = useState(SelectOption[0]) + + const HandleClickClose = () => { + // setClose(true) + // setTimeout(() => { + // setModalOption({ ...modalOption, gridoption: false }) + // setClose(false) + // }, 180) + } + + const handleCheckBoxChange = (e) => { + const { value, checked } = e.target + setDotLineGridSettingState((prev) => { + return { + ...prev, + [value]: checked, + } + }) + } + + const handleSave = () => { + // 1. 점.선 그리드 설정으로 만들어진 기존 오브젝트 제거 + canvas + ?.getObjects() + .filter((obj) => obj.name === 'lineGrid') + .forEach((obj) => canvas?.remove(obj)) + canvas + ?.getObjects() + .filter((obj) => obj.name === 'dotGrid') + .forEach((obj) => canvas?.remove(obj)) + + const horizontalInterval = interval.horizontalInterval + const verticalInterval = interval.verticalInterval + + if (dotLineGridSetting.DOT) { + const circle = new fabric.Circle({ + radius: 2, + fill: 'red', + strokeWidth: 0.7, + originX: 'center', + originY: 'center', + selectable: false, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + }) + + const patternSourceCanvas = new fabric.StaticCanvas(null, { + width: horizontalInterval, + height: verticalInterval, + }) + + patternSourceCanvas.add(circle) + + circle.set({ + left: patternSourceCanvas.width / 2, + top: patternSourceCanvas.height / 2, + }) + + patternSourceCanvas.renderAll() + + const pattern = new fabric.Pattern({ + source: patternSourceCanvas.getElement(), + repeat: 'repeat', + }) + + const backgroundPolygon = new fabric.Polygon( + [ + { x: 0, y: 0 }, + { x: canvas.width, y: 0 }, + { x: canvas.width, y: canvas.height }, + { x: 0, y: canvas.height }, + ], + { + fill: pattern, + selectable: false, + name: 'dotGrid', + }, + ) + + canvas.add(backgroundPolygon) + backgroundPolygon.sendToBack() + canvas.renderAll() + } + + if (dotLineGridSetting.LINE) { + for (let i = 0; i < canvas.height / verticalInterval + 1; i++) { + const horizontalLine = new fabric.Line( + [0, i * verticalInterval - verticalInterval / 2, canvas.width, i * verticalInterval - verticalInterval / 2], + { + stroke: 'black', + strokeWidth: 1, + selectable: true, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + name: 'lineGrid', + strokeDashArray: [5, 2], + opacity: 0.3, + direction: 'horizontal', + }, + ) + canvas.add(horizontalLine) + } + + for (let i = 0; i < canvas.width / horizontalInterval + 1; i++) { + const verticalLine = new fabric.Line( + [i * horizontalInterval - horizontalInterval / 2, 0, i * horizontalInterval - horizontalInterval / 2, canvas.height], + { + stroke: 'black', + strokeWidth: 1, + selectable: true, + lockMovementX: true, + lockMovementY: true, + lockRotation: true, + lockScalingX: true, + lockScalingY: true, + name: 'lineGrid', + strokeDashArray: [5, 2], + opacity: 0.3, + direction: 'vertical', + }, + ) + canvas.add(verticalLine) + } + } + + canvas.renderAll() + } + + const handleRadioChange = (e) => { + const { value, name, checked, selected } = e.target + + setDotLineGridSettingState((prev) => { + return { + ...prev, + INTERVAL: { + ...prev.INTERVAL, + type: Number(value), + }, + } + }) + } + + const changeInput = (value, e) => { + const { name } = e.target + setDotLineGridSettingState((prev) => { + return { + ...prev, + INTERVAL: { + ...prev.INTERVAL, + [name]: value, + }, + } + }) + } + + const changeDimension = (result) => { + const { value } = result + setDotLineGridSettingState((prev) => { + return { + ...prev, + INTERVAL: { + ...prev.INTERVAL, + dimension: value, + }, + } + }) + } + + // 초기화 + const reset = () => { + canvas + ?.getObjects() + .filter((obj) => obj.name === 'lineGrid') + .forEach((obj) => canvas?.remove(obj)) + canvas + ?.getObjects() + .filter((obj) => obj.name === 'dotGrid') + .forEach((obj) => canvas?.remove(obj)) + resetDotLineGridSetting() + setSelectOption(SelectOption[0]) + } + return (
@@ -29,55 +233,91 @@ export default function DotLineGrid(props) {
- +
- +
- +
{getMessage('modal.canvas.setting.grid.dot.line.setting.horizon')}
- + onlyNumberInputChange(e, changeInput)} + />
mm
{getMessage('modal.canvas.setting.grid.dot.line.setting.vertical')}
- + onlyNumberInputChange(e, changeInput)} + />
mm
- +
{getMessage('modal.canvas.setting.grid.dot.line.setting.ratio')}
- + onlyNumberInputChange(e, changeInput)} + />
mm
- +
- - + +
diff --git a/src/components/floor-plan/modal/outerlinesetting/OuterLineWall.jsx b/src/components/floor-plan/modal/outerlinesetting/OuterLineWall.jsx index 386e98cd..7d389540 100644 --- a/src/components/floor-plan/modal/outerlinesetting/OuterLineWall.jsx +++ b/src/components/floor-plan/modal/outerlinesetting/OuterLineWall.jsx @@ -8,8 +8,10 @@ import { useEvent } from '@/hooks/useEvent' import { adsorptionPointAddModeState, adsorptionPointModeState, + adsorptionRangeState, canvasHistoryState, canvasState, + dotLineIntervalSelector, verticalHorizontalModeState, } from '@/store/canvasAtom' import { @@ -27,22 +29,22 @@ import { distanceBetweenPoints } from '@/util/canvas-util' import { calculateAngle } from '@/util/qpolygon-utils' import { usePolygon } from '@/hooks/usePolygon' import { onlyNumberInputChange, onlyNumberWithDotInputChange } from '@/util/input-utils' +import { useMouse } from '@/hooks/useMouse' export default function OuterLineWall(props) { const { setShowOutlineModal } = props const { getMessage } = useMessage() - const { - addCanvasMouseEventListener, - addDocumentEventListener, - removeAllMouseEventListeners, - removeAllDocumentEventListeners, - removeMouseEvent, - getIntersectMousePoint, - } = useEvent() + const { addCanvasMouseEventListener, addDocumentEventListener, removeAllMouseEventListeners, removeAllDocumentEventListeners, removeMouseEvent } = + useEvent() + const { getIntersectMousePoint } = useMouse() const { addLine, removeLine } = useLine() + const { addPolygonByLines } = usePolygon() const verticalHorizontalMode = useRecoilValue(verticalHorizontalModeState) const adsorptionPointAddMode = useRecoilValue(adsorptionPointAddModeState) + const adsorptionPointMode = useRecoilValue(adsorptionPointModeState) + const adsorptionRange = useRecoilValue(adsorptionRangeState) + const interval = useRecoilValue(dotLineIntervalSelector) // 가로 세로 간격 const length1Ref = useRef(null) const length2Ref = useRef(null) @@ -72,7 +74,7 @@ export default function OuterLineWall(props) { return () => { removeAllMouseEventListeners() } - }, [verticalHorizontalMode, points, adsorptionPointAddMode]) + }, [verticalHorizontalMode, points, adsorptionPointAddMode, adsorptionPointMode, adsorptionRange, interval]) useEffect(() => { arrow1Ref.current = arrow1 diff --git a/src/components/floor-plan/modal/setting01/SecondOption.jsx b/src/components/floor-plan/modal/setting01/SecondOption.jsx index 867398cc..76ec6eb7 100644 --- a/src/components/floor-plan/modal/setting01/SecondOption.jsx +++ b/src/components/floor-plan/modal/setting01/SecondOption.jsx @@ -110,11 +110,11 @@ export default function SecondOption() { // HTTP POST 요청 보내기 await post({ url: `/api/canvas-management/canvas-settings`, data: patternData }).then((res) => { toastUp({ message: getMessage(res.returnMessage), type: 'success' }) - setAdsorptionRange(option.range) }) } catch (error) { toastUp({ message: getMessage(res.returnMessage), type: 'error' }) } + setAdsorptionRange(option.range) } return ( <> diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 9e84f642..456cb09f 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -1,13 +1,16 @@ 'use client' -import { Fragment, useState } from 'react' +import { Fragment, useCallback, useEffect, useState } from 'react' + import Link from 'next/link' -import { usePathname, useRouter } from 'next/navigation' +import { usePathname } from 'next/navigation' + +import { useRecoilState, useRecoilValue } from 'recoil' +import { dimmedStore, sessionStore } from '@/store/commonAtom' + import { useMessage } from '@/hooks/useMessage' import { logout } from '@/lib/authActions' import QSelectBox from '@/components/common/select/QSelectBox' -import { useRecoilValue } from 'recoil' -import { dimmedStore } from '@/store/commonAtom' export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) @@ -25,7 +28,8 @@ export const ToggleonMouse = (e, act, target) => { } export default function Header(props) { - const { loginedUserNm } = props + const { userSession } = props + const [sessionState, setSessionState] = useRecoilState(sessionStore) const { getMessage } = useMessage() const pathName = usePathname() // if (pathName.includes('login') || pathName.includes('join')) { @@ -65,6 +69,14 @@ export default function Header(props) { }, ] + const syncSession = useCallback(() => { + setSessionState({ ...userSession }) + }) + + useEffect(() => { + syncSession() + }, [userSession]) + const onChangeSelect = (option) => { setSelected(option) } @@ -125,7 +137,7 @@ export default function Header(props) {
- +