Skip to content

Instantly share code, notes, and snippets.

@flipmotion
Created December 10, 2018 11:29
Show Gist options
  • Save flipmotion/c41547b4c0263c52256a3449a1a9bb6d to your computer and use it in GitHub Desktop.
Save flipmotion/c41547b4c0263c52256a3449a1a9bb6d to your computer and use it in GitHub Desktop.
part reducer checkout
[UPDATE_PASSENGER](state, { id, form: passenger, fieldName }) {
const hasBirthdayField = has('birthday', passenger.fields);
let updatedPassenger;
let newState = evolve({
fields: {
passengers: map(
(p) => {
if (p.id === id) {
updatedPassenger = mergeWithKey(
(k, l, r) => (k === 'fields' ? merge(l, omit(SWAP_FIELDS, r)) : r),
p,
passenger
);
if (hasBirthdayField) {
updatedPassenger = resetDocuments(updatedPassenger);
}
if (hasBirthdayField) {
updatedPassenger = {
...updatedPassenger,
isAdult: isAdult(passenger),
};
}
return resetChildCheckbox(updatedPassenger);
}
return p;
}
),
},
}, state);
if (hasBirthdayField && (!fieldName || fieldName === 'birthday') &&
isValidBirthday(updatedPassenger) &&
needSwap(updatedPassenger)
) {
const passengers = compose(
filter(
converge(
or,
[compose(not, isValidBirthday), needSwap]
)
),
getPassengers
)(newState);
const passengerAge = getPassengerAge(updatedPassenger);
const groupedByAge = groupBy(
compose(
age => (isNil(age) ? -1 : age),
getFormAge
)
)(passengers);
const withSeats = getWithSeats(passengers);
let swapOnlyAge = false;
let anotherPassenger;
if (DISABLE_AGE_VALIDATION || isAdult(updatedPassenger)) {
swapOnlyAge = hasSeats(updatedPassenger);
anotherPassenger = withSeats.shift();
} else {
anotherPassenger = groupedByAge[passengerAge].shift();
swapOnlyAge = hasSeats(updatedPassenger) === hasSeats(anotherPassenger);
}
if (anotherPassenger) {
newState = evolve({
fields: {
passengers: map(
cond([
[propEq('id', anotherPassenger.id), evolve({
fields: merge(__, getSwapFields(updatedPassenger, swapOnlyAge)),
})],
[propEq('id', updatedPassenger.id), evolve({
fields: merge(__, getSwapFields(anotherPassenger, swapOnlyAge)),
})],
[T, identity],
])
),
},
})(newState);
}
}
return newState;
},
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment