Skip to content
Snippets Groups Projects
WaxContext.js 1.8 KiB
Newer Older
/* eslint react/prop-types: 0 */
/* eslint react/destructuring-assignment: 0 */
chris's avatar
chris committed
import React, { useContext, useState } from 'react';
chris's avatar
chris committed

export const WaxContext = React.createContext({
chris's avatar
chris committed
  pmViews: {},
chris's avatar
chris committed
  activeView: {},
  activeViewId: null,
  app: null,
  updateView: null,
chris's avatar
chris committed
  updateActiveView: null,
  removeView: null,
chris's avatar
chris committed
});

export default props => {
  const [context, setContext] = useState({
    app: props.app,
chris's avatar
chris committed
    pmViews: props.view || {},
chris's avatar
chris committed
    activeView: props.activeView || {},
    activeViewId: props.activeViewId || {},
    options: { fullScreen: false },
chris's avatar
chris committed
    transaction: {},
    setTransaction: tr => {
      Object.assign(context.transaction, tr);
    },
    setOption: option => {
      Object.assign(context.options, option);
    },
chris's avatar
chris committed
    removeView: deletedView => {
chris's avatar
chris committed
      delete context.pmViews[deletedView];
chris's avatar
chris committed
    updateView: (newView, activeViewId) => {
chris's avatar
chris committed
      const pmViews = Object.assign(context.pmViews, newView);
      const activeView = pmViews[activeViewId || context.activeViewId];
chris's avatar
chris committed
      setContext({
        ...context,
chris's avatar
chris committed
        pmViews,
        activeView,
chris's avatar
chris committed
        activeViewId: activeViewId || context.activeViewId,
chris's avatar
chris committed
      });
chris's avatar
chris committed
    },
chris's avatar
chris committed
  });

  return (
    <WaxContext.Provider
      value={{
chris's avatar
chris committed
        ...context,
chris's avatar
chris committed
      }}
    >
      {props.children}
    </WaxContext.Provider>
  );
};

export const useInjection = identifier => {
chris's avatar
chris committed
  const {
    app: { container },
  } = useContext(WaxContext);
chris's avatar
chris committed

  if (!container) {
    throw new Error();
  }

  return container.isBound(identifier)
    ? { instance: container.get(identifier) }
    : null;
};
chris's avatar
chris committed

export class Service {
  setApp(app) {
    this.app = app;
  }

  get container() {
    return this.app.container;
  }

  get config() {
    return this.app.config.get(`config.${this.name}`) || this.app.config;
  }

  get schema() {
    return this.app.getSchema();
  }
}