UNPKG

@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
'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); } });