@xiag-stc/react-basket
Version:
Order basket view: period of stay blocks containing the hotel blocks containing the room blocks; guest data forms with variations for Airline- and Airport-TO-s
140 lines (124 loc) • 5.06 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactIntl = require('react-intl');
var _moneyMath = require('money-math');
var _reactGuestDataForm = require('@xiag-stc/react-guest-data-form');
var _reactTaxes = require('@stc-b2b/react-taxes');
var _roomCost = require('./roomCost');
var _roomCost2 = _interopRequireDefault(_roomCost);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function roomCostAndTaxes(periodOfStay, room) {
return addCosts((0, _roomCost2.default)(room), (0, _reactTaxes.totalTax)(periodOfStay, room.occupancyRoomCounts, room.prepayTaxes ? room.ratePlan.excludedTaxes : []));
}
function addCosts(c1, c2) {
return {
currency: c2.currency,
amount: (0, _moneyMath.add)(c1.amount, c2.amount)
};
}
exports.default = _react2.default.createClass({
displayName: 'Total',
mixins: [_reactIntl.IntlMixin],
propTypes: {
tourOperatorType: _react2.default.PropTypes.string.isRequired,
periods: _react2.default.PropTypes.arrayOf(_react2.default.PropTypes.object).isRequired,
onDeleteBasket: _react2.default.PropTypes.func.isRequired,
onBook: _react2.default.PropTypes.func.isRequired
},
render: function render() {
return _react2.default.createElement(
'div',
{ className: 'total' },
_react2.default.createElement(
'div',
{ className: 'row' },
_react2.default.createElement(
'div',
{ className: 'col-md-6 total__sum' },
_react2.default.createElement(
'p',
null,
_react2.default.createElement(_reactIntl.FormattedMessage, {
message: this.getIntlMessage('react-basket.xRooms'),
count: this.roomsCount() })
),
_react2.default.createElement(
'p',
null,
_react2.default.createElement(_reactIntl.FormattedMessage, {
message: this.getIntlMessage('react-basket.totalPrice') }),
': ',
this.cost().currency,
' ',
this.cost().amount
)
),
this.controlDiv()
)
);
},
controlDiv: function controlDiv() {
if (this.props.periods.length <= 0) {
return null;
}
return _react2.default.createElement(
'div',
{ className: 'col-md-6 total-control' },
_react2.default.createElement(
'div',
{ className: 'pull-right' },
_react2.default.createElement(
'button',
{
className: 'btn btn-default',
type: 'button',
onClick: this.props.onDeleteBasket },
_react2.default.createElement(_reactIntl.FormattedMessage, {
message: this.getIntlMessage('react-basket.deleteBasket') })
),
' ',
_react2.default.createElement(
'button',
{
className: 'btn btn-primary',
type: 'button',
disabled: !this.areGuestDataValid(),
onClick: this.props.onBook },
_react2.default.createElement(_reactIntl.FormattedMessage, {
message: this.getIntlMessage('react-basket.book') })
)
)
);
},
areGuestDataValid: function areGuestDataValid() {
var validate = (0, _reactGuestDataForm.validator)(this.props.tourOperatorType);
return this.mapReduceOnRooms(function (_, room) {
return validate(room.guestData);
}, function (x, y) {
return x && y;
}, true);
},
roomsCount: function roomsCount() {
return this.mapReduceOnRooms(function () {
return 1;
}, function (x, y) {
return x + y;
}, 0);
},
cost: function cost() {
return this.mapReduceOnRooms(roomCostAndTaxes, addCosts, { currency: '', amount: '0.0' });
},
mapReduceOnRooms: function mapReduceOnRooms(mapOp, reduceOp, initial) {
return this.props.periods.reduce(function (pAcc, period) {
return reduceOp(pAcc, period.hotels.reduce(function (hAcc, hotel) {
return reduceOp(hAcc, hotel.rooms.reduce(function (rAcc, room) {
return reduceOp(rAcc, mapOp(period.periodOfStay, room));
}, initial));
}, initial));
}, initial);
}
});