@mason-api/javascript-sdk
Version:
Mason component rendering library
194 lines (159 loc) • 6.19 kB
JavaScript
;
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;