-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
chore(customization_cart): customizations_replicated_products_in_cart #158
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mas aí você foi na solução mais radical possível @oscargross 😬
Eu acho que o problema é só porque o objeto customizations
é o mesmo entre os dois itens, por referência, já que a gente só duplica as props do item no primeiro nível em
shopping-cart/src/methods/add-item.js
Line 67 in 2b837f5
const itemCopy = Object.assign({}, newItem) |
nesse caso uma solução deve ser verificar se tem customizations
, e nesse caso:
Object.assign(itemCopy.customizations, item.customizations)
em último caso você poderia copiar o objeto customizations
deeply com lodash.clonedeep
tipo acontece aí https://github.com/ecomplus/search-engine/blob/master/src/methods/reset.js
@leomp12 entendi Pode editar as customizations do segundo produto com o cart aberto para ver que já vai alterando o que já está no cart, assim, fazer deeply quando o novo for adicionado não vai adiantar 😬 Por isso pensei em pegar no localStorage , pois nos testes lá só é alterado quando a function |
Mas você chegou a testar? |
@leomp12 monstro, tem razão, entendi nos testes a clonagem do estado anterior do cart. Se passar, vi q tem essa issue sobre isso ecomplus/storefront#556 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ué, mas agora estamos mantendo o objeto do carrinho duplicado em cada instância ? Acho que não gasta isso não sô 😄
em último caso você poderia copiar o objeto customizations deeply com
lodash.clonedeep
tipo acontece aí https://github.com/ecomplus/search-engine/blob/master/src/methods/reset.js
O clonedeep
seria do customizations
apenas, dentro do método addItem
mesmo:
if (itemCopy.customizations) {
itemCopy.customizations = cloneDeep(item.customizations)
}
isso se um assign ainda mais simples não for suficiente:
if (itemCopy.customizations) {
Object.assign(itemCopy.customizations, item.customizations)
}
O problema é só com O fato de
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@oscargross testei aqui e só isso:
if (newItem.customizations) {
newItem.customizations.forEach((customization, i) => {
itemCopy.customizations[i] = Object.assign({}, customization)
})
}
já é suficiente, evita o lodash.clonedeep
(portanto deixa de adicionar uma dependência) e principalmente não copia o cart todo...
Comitei no seu branch pra aprovar a PR.
O fato de JSON.parse resolver o problema (entendi que você testou isso e deu certo...) sugere que o issue é só com objetos que deveriam ser diferentes e estão mantidos os mesmos por referência
Valeu por identificar isso pra nós 💜
@leomp12 Opa meu querido, enviei agr um commit só clonando o customizations do ultimo product como sugeriu, não todo o cart como estava.. mas de qualquer forma seu commit tbm soluciona. Abração!! 💚 |
Issue-test:
Adicionar um produto com customização no cart, no momento em que voltamos ao produto e adicionamos um segundo produto com outra customização, o primeiro sofre alteração desses campos, ficando com as mesmas customizações do último adicionado ao cart.
Solution:
A prop customizations é adicionada aos items (product) do cart separadamente das demais props, assim, é alterada toda vez que o(s) campo(s) de customização(es) também é alterado. A PR faz com que os produtos que já estavam no carrinho sejam readicionados com suas props "antigas", sem edição, no momento em que um novo produto é adicionado.