@rebilly/framepay-react
Version:
A React wrapper for Rebilly's FramePay offering out-of-the-box support for Redux and other common React features
107 lines (95 loc) • 3.23 kB
JavaScript
import React from 'react';
import ReactDOM from 'react-dom';
export const prettyRenderState = (data, parentKey) => {
if (data !== null && typeof data === 'object') {
return (
<ul>
{Object.keys(data).map((key, index) => {
const dataKey = `${parentKey ? parentKey + '-' : ''}${key}`;
const value = data[key];
if (value === null) {
return null;
}
return (
<li
key={`state-render-${key}-${index}`}
id={`key-${key}`}
>
<span className="key">
<b>{key}</b>:
</span>
{prettyRenderState(value, dataKey)}
</li>
);
})}
</ul>
);
}
if (data === null) {
return null;
}
const val = typeof data === 'object' ? JSON.stringify(data) : data;
return (
<span>
<span id={`${parentKey}-${val}`} data-value={val} />
<span id={parentKey} data-value={val}>
{String(val)}
</span>
</span>
);
};
export const prettyDebugRender = (state) => {
return (
<div>
<div>
<pre id="pre">{JSON.stringify(state, null, 2)}</pre>
</div>
<div>
<div id="data">{prettyRenderState(state)}</div>
</div>
</div>
);
};
export const deepMerge = (target, source) => {
for (const key of Object.keys(source)) {
if (source[key] instanceof Object) {
source[key] = source[key] || {};
target[key] = target[key] || {};
Object.assign(source[key], deepMerge(target[key], source[key]));
}
}
return Object.assign(target || {}, source);
};
export const ReactVersion = () => {
return (
<div>
<h3>
React version:{' '}
<span id="react-version" data-version={React.version}>
{React.version}
</span>
</h3>
</div>
);
};
// Render a test fixtures in the DOM.
// Since react 19, ReactDOM.render is removed. Our test fixtures need to
// support running in multiple versions of React.
// We check if ReactDOM.render is available, if not we use the new API.
// We must dynamically import react-dom-19/client to avoid breaking the build
// in old versions. react-dom-19 must be a separate package in the package.json,
// otherwise when react-dom is aliased to an older version, the /client import
// will fail at build time.
export const renderFixture = (component) => {
if (ReactDOM.render) {
ReactDOM.render(component, document.getElementById('app'));
} else {
const ReactDOM19 = import('react-dom-19/client');
ReactDOM19.then((ReactDOM) => {
ReactDOM.createRoot(document.getElementById('app')).render(
component,
);
});
}
};