@satel/shopify-app-history

1.0.0-beta.2 • Public • Published

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.

Package Sidebar

Install

npm i @satel/shopify-app-history

Weekly Downloads

2

Version

1.0.0-beta.2

License

MIT

Unpacked Size

69.1 kB

Total Files

11

Last publish

Collaborators

  • qw-in
  • satelcreative