У меня есть userDetails
в избыточном хранилище, и перед входом пользователя ключ id
в userDetails
пуст и имеет wishList: [], shoppingCart: []
для гостя. так что гость также может добавлять элементы в списки. Когда гость входит в систему, если после входа в систему появляются элементы в списке, я показываю Modal
и говорю пользователю: «У вас есть элементы в списках, вы хотите добавить их к своему пользователю?», Если пользователь принимает I хотите объединить списки до их изменения и списки пользователей из запроса GET
и после отправки объединенных списков в запрос PATCH
. поэтому, прежде чем я вызову userDetailsChanged
(резервное действие), я попытался сохранить списки некоторыми способами, такими как state
, useRef
, а также в избыточном виде, например: before: {wishList:[], shoppingCart:[]}
и вызвать beforeListsChanged
action.
Это работает так: GET
req -> сохранить списки из userDetails
-> изменить userDetails
-> Показать Modal
-> принять -> объединить списки до и списки пользователей без дубликатов -> PATCH
.
Проблема в том, что независимо от того, каким образом я сохраняю списки, они являются новыми списками из запроса GET
, а не предыдущими гостевыми списками. так что все время слияние одинаково, потому что раньше wishList
было таким же, как пользователь wishList
, а также shoppingCart
код:
try {
const responseData = await sendRequest(
'http://localhost:5000/api/users/login',
'POST',
JSON.stringify({
email: formState.inputs.email.value,
password: formState.inputs.password.value
}),
{ 'Content-Type': 'application/json' }
);
if (before.wishList.length > 0 || before.shoppingCart.length > 0)
showConfirmModalHandle(event); //!show the confirmModal
//Here I tried the three ways (state, useRef.current=...,redux before lists like below)
//I prefer not to do this way because it looks bad, taking the lists here from userDetails would be much better.
setBeforeLists({
wishList: userDetails.wishList,
shoppingCart: userDetails.shoppingCart
}); //beforeListsChanged action
setUserDetails(responseData);//userDetailsChanged action
}
Теперь, если пользователь принял go для эта функция:
Итак, проблема в том, что независимо от того, каким образом я сохраняю списки в этой функции, всегда будут новые списки, которые я получал после входа в систему.
const addToWishCart = async () => {
let responseData;
let afterWishList = new Set();
let afterShoppingCart = new Set();
let mergeWishLists, mergeShoppingCarts;
mergeWishLists = merge(before.wishList, userDetails.wishList);
mergeShoppingCarts = merge(before.shoppingCart, userDetails.shoppingCart);
for (let i = 0; i < mergeWishLists.length; i++)
afterWishList.add(mergeWishLists[i]);
for (let i = 0; i < mergeShoppingCarts.length; i++)
afterShoppingCart.add(mergeShoppingCarts[i]);
afterWishList = toArray(afterWishList);
afterShoppingCart = toArray(afterShoppingCart);
responseData = await sendRequest(
'http://localhost:5000/api/users/' + userDetails.id,
'PATCH',
JSON.stringify({
wishList: afterWishList,
shoppingCart: afterShoppingCart,
type: 'wishCart',
firstName: userDetails.firstName,
lastName: userDetails.lastName,
address: userDetails.address
}),
{
'Content-Type': 'application/json'
}
);
setUserDetails(responseData);
setBeforeLists({ wishList: [], shoppingCart: [] });
ShowAndHideModalHandle();
};
Как сохранить предыдущие значения в моих userDetails
?
Кроме того, если это возможно без списков перед в редуксе, я бы хотел получить этот ответ.