diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index 4658ef6f..bf8ef23c 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -14,7 +14,7 @@ export default function QContextMenu(props) { if (activeObject) { if (activeObject.initOptions) { //이건 바뀔 가능성이 있음 - if (activeObject.initOptions.name.indexOf('guide') > -1) { + if (activeObject.initOptions?.name?.indexOf('guide') > -1) { contextType = 'surface' //면형상 } } diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 5923888f..7c3e6c7c 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -1,7 +1,15 @@ -export default function CanvasFrame () { - return( -
- -
- ) -} \ No newline at end of file +import { useCanvas } from '@/hooks/useCanvas' +import { useRef } from 'react' +import { useEvent } from '@/hooks/useEvent' + +export default function CanvasFrame() { + const canvasRef = useRef(null) + useCanvas('canvas') + useEvent() + + return ( +
+ +
+ ) +} diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js new file mode 100644 index 00000000..3c304b8f --- /dev/null +++ b/src/hooks/useEvent.js @@ -0,0 +1,80 @@ +import { useEffect, useRef } from 'react' +import { useRecoilValue } from 'recoil' +import { canvasState, stepState } from '@/store/canvasAtom' + +export function useEvent() { + const canvas = useRecoilValue(canvasState) + const step = useRecoilValue(stepState) + const keyboardEventListeners = useRef([]) + + useEffect(() => { + if (!canvas) { + return + } + Object.keys(canvas.__eventListeners).forEach((key) => { + if (key.indexOf('mouse') > -1) { + canvas.off(key) + } + }) + removeAllKeyboardEventListeners() + addEvent(step) + }, [step]) + + const addEvent = (step) => { + //default Event 추가 + canvas?.on('mouse:move', defaultMouseMoveEvent) + addKeyboardEventListener('keydown', document, defaultKeyboardEvent) + + if (step === 1) { + canvas?.on('mouse:down', (e) => { + canvas?.add(new fabric.Rect({ width: 100, height: 100, fill: 'red', left: e.pointer.x, top: e.pointer.y })) + }) + addKeyboardEventListener('keydown', document, (e) => { + if (e.key === 'Escape') { + console.log(1111) + } + }) + } else if (step === 2) { + canvas?.on('mouse:down', (e) => { + canvas?.add(new fabric.Circle({ radius: 50, fill: 'blue', left: e.pointer.x, top: e.pointer.y })) + }) + addKeyboardEventListener('keydown', document, (e) => { + if (e.key === 'Escape') { + console.log(2222) + } + }) + } else { + canvas?.on('mouse:down', (e) => { + canvas?.add(new fabric.Triangle({ width: 100, height: 100, fill: 'green', left: e.pointer.x, top: e.pointer.y })) + }) + addKeyboardEventListener('keydown', document, (e) => { + if (e.key === 'Escape') { + console.log(333) + } + }) + } + } + + const defaultMouseMoveEvent = (e) => { + console.log('defaultMouseMoveEvent') + } + + const defaultKeyboardEvent = (e) => { + if (e.key === 'Escape') { + console.log('defaultKeyboardEvent') + } + } + + // 이벤트 리스너를 추가하는 함수 + function addKeyboardEventListener(eventType, element, handler) { + element.addEventListener(eventType, handler) + keyboardEventListeners.current.push({ eventType, element, handler }) + } + // 이벤트 리스너를 제거하는 함수 + function removeAllKeyboardEventListeners() { + keyboardEventListeners.current.forEach(({ eventType, element, handler }) => { + element.removeEventListener(eventType, handler) + }) + keyboardEventListeners.current.length = 0 // 배열 초기화 + } +} diff --git a/src/store/canvasAtom.js b/src/store/canvasAtom.js index 44f29df5..404b9106 100644 --- a/src/store/canvasAtom.js +++ b/src/store/canvasAtom.js @@ -179,3 +179,8 @@ export const objectPlacementModeState = atom({ key: 'objectPlacementMode', default: { width: 0, height: 0, areaBoundary: false, inputType: 'free', batchType: 'opening' }, }) + +export const stepState = atom({ + key: 'step', + default: 0, +})