This commit is contained in:
hyojun.choi 2024-11-04 14:46:50 +09:00
commit 04e8e66b04
4 changed files with 72 additions and 3 deletions

View File

@ -32,6 +32,8 @@ import { menusState, menuTypeState } from '@/store/menuAtom'
import useMenu from '@/hooks/common/useMenu'
import { MENU } from '@/common/common'
import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController'
export default function CanvasMenu(props) {
const { menuNumber, setMenuNumber } = props
const pathname = usePathname()
@ -51,6 +53,7 @@ export default function CanvasMenu(props) {
const canvas = useRecoilValue(canvasState)
const { handleZoomClear } = useCanvasEvent()
const { handleMenu } = useMenu()
const { handleEstimateSubmit } = useEstimateController()
const { getMessage } = useMessage()
const { currentCanvasPlan, saveCanvas } = usePlan()
@ -222,7 +225,7 @@ export default function CanvasMenu(props) {
<span className="ico ico01"></span>
<span>{getMessage('plan.menu.estimate.docDown')}</span>
</button>
<button className="btn-frame gray ico-flx">
<button className="btn-frame gray ico-flx" onClick={handleEstimateSubmit}>
<span className="ico ico02"></span>
<span>{getMessage('plan.menu.estimate.save')}</span>
</button>

View File

@ -0,0 +1,60 @@
import { useAxios } from '@/hooks/useAxios'
import { useReducer } from 'react'
const reducer = (prevState, nextState) => {
return { ...prevState, ...nextState }
}
// Constants
const ESTIMATE_API_ENDPOINT = '/api/estimates' // API 엔드포인트 정의
const defaultEstimateData = {
name: '',
objectName: '',
estimateDate: '',
itemList: [{ id: 1, name: '' }],
}
// Helper functions
const updateItemInList = (itemList, id, updates) => {
return itemList.map((item) => (item.id === id ? { ...item, ...updates } : item))
}
export const useEstimateController = () => {
const { promisePost } = useAxios()
const [state, setState] = useReducer(reducer, defaultEstimateData)
const updateItem = (id, updates) => {
setState({
itemList: updateItemInList(state.itemList, id, updates),
})
}
const addItem = () => {
const newId = Math.max(...state.itemList.map((item) => item.id)) + 1
setState({
itemList: [...state.itemList, { id: newId, name: '' }],
})
}
const handleEstimateSubmit = async () => {
try {
const result = await promisePost({
url: ESTIMATE_API_ENDPOINT,
data: state,
})
return result
} catch (error) {
console.error('Failed to submit estimate:', error)
throw error
}
}
return {
state,
setState,
updateItem,
addItem,
handleEstimateSubmit,
}
}

View File

@ -814,7 +814,10 @@
"estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG単価 (W)×PKG容量(W)",
"estimate.detail.header.showPrice": "価格表示",
"estimate.detail.showPrice.btn1": "Pricing",
"estimate.detail.showPrice.description": "クリックして製品の特異性を確認する",
"estimate.detail.showPrice.description1": "製品価格 OPEN",
"estimate.detail.showPrice.description2": "追加, 変更資材",
"estimate.detail.showPrice.description3": "添付必須",
"estimate.detail.showPrice.description4": "クリックして製品の特異性を確認する",
"estimate.detail.showPrice.btn2": "製品を追加",
"estimate.detail.showPrice.btn3": "製品削除"
}

View File

@ -820,7 +820,10 @@
"estimate.detail.sepcialEstimateProductInfo.calcFormula2": "PKG단가(W) * PKG용량(W)",
"estimate.detail.header.showPrice": "가격표시",
"estimate.detail.showPrice.btn1": "Pricing",
"estimate.detail.showPrice.description": "클릭하여 제품 특이사항 확인",
"estimate.detail.showPrice.description1": "제품 가격 OPEN",
"estimate.detail.showPrice.description2": "추가, 변경 자재",
"estimate.detail.showPrice.description3": "첨부필수",
"estimate.detail.showPrice.description4": "클릭하여 제품 특이사항 확인",
"estimate.detail.showPrice.btn2": "제품추가",
"estimate.detail.showPrice.btn3": "제품삭제"
}