UNPKG

@mason-api/javascript-sdk

Version:

Mason component rendering library

194 lines (159 loc) 6.19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.render = exports.init = exports.has = exports.schema = void 0; var _lodash = _interopRequireDefault(require("lodash")); var _immutabilityHelper = _interopRequireDefault(require("immutability-helper")); var _utils = require("@mason-api/utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var SECRET_KEY = 'secretKey'; var PUBLISHABLE_KEY = 'publishableKey'; var stripeElementsLookUpTable = { 'card': 'card', 'card-cvc': 'cardCvc', 'card-expiry': 'cardExpiry', 'card-number': 'cardNumber' }; // inputs with these names will be sent to stripe along with card data var stripeCardKeys = ['address_city', 'address_country', 'address_line1', 'address_line2', 'address_state', 'address_zip', 'country', 'name']; var schema = { id: 'stripe', name: 'Stripe', keys: { PUBLISHABLE_KEY: PUBLISHABLE_KEY, SECRET_KEY: SECRET_KEY }, requiredKeys: [PUBLISHABLE_KEY], spec: [{ key: PUBLISHABLE_KEY, value: '' }, { key: SECRET_KEY, private: true, value: '' }] }; exports.schema = schema; var stripe; function mountElements(e) { var forms = e.target.querySelectorAll('form[name="stripe"]'); _lodash.default.forEach(forms, function (form) { var elements = stripe.elements(); _lodash.default.forEach(stripeElementsLookUpTable, function (name) { var input = form.querySelector("div[data-name=\"".concat(name, "\"]")); if (input) { var element = elements.create(name); element.mount(input); } }); }); } var has = function has(config) { return !_lodash.default.isEmpty(_utils.CONFIG.getValueForIntegration(config, schema.id, PUBLISHABLE_KEY)); }; exports.has = has; var init = function init(getContext) { return function (next) { return function (config) { if (!stripe) { if (!_lodash.default.isFunction(Stripe)) { throw new Error('Stripe not found. Please include Stripe.js script, visit https://stripe.com/docs/stripe-js/reference#including-stripejs for more details'); } else { stripe = Stripe(_utils.CONFIG.getValueForIntegration(config, schema.id, PUBLISHABLE_KEY)); } } var nextConfig = _objectSpread({}, config); _lodash.default.forEach(_lodash.default.keys(nextConfig.data), function (configKey) { var tree = config.data[configKey].tree; var nextTree = _objectSpread({}, tree); var forms = _utils.TREE.search(nextTree, { tag: 'form', p: { name: 'stripe' } }); // first we replace any stripe inputs with their react-elements container _lodash.default.forEach(forms, function (form) { _lodash.default.forEach(stripeElementsLookUpTable, function (type, id) { var input = _lodash.default.first(_utils.TREE.search(form.c, { p: { name: _lodash.default.camelCase(id) } }, form.path)); if (input) { nextTree = _utils.TREE.replaceNode(nextTree, (0, _immutabilityHelper.default)(input, { tag: { $set: 'div' }, p: { $merge: { 'data-name': input.p.name }, $unset: ['name'] } })); } }); }); var buttons = _utils.TREE.search(nextTree, { tag: 'button', p: { _function: 'stripe:createToken' } }); _lodash.default.forEach(buttons, function (button) { nextTree = _utils.TREE.setNodeProp(nextTree, button.path, '_function', 'submitForm'); }); nextConfig = (0, _immutabilityHelper.default)(nextConfig, { data: _defineProperty({}, configKey, { tree: { $set: nextTree } }) }); }); return next(nextConfig); }; }; }; exports.init = init; var render = function render(getContext) { return function (next) { return function (config, configSubpath, target, props) { target.addEventListener('render', mountElements); return next(config, configSubpath, target, _objectSpread({}, props, { willSendData: function willSendData(form, name) { if (name === 'stripe') { // this integration will only process forms named stripe return stripe.createToken(_lodash.default.pick(form.data, stripeCardKeys)).then(function (_ref) { var token = _ref.token; var nextForm = (0, _immutabilityHelper.default)(form, { data: { $merge: { stripeToken: token.id } } }); if (_lodash.default.isFunction(props.willSendData)) { return props.willSendData(nextForm, name); } return nextForm; }); } // if it's not named stripe, still must call ownProps.willSendData if (_lodash.default.isFunction(props.willSendData)) { return props.willSendData(form, name); } return form; } })); }; }; }; exports.render = render; var _default = { has: has, init: init, render: render }; exports.default = _default;