gatsby-plugin-affirm
Version:
Plugin to add the Affirm JavaScript SDK
88 lines (73 loc) • 3.26 kB
JavaScript
import React from 'react';
const AFFIRM_SANDBOX_CDN = 'https://cdn1-sandbox.affirm.com/js/v2/affirm.js';
exports.onRenderBody = ({setHeadComponents}, pluginOptions) => {
const {
isAsync,
environmentScript,
experimental_shouldDeferAffirmScript,
publicAPIKey,
} = pluginOptions;
if (!publicAPIKey) {
throw new Error(
'The Affirm plugin requires a public API key. Did you mean to add it?'
);
}
// Use your public API Key and environment script to point to the correct Affirm environment.
const affirmConfig = {
public_api_key: publicAPIKey,
script: environmentScript || AFFIRM_SANDBOX_CDN,
};
// Affirm minified snippet (version 2) - Last checked on June 15, 2022
// See https://docs.affirm.com/affirm-developers/docs/checkout-web
const snippet = `(function(m,g,n,d,a,e,h,c){var b=m[n]||{},k=document.createElement(e),p=document.getElementsByTagName(e)[0],l=function(a,b,c){return function(){a[b]._.push([c,arguments])}};b[d]=l(b,d,"set");var f=b[d];b[a]={};b[a]._=[];f._=[];b._=[];b[a][h]=l(b,a,h);b[c]=function(){b._.push([h,arguments])};a=0;for(c="set add save post open empty reset on off trigger ready setProduct".split(" ");a<c.length;a++)f[c[a]]=l(b,d,c[a]);a=0;for(c=["get","token","url","items"];a<c.length;a++)f[c[a]]=function(){};${
experimental_shouldDeferAffirmScript ? 'k.defer=!0' : 'k.async=!0'
};k.src=g[e];p.parentNode.insertBefore(k,p);delete g[e];f(g);m[n]=b})(window,${JSON.stringify(
affirmConfig
)},"affirm","checkout","ui","script","ready","jsReady");`;
return setHeadComponents([
<script
async={Boolean(isAsync)}
dangerouslySetInnerHTML={{__html: snippet}}
key="plugin-affirm"
/>,
]);
};
// NOTE: The Snippet code looks something like this when un-minified
// function (affirmConfig) {
// var affirmRef = window.affirm || {};
// var affirmCDNScript = document.createElement('script');
// var affirmCDNScriptRef = document.getElementsByTagName('script')[0];
// var saveAffirmRef = function (affirmRef, key, subkey) {
// return () => {
// affirmRef[key]._.push([subkey, arguments]);
// };
// };
// affirmRef.checkout = saveAffirmRef(affirmRef, 'checkout', 'set');
// var checkoutRef = affirmRef.checkout;
// affirmRef.ui = {};
// affirmRef.ui._ = [];
// checkoutRef._ = [];
// affirmRef._ = [];
// affirmRef.ui.ready = saveAffirmRef(affirmRef, 'ui', 'ready');
// affirmRef.jsReady = function () {
// affirmRef._.push(['ready', arguments])
// };
// let idx = 0;
// let keys = 'set add save post open empty reset on off trigger ready setProduct';
// for (keys = keys.split(' '); idx < keys.length; idx++){
// const key = keys[idx];
// checkoutRef[key] = saveAffirmRef(affirmRef, 'checkout', key);
// }
// let idx = 0;
// let keys = 'get token url items';
// for (keys = keys.split(' '); idx < keys.length; idx++){
// const key = keys[idx];
// checkoutRef[key] = function () {};
// }
// affirmCDNScript.async = true;
// affirmCDNScript.src = affirmConfig.script;
// affirmCDNScriptRef.parentNode.insertBefore(affirmCDNScript, affirmCDNScriptRef);
// delete affirmConfig.script;
// checkoutRef(affirmConfig);
// window.affirm = affirmRef;
// }