Shopify App History
While attempting to use react-router
to handle routing in embedded Shopify apps we noticed that window.top.location
was not staying in sync with window.location
. This package attempts to solve that problem.
While it may work with other routing solutions, it is specifically targeting react-router
.
Usage
Install:
$ npm install --save @satel/shopify-app-history
$ yarn add @satel/shopify-app-history
Import:
import { createBrowserHistory } from 'history';
import syncHistory from '@satel/shopify-app-history';
Initialize:
const history = createHistory({
easdk,
history: createBrowserHistory(),
});
Polaris Example
import React from 'react';
import ReactDOM from 'react-dom';
import PropTypes from 'prop-types';
import { Router } from 'react-router-dom';
import { AppProvider } from '@shopify/polaris';
import syncHistory from '@satel/shopify-app-history';
import history from './path/to/custom/history';
import App from './App';
const ShopifyRouter = (({ children }, { easdk }) => {
const history = syncHistory({
easdk,
history,
});
return (
<Router history={history}>
{children}
</Router>
);
});
// This tells react to bind the context
ShopifyRouter.contextTypes = { easdk: PropTypes.any.isRequired };
ReactDOM.render(
<AppProvider
apiKey="shh"
shopOrigin="https://example.myshopify.com"
>
<ShopifyRouter>
<App />
</ShopifyRouter>
</AppProvider>,
document.getElementById('root'),
);
EASDK Example
<!-- Include the EASDK -->
<script src="https://cdn.shopify.com/s/assets/external/app.js"></script>
import React from 'react';
import ReactDOM from 'react-dom';
import { Router } from 'react-router-dom';
import syncHistory from '@satel/shopify-app-history';
import history from './path/to/custom/history';
import App from './App';
syncHistory({
easdk: window.ShopifyApp,
history,
});
window.ShopifyApp.init({
apiKey: "shh",
shopOrigin: "https://example.myshopify.com",
});
window.ShopifyApp.ready(() => {
ReactDOM.render(
<Router history={history}>
<App />
</Router>,
document.getElementById('root'),
);
});
Implementation
It is just tiny wrapper around history
that makes calls to easdk.replaceState()
or easdk.messenger.send()
depending on which library is used.