refactor: canvas plan 저장 시 데이터 동기화 로직 수정

This commit is contained in:
Daseul Kim 2024-10-11 16:35:36 +09:00
parent 0c6bd17710
commit c9ae8f87e0
3 changed files with 56 additions and 40 deletions

View File

@ -7,15 +7,15 @@ import { useMessage } from '@/hooks/useMessage'
import { useSwal } from '@/hooks/useSwal' import { useSwal } from '@/hooks/useSwal'
import { usePlan } from '@/hooks/usePlan' import { usePlan } from '@/hooks/usePlan'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { currentCanvasPlanState, initCanvasPlansState } from '@/store/canvasAtom' import { currentCanvasPlanState, initCanvasPlansState, plansState } from '@/store/canvasAtom'
import { sessionStore } from '@/store/commonAtom' import { sessionStore } from '@/store/commonAtom'
export default function CanvasLayout() { export default function CanvasLayout() {
const [objectNo, setObjectNo] = useState('test123240822001') // const [objectNo, setObjectNo] = useState('test123240822001') //
const [plans, setPlans] = useState([])
const [planNum, setPlanNum] = useState(0) const [planNum, setPlanNum] = useState(0)
const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState) const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState)
const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState) const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState)
const [plans, setPlans] = useRecoilState(plansState)
const globalLocaleState = useRecoilValue(globalLocaleStore) const globalLocaleState = useRecoilValue(globalLocaleStore)
const sessionState = useRecoilValue(sessionStore) const sessionState = useRecoilValue(sessionStore)
@ -32,40 +32,25 @@ export default function CanvasLayout() {
html: getMessage('common.message.confirm.save') + `</br>${currentCanvasPlan.name}`, html: getMessage('common.message.confirm.save') + `</br>${currentCanvasPlan.name}`,
type: 'confirm', type: 'confirm',
confirmFn: async () => { confirmFn: async () => {
saveCanvas(sessionState.userId) await saveCanvas(sessionState.userId)
/** updateCurrentPlan(newCurrentId)
* TODO: 신규 canvas plan 저장 id, name 데이터 동기화 필요 (40~51Line)
*/
initCanvasPlans.map((initPlan) => {
if ('isNew' in initPlan) {
// console.log('================ isNew initPlan: ', initPlan)
setPlans((plans) =>
plans.map((plan) => {
initPlan.isNew === plan.id
? { ...plan, id: initPlan.id, name: initPlan.name, canvasStatus: initPlan.canvasStatus, isCurrent: plan.id === newCurrentId }
: { ...plan, isCurrent: plan.id === newCurrentId }
}),
)
}
})
}, },
denyFn: () => { denyFn: () => {
setPlans((plans) => updateCurrentPlan(newCurrentId)
plans.map((plan) => {
return { ...plan, isCurrent: plan.id === newCurrentId }
}),
)
}, },
}) })
} else { } else {
setPlans((plans) => updateCurrentPlan(newCurrentId)
plans.map((plan) => {
return { ...plan, isCurrent: plan.id === newCurrentId }
}),
)
} }
} }
} }
const updateCurrentPlan = (newCurrentId) => {
setPlans((plans) =>
plans.map((plan) => {
return { ...plan, isCurrent: plan.id === newCurrentId }
}),
)
}
useEffect(() => { useEffect(() => {
setCurrentCanvasPlan(plans.find((plan) => plan.isCurrent) || null) setCurrentCanvasPlan(plans.find((plan) => plan.isCurrent) || null)
}, [plans]) }, [plans])
@ -86,7 +71,7 @@ export default function CanvasLayout() {
// console.error('[DELETE] canvas-statuses res error :::::::: %o', error) // console.error('[DELETE] canvas-statuses res error :::::::: %o', error)
}) })
} else { } else {
setPlans(plans.filter((plan) => plan.id !== id)) setPlans((plans) => plans.filter((plan) => plan.id !== id))
swalFire({ text: getMessage('common.message.delete') }) swalFire({ text: getMessage('common.message.delete') })
} }

View File

