From bdf1d68ebe6f3c383320f24a981d4f0a2cb3a9f9 Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Mon, 12 Jan 2026 11:05:49 -0300 Subject: [PATCH 1/2] feat: lock/unlock form --- src/actions/sponsor-cart-actions.js | 53 +++++++++++++++++++ src/pages/sponsors/sponsor-cart-tab/index.js | 20 +++++-- .../sponsor-page-cart-list-reducer.js | 21 +++++++- 3 files changed, 88 insertions(+), 6 deletions(-) diff --git a/src/actions/sponsor-cart-actions.js b/src/actions/sponsor-cart-actions.js index cbbf74a5a..7f4a9d96c 100644 --- a/src/actions/sponsor-cart-actions.js +++ b/src/actions/sponsor-cart-actions.js @@ -16,6 +16,7 @@ import { createAction, getRequest, deleteRequest, + putRequest, startLoading, stopLoading } from "openstack-uicore-foundation/lib/utils/actions"; @@ -28,6 +29,7 @@ import { ERROR_CODE_404 } from "../utils/constants"; export const REQUEST_SPONSOR_CART = "REQUEST_SPONSOR_CART"; export const RECEIVE_SPONSOR_CART = "RECEIVE_SPONSOR_CART"; export const SPONSOR_CART_FORM_DELETED = "SPONSOR_CART_FORM_DELETED"; +export const SPONSOR_CART_FORM_LOCKED = "SPONSOR_CART_FORM_LOCKED"; const customErrorHandler = (err, res) => (dispatch, state) => { const code = err.status; @@ -113,4 +115,55 @@ export const deleteSponsorCartForm = .finally(() => { dispatch(stopLoading()); }); + }; + + +export const lockSponsorCartForm = (formId) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { entity: sponsor } = currentSponsorState; + + const accessToken = await getAccessTokenSafely(); + + const params = { + access_token: accessToken + }; + + dispatch(startLoading()); + + putRequest( + null, + createAction(SPONSOR_CART_FORM_LOCKED)({ formId, locked: true }), + `${window.SPONSOR_USERS_API_URL}/api/v1/shows/${currentSummit.id}/sponsors/${sponsor.id}/carts/current/forms/${formId}/lock`, + {}, + snackbarErrorHandler + )(params)(dispatch) + .catch(console.log) // need to catch promise reject + .finally(() => { + dispatch(stopLoading()); + }); +}; + + +export const unlockSponsorCartForm = + (formId) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { entity: sponsor } = currentSponsorState; + const accessToken = await getAccessTokenSafely(); + const params = { access_token: accessToken }; + + dispatch(startLoading()); + + return deleteRequest( + null, + createAction(SPONSOR_CART_FORM_LOCKED)({ formId, locked: false }), + `${window.SPONSOR_USERS_API_URL}/api/v1/shows/${currentSummit.id}/sponsors/${sponsor.id}/carts/current/forms/${formId}/lock`, + null, + snackbarErrorHandler + )(params)(dispatch) + .catch(console.log) // need to catch promise reject + .finally(() => { + dispatch(stopLoading()); + }); }; \ No newline at end of file diff --git a/src/pages/sponsors/sponsor-cart-tab/index.js b/src/pages/sponsors/sponsor-cart-tab/index.js index 4d1d9b564..c41d0f587 100644 --- a/src/pages/sponsors/sponsor-cart-tab/index.js +++ b/src/pages/sponsors/sponsor-cart-tab/index.js @@ -27,7 +27,9 @@ import LockClosedIcon from "@mui/icons-material/Lock"; import AddIcon from "@mui/icons-material/Add"; import { deleteSponsorCartForm, - getSponsorCart + getSponsorCart, + lockSponsorCartForm, + unlockSponsorCartForm } from "../../../actions/sponsor-cart-actions"; import SearchInput from "../../../components/mui/search-input"; import { TotalRow } from "../../../components/mui/table/extra-rows"; @@ -39,7 +41,9 @@ const SponsorCartTab = ({ sponsor, summitId, getSponsorCart, - deleteSponsorCartForm + deleteSponsorCartForm, + lockSponsorCartForm, + unlockSponsorCartForm }) => { const [openPopup, setOpenPopup] = useState(null); const [formEdit, setFormEdit] = useState(null); @@ -64,8 +68,12 @@ const SponsorCartTab = ({ deleteSponsorCartForm(itemId); }; - const handleLock = (item) => { - console.log("LOCK : ", item); + const handleLock = (form) => { + if (form.is_locked) { + unlockSponsorCartForm(form.form_id); + } else { + lockSponsorCartForm(form.form_id); + } }; const handlePayCreditCard = () => { @@ -227,5 +235,7 @@ const mapStateToProps = ({ sponsorPageCartListState }) => ({ export default connect(mapStateToProps, { getSponsorCart, - deleteSponsorCartForm + deleteSponsorCartForm, + lockSponsorCartForm, + unlockSponsorCartForm })(SponsorCartTab); diff --git a/src/reducers/sponsors/sponsor-page-cart-list-reducer.js b/src/reducers/sponsors/sponsor-page-cart-list-reducer.js index 93c012b85..7d12f3429 100644 --- a/src/reducers/sponsors/sponsor-page-cart-list-reducer.js +++ b/src/reducers/sponsors/sponsor-page-cart-list-reducer.js @@ -17,7 +17,8 @@ import { SET_CURRENT_SUMMIT } from "../../actions/summit-actions"; import { REQUEST_SPONSOR_CART, RECEIVE_SPONSOR_CART, - SPONSOR_CART_FORM_DELETED + SPONSOR_CART_FORM_DELETED, + SPONSOR_CART_FORM_LOCKED } from "../../actions/sponsor-cart-actions"; const DEFAULT_STATE = { @@ -70,6 +71,24 @@ const sponsorPageCartListReducer = (state = DEFAULT_STATE, action) => { } }; } + case SPONSOR_CART_FORM_LOCKED: { + const { formId, locked } = payload; + + const forms = state.cart.forms.map((form) => { + if (form.form_id === formId) { + return {...form, locked}; + } + return form; + }); + + return { + ...state, + cart: { + ...state.cart, + forms + } + }; + } default: return state; } From 06ab7c0500e6c9cdf2db6a7d7faa2d0f19cd06bd Mon Sep 17 00:00:00 2001 From: Santiago Palenque Date: Mon, 12 Jan 2026 11:14:21 -0300 Subject: [PATCH 2/2] feat: delete cart form --- src/actions/sponsor-cart-actions.js | 100 +++++++++++++--------------- 1 file changed, 48 insertions(+), 52 deletions(-) diff --git a/src/actions/sponsor-cart-actions.js b/src/actions/sponsor-cart-actions.js index 7f4a9d96c..3d5cf0cd4 100644 --- a/src/actions/sponsor-cart-actions.js +++ b/src/actions/sponsor-cart-actions.js @@ -84,39 +84,37 @@ export const getSponsorCart = }); }; +export const deleteSponsorCartForm = (formId) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { + entity: { id: sponsorId } + } = currentSponsorState; + const accessToken = await getAccessTokenSafely(); + const params = { access_token: accessToken }; -export const deleteSponsorCartForm = - (formId) => async (dispatch, getState) => { - const { currentSummitState, currentSponsorState } = getState(); - const { currentSummit } = currentSummitState; - const { - entity: { id: sponsorId } - } = currentSponsorState; - const accessToken = await getAccessTokenSafely(); - const params = { access_token: accessToken }; - - dispatch(startLoading()); - - return deleteRequest( - null, - createAction(SPONSOR_CART_FORM_DELETED)({ formId }), - `${window.PURCHASES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/sponsor-forms/${formId}`, - null, - snackbarErrorHandler - )(params)(dispatch) - .then(() => { - dispatch( - snackbarSuccessHandler({ - title: T.translate("general.success"), - html: T.translate("sponsor_forms.form_delete_success") - }) - ); - }) - .finally(() => { - dispatch(stopLoading()); - }); - }; + dispatch(startLoading()); + return deleteRequest( + null, + createAction(SPONSOR_CART_FORM_DELETED)({ formId }), + `${window.PURCHASES_API_URL}/api/v1/summits/${currentSummit.id}/sponsors/${sponsorId}/carts/current/forms/${formId}`, + null, + snackbarErrorHandler + )(params)(dispatch) + .then(() => { + getSponsorCart()(dispatch, getState); + dispatch( + snackbarSuccessHandler({ + title: T.translate("general.success"), + html: T.translate("sponsor_forms.form_delete_success") + }) + ); + }) + .finally(() => { + dispatch(stopLoading()); + }); +}; export const lockSponsorCartForm = (formId) => async (dispatch, getState) => { const { currentSummitState, currentSponsorState } = getState(); @@ -144,26 +142,24 @@ export const lockSponsorCartForm = (formId) => async (dispatch, getState) => { }); }; +export const unlockSponsorCartForm = (formId) => async (dispatch, getState) => { + const { currentSummitState, currentSponsorState } = getState(); + const { currentSummit } = currentSummitState; + const { entity: sponsor } = currentSponsorState; + const accessToken = await getAccessTokenSafely(); + const params = { access_token: accessToken }; -export const unlockSponsorCartForm = - (formId) => async (dispatch, getState) => { - const { currentSummitState, currentSponsorState } = getState(); - const { currentSummit } = currentSummitState; - const { entity: sponsor } = currentSponsorState; - const accessToken = await getAccessTokenSafely(); - const params = { access_token: accessToken }; - - dispatch(startLoading()); + dispatch(startLoading()); - return deleteRequest( - null, - createAction(SPONSOR_CART_FORM_LOCKED)({ formId, locked: false }), - `${window.SPONSOR_USERS_API_URL}/api/v1/shows/${currentSummit.id}/sponsors/${sponsor.id}/carts/current/forms/${formId}/lock`, - null, - snackbarErrorHandler - )(params)(dispatch) - .catch(console.log) // need to catch promise reject - .finally(() => { - dispatch(stopLoading()); - }); - }; \ No newline at end of file + return deleteRequest( + null, + createAction(SPONSOR_CART_FORM_LOCKED)({ formId, locked: false }), + `${window.SPONSOR_USERS_API_URL}/api/v1/shows/${currentSummit.id}/sponsors/${sponsor.id}/carts/current/forms/${formId}/lock`, + null, + snackbarErrorHandler + )(params)(dispatch) + .catch(console.log) // need to catch promise reject + .finally(() => { + dispatch(stopLoading()); + }); +};