import React, { FunctionComponent } from "react";

export interface UIState {
  displaySidebar: boolean;
  openSidebar: () => {};
  closeSidebar: () => {};
}

const initialState = {
  displaySidebar: false,
  openSidebar: null,
  closeSidebar: null,
};

export const UIContext = React.createContext(initialState);
UIContext.displayName = "UIContext";

export const UIProvider: FunctionComponent = (props) => {
  const [state, dispatch] = React.useReducer(uiReducer, initialState);

  const openSidebar = () => dispatch("OPEN_SIDEBAR");
  const closeSidebar = () => dispatch("CLOSE_SIDEBAR");

  const value = {
    ...state,
    openSidebar,
    closeSidebar,
  };

  return <UIContext.Provider value={value} {...props} />;
};

export const useUI = () => {
  const context = React.useContext(UIContext);
  if (context === undefined) {
    throw new Error(`useUI must be used within a UIProvider`);
  }
  return context;
};

function uiReducer(state, action) {
  switch (action) {
    case "OPEN_SIDEBAR": {
      return {
        ...state,
        displaySidebar: true,
      };
    }
    case "CLOSE_SIDEBAR": {
      return {
        ...state,
        displaySidebar: false,
      };
    }
  }
}