diff --git a/.env.development b/.env.development
index 2f67a8f6..943a5d6b 100644
--- a/.env.development
+++ b/.env.development
@@ -1,6 +1,6 @@
NEXT_PUBLIC_TEST="테스트변수입니다. development"
-NEXT_PUBLIC_API_SERVER_PATH="http://localhost:8080"
+NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080"
DATABASE_URL="sqlserver://mssql.devgrr.kr:1433;database=qcast;user=qcast;password=Qwertqaz12345;trustServerCertificate=true"
diff --git a/src/components/Roof2.jsx b/src/components/Roof2.jsx
index 1acf612b..6d8f942d 100644
--- a/src/components/Roof2.jsx
+++ b/src/components/Roof2.jsx
@@ -1,5 +1,5 @@
import { useCanvas } from '@/hooks/useCanvas'
-import { useEffect, useState } from 'react'
+import { useEffect, useState, useRef } from 'react'
import { Mode, useMode } from '@/hooks/useMode'
import { Button } from '@nextui-org/react'
import RangeSlider from './ui/RangeSlider'
@@ -19,10 +19,13 @@ import { getCanvasState, insertCanvasState } from '@/lib/canvas'
import { calculateIntersection } from '@/util/canvas-util'
import { QPolygon } from '@/components/fabric/QPolygon'
import ThumbnailList from './ui/ThumbnailLIst'
+import CanvasWithContextMenu from '@/util/context-util'
export default function Roof2() {
const { canvas, handleRedo, handleUndo, setCanvasBackgroundWithDots, saveImage, addCanvas } = useCanvas('canvas')
+ const canvasRef = useRef(null)
+
//canvas 기본 사이즈
const [canvasSize, setCanvasSize] = useRecoilState(canvasSizeState)
@@ -699,7 +702,8 @@ export default function Roof2() {
)}
-
+
+ {canvas !== undefined && }
>
)
diff --git a/src/hooks/useCanvas.js b/src/hooks/useCanvas.js
index fc3b678f..e5f5337f 100644
--- a/src/hooks/useCanvas.js
+++ b/src/hooks/useCanvas.js
@@ -64,15 +64,11 @@ export function useCanvas(id) {
useEffect(() => {
if (canvas) {
initialize()
- canvas?.on('object:added', onChange)
- canvas?.on('object:added', addEventOnObject)
-
- canvas?.on('object:modified', onChange)
- canvas?.on('object:removed', onChange)
- canvas?.on('mouse:move', drawMouseLines)
- canvas?.on('mouse:out', removeMouseLines)
+ removeEventOnCanvas()
+ addEventOnCanvas()
}
}, [canvas])
+
const addEventOnCanvas = () => {
canvas?.on('object:added', onChange)
canvas?.on('object:modified', onChange)
diff --git a/src/hooks/useMode.js b/src/hooks/useMode.js
index 9ac623a1..bd86b460 100644
--- a/src/hooks/useMode.js
+++ b/src/hooks/useMode.js
@@ -277,7 +277,7 @@ export function useMode() {
break
case 'default':
- canvas?.off('mouse:down')
+ // canvas?.off('mouse:down')
break
}
}
@@ -510,7 +510,7 @@ export function useMode() {
setMode(mode)
// mode변경 시 이전 이벤트 제거
setCanvas(canvas)
- canvas?.off('mouse:down')
+ // canvas?.off('mouse:down')
addEvent(mode)
}
diff --git a/src/util/context-util.js b/src/util/context-util.js
new file mode 100644
index 00000000..0d14f1d9
--- /dev/null
+++ b/src/util/context-util.js
@@ -0,0 +1,65 @@
+import React, { useState, useEffect, forwardRef, useContext } from 'react'
+
+const CanvasWithContextMenu = forwardRef(({ canvasProps }, ref) => {
+ const [contextMenu, setContextMenu] = useState({ visible: false, x: 0, y: 0 })
+
+ useEffect(() => {
+ if (!ref.current) return
+
+ const handleContextMenu = (e) => {
+ e.preventDefault() //기존 contextmenu 막고
+ setContextMenu({ visible: true, x: e.pageX, y: e.pageY })
+ canvasProps.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu) //한번 노출 후 이벤트 삭제
+ }
+
+ const handleClick = (e) => {
+ e.preventDefault()
+ setContextMenu({ ...contextMenu, visible: false })
+ }
+
+ const handleOutsideClick = (e) => {
+ e.preventDefault()
+ if (contextMenu.visible && !ref.current.contains(e.target)) {
+ setContextMenu({ ...contextMenu, visible: false })
+ }
+ }
+
+ // Prevent the default context menu from appearing on the canvas
+ canvasProps.upperCanvasEl.addEventListener('contextmenu', handleContextMenu)
+ document.addEventListener('click', handleClick)
+ document.addEventListener('click', handleOutsideClick)
+
+ return () => {
+ canvasProps.upperCanvasEl.removeEventListener('contextmenu', handleContextMenu)
+ document.removeEventListener('click', handleClick)
+ document.removeEventListener('click', handleOutsideClick)
+ }
+ }, [ref, contextMenu])
+
+ const handleMenuClick = (option) => {
+ alert(`option ${option} clicked`)
+ setContextMenu({ ...contextMenu, visible: false })
+ }
+
+ return (
+ <>
+ {contextMenu.visible && (
+
+
+ - handleMenuClick(1)}>
+ Option 1
+
+ - handleMenuClick(2)}>
+ Option 2
+
+ - handleMenuClick(3)}>
+ Option 3
+
+
+
+ )}
+ >
+ )
+})
+
+export default CanvasWithContextMenu