diff --git a/src/actions/bmdashboard/invTypeActions.js b/src/actions/bmdashboard/invTypeActions.js index 14cc6a958d..c8279fc4a3 100644 --- a/src/actions/bmdashboard/invTypeActions.js +++ b/src/actions/bmdashboard/invTypeActions.js @@ -9,6 +9,8 @@ import GET_MATERIAL_TYPES, { POST_BUILDING_TOOL_INVENTORY_TYPE, POST_ERROR_BUILDING_TOOL_INVENTORY_TYPE, RESET_POST_BUILDING_TOOL_INVENTORY_TYPE, + POST_BUILDING_REUSABLE_INVENTORY_TYPE, + POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE, GET_INV_BY_TYPE, GET_TOOL_TYPES, GET_CONSUMABLE_TYPES, @@ -131,6 +133,20 @@ export const setPostBuildingToolTypeResult = payload => { }; }; +export const setPostBuildingReusableTypeResult = payload => { + return { + type: POST_BUILDING_REUSABLE_INVENTORY_TYPE, + payload, + }; +}; + +export const setPostErrorBuildingReusableTypeResult = payload => { + return { + type: POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE, + payload, + }; +}; + export const setPostErrorBuildingInventoryTypeResult = payload => { return { type: POST_ERROR_BUILDING_MATERIAL_INVENTORY_TYPE, @@ -195,10 +211,11 @@ export const fetchToolTypes = () => { export const fetchInvTypeByType = type => { const url = ENDPOINTS.BM_INVTYPE_TYPE(type); return async dispatch => { - axios + return axios .get(url) .then(res => { dispatch(setInvTypesByType({ type, data: res.data })); + return res; }) .catch(err => { dispatch(setErrors(err)); @@ -208,10 +225,11 @@ export const fetchInvTypeByType = type => { export const postBuildingConsumableType = payload => { return async dispatch => { - axios + return axios .post(ENDPOINTS.BM_CONSUMABLES, payload) .then(res => { dispatch(setPostBuildingConsumableTypeResult(res.data)); + return res; }) .catch(err => { dispatch( @@ -219,16 +237,18 @@ export const postBuildingConsumableType = payload => { JSON.stringify(err.response.data) || 'Sorry! Some error occurred!', ), ); + throw err; }); }; }; export const postBuildingToolType = payload => { return async dispatch => { - axios + return axios .post(ENDPOINTS.BM_TOOLS, payload) .then(res => { dispatch(setPostBuildingToolTypeResult(res.data)); + return res; }) .catch(err => { dispatch( @@ -236,16 +256,37 @@ export const postBuildingToolType = payload => { JSON.stringify(err.response.data) || 'Sorry! Some error occurred!', ), ); + throw err; + }); + }; +}; + +export const postBuildingReusableType = payload => { + return async dispatch => { + return axios + .post(ENDPOINTS.BM_REUSABLE_TYPE, payload) + .then(res => { + dispatch(setPostBuildingReusableTypeResult(res.data)); + return res; + }) + .catch(err => { + dispatch( + setPostErrorBuildingReusableTypeResult( + JSON.stringify(err.response?.data) || 'Sorry! Some error occurred!', + ), + ); + throw err; }); }; }; export const postBuildingInventoryType = payload => { return async dispatch => { - axios + return axios .post(ENDPOINTS.BM_MATERIAL_TYPE, payload) .then(res => { dispatch(setPostBuildingInventoryTypeResult(res.data)); + return res; }) .catch(err => { dispatch( @@ -253,6 +294,7 @@ export const postBuildingInventoryType = payload => { JSON.stringify(err.response.data) || 'Sorry! Some error occurred!', ), ); + throw err; }); }; }; diff --git a/src/components/BMDashboard/InventoryTypesList/AddEditInvTypeFullModal.jsx b/src/components/BMDashboard/InventoryTypesList/AddEditInvTypeFullModal.jsx index 649cabb86a..d20bb10bdb 100644 --- a/src/components/BMDashboard/InventoryTypesList/AddEditInvTypeFullModal.jsx +++ b/src/components/BMDashboard/InventoryTypesList/AddEditInvTypeFullModal.jsx @@ -20,6 +20,7 @@ import axios from 'axios'; import { postBuildingInventoryType, postBuildingToolType, + postBuildingReusableType, postBuildingConsumableType, fetchInvTypeByType, } from '~/actions/bmdashboard/invTypeActions'; @@ -227,15 +228,22 @@ function AddEditInvTypeFullModal({ isOpen, toggle, category, mode = 'add', itemT fuel: formData.fuel, }; response = await axios.put(ENDPOINTS.BM_INVTYPE_BY_ID(itemType._id), payload); - } else if (category === 'Tools' || category === 'Reusables') { + } else if (category === 'Tools') { const payload = { ...formData, - category: category === 'Tools' ? 'Tool' : 'Reusable', + category: 'Tool', images: imageURL[0] || itemType?.images || '', totalPriceWithShipping, }; - // Try tool-specific endpoint first, fallback to generic response = await axios.put(ENDPOINTS.BM_TOOL_BY_ID(itemType._id), payload); + } else if (category === 'Reusables') { + const payload = { + ...formData, + category: 'Reusable', + images: imageURL[0] || itemType?.images || '', + totalPriceWithShipping, + }; + response = await axios.put(ENDPOINTS.BM_INVTYPE_BY_ID(itemType._id), payload); } else { // Materials, Consumables const payload = { @@ -249,7 +257,7 @@ function AddEditInvTypeFullModal({ isOpen, toggle, category, mode = 'add', itemT if (response.status === 200) { toast.success(`${getCategoryLabel()} type updated successfully!`); - dispatch(fetchInvTypeByType(category)); + await dispatch(fetchInvTypeByType(category)); toggle(); } } catch (err) { @@ -282,17 +290,29 @@ function AddEditInvTypeFullModal({ isOpen, toggle, category, mode = 'add', itemT } else { toast.error(`Error: ${result.status} ${result.statusText}`); } - } else if (category === 'Tools' || category === 'Reusables') { + } else if (category === 'Tools') { + const payload = { + ...formData, + category: 'Tool', + images: imageURL[0] || '', + totalPriceWithShipping, + createdBy: userId, + }; + await dispatch(postBuildingToolType(payload)); + toast.success('Tool type added successfully!'); + await dispatch(fetchInvTypeByType(category)); + toggle(); + } else if (category === 'Reusables') { const payload = { ...formData, - category: category === 'Tools' ? 'Tool' : 'Reusable', + category: 'Reusable', images: imageURL[0] || '', totalPriceWithShipping, createdBy: userId, }; - dispatch(postBuildingToolType(payload)); - toast.success(`${getCategoryLabel()} type added successfully!`); - dispatch(fetchInvTypeByType(category)); + await dispatch(postBuildingReusableType(payload)); + toast.success('Reusable type added successfully!'); + await dispatch(fetchInvTypeByType(category)); toggle(); } else if (category === 'Consumables') { const payload = { @@ -302,12 +322,11 @@ function AddEditInvTypeFullModal({ isOpen, toggle, category, mode = 'add', itemT totalPriceWithShipping, createdBy: userId, }; - dispatch(postBuildingConsumableType(payload)); + await dispatch(postBuildingConsumableType(payload)); toast.success('Consumable type added successfully!'); - dispatch(fetchInvTypeByType(category)); + await dispatch(fetchInvTypeByType(category)); toggle(); } else { - // Materials const payload = { ...formData, category: 'Material', @@ -315,9 +334,9 @@ function AddEditInvTypeFullModal({ isOpen, toggle, category, mode = 'add', itemT totalPriceWithShipping, createdBy: userId, }; - dispatch(postBuildingInventoryType(payload)); + await dispatch(postBuildingInventoryType(payload)); toast.success('Material type added successfully!'); - dispatch(fetchInvTypeByType(category)); + await dispatch(fetchInvTypeByType(category)); toggle(); } } catch { diff --git a/src/constants/bmdashboard/inventoryTypeConstants.js b/src/constants/bmdashboard/inventoryTypeConstants.js index 64c789e3de..af7cc3ae6c 100644 --- a/src/constants/bmdashboard/inventoryTypeConstants.js +++ b/src/constants/bmdashboard/inventoryTypeConstants.js @@ -21,6 +21,11 @@ export const RESET_POST_BUILDING_CONSUMABLE_INVENTORY_TYPE = export const POST_BUILDING_TOOL_INVENTORY_TYPE = 'POST_BUILDING_TOOL_INVENTORY_TYPE'; export const POST_ERROR_BUILDING_TOOL_INVENTORY_TYPE = 'POST_ERROR_BUILDING_TOOL_INVENTORY_TYPE'; export const RESET_POST_BUILDING_TOOL_INVENTORY_TYPE = 'RESET_POST_BUILDING_TOOL_INVENTORY_TYPE'; +export const POST_BUILDING_REUSABLE_INVENTORY_TYPE = 'POST_BUILDING_REUSABLE_INVENTORY_TYPE'; +export const POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE = + 'POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE'; +export const RESET_POST_BUILDING_REUSABLE_INVENTORY_TYPE = + 'RESET_POST_BUILDING_REUSABLE_INVENTORY_TYPE'; export const GET_INV_BY_TYPE = 'GET_INV_BY_TYPE'; // Update and Delete constants for inventory types diff --git a/src/reducers/bmdashboard/inventoryTypeReducer.js b/src/reducers/bmdashboard/inventoryTypeReducer.js index fa62ca084f..9e36cf70c9 100644 --- a/src/reducers/bmdashboard/inventoryTypeReducer.js +++ b/src/reducers/bmdashboard/inventoryTypeReducer.js @@ -11,6 +11,9 @@ import GET_MATERIAL_TYPES, { POST_BUILDING_TOOL_INVENTORY_TYPE, POST_ERROR_BUILDING_TOOL_INVENTORY_TYPE, RESET_POST_BUILDING_TOOL_INVENTORY_TYPE, + POST_BUILDING_REUSABLE_INVENTORY_TYPE, + POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE, + RESET_POST_BUILDING_REUSABLE_INVENTORY_TYPE, GET_INV_BY_TYPE, GET_TOOL_TYPES, GET_CONSUMABLE_TYPES, @@ -147,6 +150,33 @@ export const bmInvTypeReducer = (state = defaultState, action) => { error: null, }, }; + case POST_BUILDING_REUSABLE_INVENTORY_TYPE: + return { + ...state, + postedResult: { + result: action.payload, + success: true, + error: false, + }, + }; + case POST_ERROR_BUILDING_REUSABLE_INVENTORY_TYPE: + return { + ...state, + postedResult: { + result: action.payload, + success: false, + error: true, + }, + }; + case RESET_POST_BUILDING_REUSABLE_INVENTORY_TYPE: + return { + ...state, + postedResult: { + result: null, + success: null, + error: null, + }, + }; case GET_INV_BY_TYPE: { state.invTypeList[action.payload.type] = [...action.payload.data]; return { ...state }; diff --git a/src/utils/URL.js b/src/utils/URL.js index 65813d4433..1bee0d3d5f 100644 --- a/src/utils/URL.js +++ b/src/utils/URL.js @@ -314,6 +314,7 @@ export const ENDPOINTS = { BM_CONSUMABLES_PURCHASE: `${APIEndpoint}/bm/consumables/purchase`, BM_UPDATE_CONSUMABLE_STATUS: `${APIEndpoint}/bm/updateConsumableStatus`, BM_REUSABLE_TYPES: `${APIEndpoint}/bm/invtypes/reusables`, + BM_REUSABLE_TYPE: `${APIEndpoint}/bm/invtypes/reusable`, BM_REUSABLES: `${APIEndpoint}/bm/reusables`, BM_PURCHASE_REUSABLES: `${APIEndpoint}/bm/reusables/purchase`, BM_EQUIPMENT_TYPES: `${APIEndpoint}/bm/invtypes/equipments`,