"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Payment = void 0;
var _dataSources = require("@mirai/data-sources");
var _locale = require("@mirai/locale");
var _ui = require("@mirai/ui");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _react = _interopRequireWildcard(require("react"));
var _helpers = require("./helpers");
var _Payment = require("./Payment.constants");
var _Payment2 = require("./Payment.l10n");
var style = _interopRequireWildcard(require("./Payment.module.css"));
var _getSearchProps = require("../../../helpers/getSearchProps");
var _helpers2 = require("../../helpers");
const _excluded = ["children", "config", "currency", "error", "info", "methods", "showErrors", "onChange", "onError"];
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
const Payment = _ref => {
  let {
      children,
      config = {},
      currency,
      error = {},
      info = {},
      methods: propMethods = [],
      showErrors = false,
      onChange = () => {},
      onError = () => {}
    } = _ref,
    others = _objectWithoutProperties(_ref, _excluded);
  const {
    isDesktop
  } = (0, _ui.useDevice)();
  const {
    currencyFormat,
    dateFormat,
    translate
  } = (0, _locale.useLocale)();
  const {
    set,
    value: store = {}
  } = (0, _dataSources.useStore)();
  const methods = Array.isArray(propMethods) ? propMethods : Object.keys(propMethods);
  const [cardType, setCardType] = (0, _react.useState)();
  const [method, setMethod] = (0, _react.useState)(methods.length > 0 ? methods[0] : undefined);
  (0, _react.useEffect)(() => {
    onChange({
      method
    });
    set({
      payment: {
        method
      }
    });
    onError({});
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [method]);
  const handleChange = function () {
    let values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
    const {
      type
    } = values;
    type !== cardType && setCardType(type);
    const next = _objectSpread({
      method
    }, values);
    onChange(next);
    set({
      payment: _objectSpread({}, next)
    });
  };
  const handleChangeMethod = nextMethod => {
    setMethod(nextMethod);
    _dataSources.Event.publish(_helpers2.EVENT.METRICS, _objectSpread({
      id: _helpers2.METRICS_EVENTS.CHECKOUT_INTERACTION,
      action: 'method_selected',
      payment_method: nextMethod
    }, (0, _getSearchProps.getSearchProps)({
      store
    })));
  };
  const {
    testId = 'payments'
  } = others;
  const standalone = methods.length === 1;
  const availableMethods = methods.filter(item => !!_Payment.METHOD[item]);
  return /*#__PURE__*/_react.default.createElement(_ui.View, _extends({}, others, {
    role: "payments",
    tag: "payment",
    row: false,
    className: (0, _ui.styles)(style.container, others.className)
  }), availableMethods.length > 1 && /*#__PURE__*/_react.default.createElement(_ui.View, {
    className: style.item
  }, /*#__PURE__*/_react.default.createElement(_ui.Text, {
    bold: true,
    headline: true,
    className: style.header
  }, translate(_Payment2.L10N.LABEL_PAYMENT_METHODS))), availableMethods.map(item => {
    var _propMethods$item, _propMethods$item2;
    const selected = method === item;
    const caption = selected ? (0, _helpers.getCaption)(_objectSpread(_objectSpread({
      method
    }, info), config)) : undefined;
    const component = selected ? (0, _helpers.getComponent)(_objectSpread(_objectSpread({
      method: item,
      methodConfig: propMethods[item]
    }, info), config)) : undefined;
    const image = (0, _helpers.getImage)(_objectSpread({
      method: item
    }, config));
    const {
      time = {}
    } = info || {};
    return /*#__PURE__*/_react.default.createElement(_ui.View, {
      key: item,
      className: style.item
    }, /*#__PURE__*/_react.default.createElement(_ui.Pressable, {
      disabled: selected || standalone,
      onPress: () => handleChangeMethod(item),
      className: (0, _ui.styles)(style.header, selected && style.selected),
      testId: testId ? "".concat(testId, "-item-").concat(item) : undefined
    }, !standalone && /*#__PURE__*/_react.default.createElement(_ui.Radio, {
      checked: selected,
      name: "method",
      value: item,
      className: style.radio,
      "aria-label": translate(_Payment2.L10N["LABEL_".concat(item)]),
      "aria-labelledby": item
    }), /*#__PURE__*/_react.default.createElement(_ui.Text, {
      bold: true,
      headline: isDesktop && standalone,
      id: item,
      className: (0, _ui.styles)(style.title, selected && style.selected),
      testId: testId ? "".concat(testId, "-text-").concat(item) : undefined
    }, translate(_Payment2.L10N["LABEL_".concat(item)])), image && /*#__PURE__*/_react.default.createElement(_ui.View, {
      alt: "".concat(item === null || item === void 0 ? void 0 : item.split('_').join(' ')),
      src: "".concat(process.env.SERVICE_STATIC, "/").concat(_Payment.URL_IMAGES, "/").concat(image),
      tag: "img",
      className: style.image
    }), [_Payment.METHOD.CARD, _Payment.METHOD.CARD_PREPAY, _Payment.METHOD.PCIPROXY].includes(item) && ![_Payment.PROVIDER.OPENPAY, _Payment.PROVIDER.LINKAGEPAY].includes(config.provider) && (config.cards || []).map(card => /*#__PURE__*/_react.default.createElement(_ui.View, {
      alt: card,
      key: card,
      src: "".concat(process.env.SERVICE_STATIC, "/").concat(_Payment.URL_IMAGES, "/cards/").concat(card.toLowerCase(), ".png"),
      tag: "img",
      className: (0, _ui.styles)(style.image, style.card, selected && cardType && card !== cardType && style.disabled)
    }))), selected && /*#__PURE__*/_react.default.createElement(_ui.View, {
      className: style.content,
      testId: testId ? "".concat(testId, "-container-").concat(item) : undefined
    }, caption && /*#__PURE__*/_react.default.createElement(_ui.Text, {
      small: true,
      className: (0, _ui.styles)(style.caption, component && style.withComponent)
    }, translate(caption, {
      amount: currencyFormat({
        currency,
        value: info === null || info === void 0 ? void 0 : info.amount
      }),
      date: dateFormat(info === null || info === void 0 ? void 0 : info.date, _Payment.DATE_FORMAT),
      day: translate(_Payment2.L10N.LABEL_DAY, {
        value: time.value
      }),
      hour: translate(_Payment2.L10N.LABEL_HOUR, {
        value: time.value
      }),
      type: time.type
    })), component && /*#__PURE__*/_react.default.createElement(component, _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({
      error,
      showErrors
    }, others), config), (_propMethods$item = propMethods[item]) === null || _propMethods$item === void 0 ? void 0 : _propMethods$item.config), (_propMethods$item2 = propMethods[item]) === null || _propMethods$item2 === void 0 ? void 0 : _propMethods$item2.prepayment), {}, {
      onChange: handleChange,
      onError
    }))));
  }), children && /*#__PURE__*/_react.default.createElement(_ui.View, {
    className: style.children
  }, children));
};
exports.Payment = Payment;
Payment.displayName = 'Mirai:Core:Payment';
Payment.propTypes = {
  children: _propTypes.default.any,
  config: _propTypes.default.shape({
    cards: _propTypes.default.arrayOf(_propTypes.default.string),
    provider: _propTypes.default.oneOf(Object.values(_Payment.PROVIDER)),
    showCVV: _propTypes.default.bool
  }),
  currency: _propTypes.default.string,
  error: _propTypes.default.object,
  info: _propTypes.default.shape({
    cardValidation: _propTypes.default.bool,
    date: _propTypes.default.instanceOf(Date),
    amount: _propTypes.default.number,
    time: _propTypes.default.shape({
      type: _propTypes.default.number,
      value: _propTypes.default.number
    })
  }),
  methods: _propTypes.default.array.isRequired,
  showErrors: _propTypes.default.bool,
  onChange: _propTypes.default.func,
  onError: _propTypes.default.func
};
//# sourceMappingURL=Payment.js.map