refactor: canvas plan 변경사항 확인하는 함수 수정, canvas와 db간 저장포맷 수정

This commit is contained in:
Daseul Kim 2024-10-15 11:23:13 +09:00
parent df335960e7
commit fd1bbe46d4

View File

@ -54,6 +54,7 @@ export function usePlan() {
'y2', 'y2',
'attributes', 'attributes',
'stickeyPoint', 'stickeyPoint',
'text',
]) ])
const str = JSON.stringify(objs) const str = JSON.stringify(objs)
@ -76,32 +77,49 @@ export function usePlan() {
*/ */
const checkModifiedCanvasPlan = () => { const checkModifiedCanvasPlan = () => {
removeMouseLines() removeMouseLines()
const canvasStr = addCanvas() const canvasStatus = addCanvas()
const canvasStatus = dbToCanvasFormat(canvasToDbFormat(canvasStr))
const initPlanData = initCanvasPlans.find((plan) => plan.id === currentCanvasPlan.id) const initPlanData = initCanvasPlans.find((plan) => plan.id === currentCanvasPlan.id)
if (JSON.parse(canvasStr).objects.length === 0 && initPlanData === undefined) {
// 저장 안 된 빈 캔버스 if (!initPlanData) {
return false // 새로운 캔버스
} else if (initPlanData && canvasStatus === initPlanData.canvasStatus) { return JSON.parse(canvasStatus).objects.length > 0
// 저장 되어있고 변경사항 없는 캔버스
return false
} else { } else {
return true // 저장된 캔버스
if (canvasStatus === initPlanData.canvasStatus) {
return false
} else {
// 각각 object들의 id 목록을 추출하여 비교
const canvasObjsIds = getObjectIds(JSON.parse(canvasStatus).objects)
const dbObjsIds = getObjectIds(JSON.parse(initPlanData.canvasStatus).objects)
return canvasObjsIds.length !== dbObjsIds.length || !canvasObjsIds.every((id, index) => id === dbObjsIds[index])
}
} }
} }
const getObjectIds = (objects) => {
return objects
.filter((obj) => obj.hasOwnProperty('id'))
.map((obj) => obj.id)
.sort()
}
/** /**
* DB에 저장된 데이터를 canvas에서 사용할 있도록 포맷화 * DB에 저장된 데이터를 canvas에서 사용할 있도록 포맷화
*/ */
const dbToCanvasFormat = (cs) => { const dbToCanvasFormat = (cs) => {
return JSON.stringify(cs.replace(/##/g, '"').replace(/\\/g, '').slice(1, -1)) // return JSON.stringify(cs.replace(/##/g, '"')) //.replace(/\\/g, ''))//.slice(1, -1))
// JSON.stringify()를 사용하면 "가 \"로 바뀐다. 따라서, JSON.stringify를 제거
// canvasToDbFormat()에서 \\의 상황을 없앴으므로 replace(/\\/g, '')를 제거
return cs.replace(/##/g, '"')
} }
/** /**
* canvas의 데이터를 DB에 저장할 있도록 포맷화 * canvas의 데이터를 DB에 저장할 있도록 포맷화
*/ */
const canvasToDbFormat = (cs) => { const canvasToDbFormat = (cs) => {
return JSON.stringify(cs).replace(/"/g, '##') // return JSON.stringify(cs).replace(/"/g, '##')
// addCanvas()에서 JSON.stringify()를 거쳐서 나오는데, 또 감싸버려서 \가 \\로 된다. 따라서, JSON.stringify를 제거
return cs.replace(/"/g, '##')
} }
/** /**
@ -130,9 +148,7 @@ export function usePlan() {
setInitCanvasPlans((initCanvasPlans) => setInitCanvasPlans((initCanvasPlans) =>
initCanvasPlans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)), initCanvasPlans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)),
) )
setPlans((plans) => setPlans((plans) => plans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)))
plans.map((plan) => (plan.id === currentCanvasPlan.id ? { ...plan, canvasStatus: canvasStatus } : plan)),
)
}) })
.catch((error) => { .catch((error) => {
swalFire({ text: error.message, icon: 'error' }) swalFire({ text: error.message, icon: 'error' })