Skip to content
Snippets Groups Projects
WaxContext.js 1.86 KiB
Newer Older
/* eslint react/prop-types: 0 */
/* eslint react/destructuring-assignment: 0 */
import React, { useContext, useState } from 'react';
// eslint-disable-next-line import/no-named-as-default
import ApplicationContext from './ApplicationContext';
chris's avatar
chris committed

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

export default props => {
  const [context, setContext] = useState({
chris's avatar
chris committed
    state: props.state,
chris's avatar
chris committed
    pmViews: props.view || {},
chris's avatar
chris committed
    activeView: props.activeView || {},
    activeViewId: props.activeViewId || {},
chris's avatar
chris committed
    options: { fullScreen: false },
chris's avatar
chris committed
    transaction: {},
chris's avatar
chris committed
  });

chris's avatar
chris committed
  return (
    <WaxContext.Provider
      value={{
        ...context,
        updateView: (newView, activeViewId) => {
          setContext(prevContext => {
            const updatedPmViews = { ...prevContext.pmViews, ...newView };
            const newActiveViewId = activeViewId || prevContext.activeViewId;
            return {
              ...prevContext,
              pmViews: updatedPmViews,
              activeView: updatedPmViews[newActiveViewId],
              activeViewId: newActiveViewId,
            };
          });
        },
        setTransaction: tr => {
          Object.assign(context.transaction, tr);
        },
        setOption: option => {
          Object.assign(context.options, option);
        },
        removeView: deletedView => {
          delete context.pmViews[deletedView];
        },
      }}
    >
      {props.children}
    </WaxContext.Provider>
chris's avatar
chris committed
  );
};

export const useInjection = identifier => {
  const context = useContext(ApplicationContext);
chris's avatar
chris committed

  if (!context.app.container) {
chris's avatar
chris committed
    throw new Error();
  }

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