Создаете экшен:
const removeFromCart = productId => ({
type: types.REMOVE_FROM_CART,
productId
})
затем в редьюсере корзины, делаете так, чтобы на это действие был свой case, и в нем чтобы возвращался новый массив addedIds в котором уже не будет id из вашего экшена если quantityById меньше единицы (то есть, данной позиции больше не должно быть в корзине), либо изменяете quantityById ... суть в том, чтобы вы вернули новое состояние.
так же, для редьюсера товаров вы делаете кейс на этот же экшен - и там так же по id находите и добавляете новый элемент.
В общем, я думаю тут дело не сколько в реализации кода, а в понимании что такое экшены и редьюсеры. Почитайте
в учебнике (на русском), поделайте пример и я думаю без проблем разберетесь с вашим вопросом.