@ -1,5 +1,5 @@
import { useRecoilState } from 'recoil' import { useRecoilState } from 'recoil'
import { canvasState, currentCanvasPlanState, initCanvasPlansState } from '@/store/canvasAtom' import { canvasState, currentCanvasPlanState, initCanvasPlansState, plansState } from '@/store/canvasAtom'
import { useAxios } from '@/hooks/useAxios' import { useAxios } from '@/hooks/useAxios'
import { useMessage } from '@/hooks/useMessage' import { useMessage } from '@/hooks/useMessage'
import { useSwal } from '@/hooks/useSwal' import { useSwal } from '@/hooks/useSwal'
@ -8,6 +8,7 @@ export function usePlan() {
const [canvas, setCanvas] = useRecoilState(canvasState) const [canvas, setCanvas] = useRecoilState(canvasState)
const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState) const [currentCanvasPlan, setCurrentCanvasPlan] = useRecoilState(currentCanvasPlanState)
const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState) const [initCanvasPlans, setInitCanvasPlans] = useRecoilState(initCanvasPlansState)
const [plans, setPlans] = useRecoilState(plansState)
const { swalFire } = useSwal() const { swalFire } = useSwal()
const { getMessage } = useMessage() const { getMessage } = useMessage()
const { get, promisePost, promisePut, promiseDel } = useAxios() const { get, promisePost, promisePut, promiseDel } = useAxios()
@ -77,11 +78,12 @@ export function usePlan() {
removeMouseLines() removeMouseLines()
const canvasStr = addCanvas() const canvasStr = addCanvas()
const canvasStatus = dbToCanvasFormat(canvasToDbFormat(canvasStr)) const canvasStatus = dbToCanvasFormat(canvasToDbFormat(canvasStr))
if (JSON.parse(canvasStr).objects.length === 0 && currentCanvasPlan.canvasStatus === undefined) { const initPlanData = initCanvasPlans.find((plan) => plan.id === currentCanvasPlan.id)
// 빈 캔버스 if (JSON.parse(canvasStr).objects.length === 0 && initPlanData === undefined) {
// 저장 안 된 빈 캔버스
return false return false
} else if (canvasStatus === currentCanvasPlan.canvasStatus) { } else if (initPlanData && canvasStatus === initPlanData.canvasStatus) {
// 변경사항 없는 캔버스 // 저장 되어있고 변경사항 없는 캔버스
return false return false
} else { } else {
return true return true
@ -121,13 +123,16 @@ export function usePlan() {
canvasStatus: canvasToDbFormat(canvasStatus), canvasStatus: canvasToDbFormat(canvasStatus),
} }
await promisePut({ url: '/api/canvas-management/canvas-statuses', data: planData }) return await promisePut({ url: '/api/canvas-management/canvas-statuses', data: planData })
.then((res) => { .then((res) => {
swalFire({ text: getMessage('common.message.save') }) swalFire({ text: getMessage('common.message.save') })
// console.log('[PUT] canvas-statuses res :::::::: %o', res) // console.log('[PUT] canvas-statuses res :::::::: %o', res)
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) =>
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' })
@ -142,14 +147,34 @@ export function usePlan() {
canvasStatus: canvasToDbFormat(canvasStatus), canvasStatus: canvasToDbFormat(canvasStatus),
} }
await promisePost({ url: '/api/canvas-management/canvas-statuses', data: planData }) return await promisePost({ url: '/api/canvas-management/canvas-statuses', data: planData })
.then((res) => { .then((res) => {
swalFire({ text: getMessage('common.message.save') }) swalFire({ text: getMessage('common.message.save') })
setInitCanvasPlans([
...initCanvasPlans,
{ id: res.data, name: currentCanvasPlan.objectNo + '-' + res.data, userId: userId, canvasStatus: canvasStatus, isNew: currentCanvasPlan.id },
])
// console.log('[POST] canvas-statuses response :::::::: %o', res) // console.log('[POST] canvas-statuses response :::::::: %o', res)
setInitCanvasPlans((initCanvasPlans) => [
...initCanvasPlans,
{
id: res.data,
name: currentCanvasPlan.objectNo + '-' + res.data,
userId: userId,
canvasStatus: canvasStatus,
isNew: currentCanvasPlan.id,
},
])
setPlans((plans) =>
plans.map((plan) =>
plan.id === currentCanvasPlan.id
? {
...plan,
id: res.data,
name: currentCanvasPlan.objectNo + '-' + res.data,
userId: userId,
canvasStatus: canvasStatus,
isNew: currentCanvasPlan.id,
}
: plan,
),
)
}) })
.catch((error) => { .catch((error) => {
swalFire({ text: error.message, icon: 'error' }) swalFire({ text: error.message, icon: 'error' })

View File

@ -264,6 +264,12 @@ export const currentCanvasPlanState = atom({
default: {}, default: {},
}) })
// 전체 canvas plan
export const plansState = atom({
key: 'plan',
default: [],
})
export const tempGridModeState = atom({ export const tempGridModeState = atom({
key: 'tempGridModeState', key: 'tempGridModeState',
default: false, default: false,