layout-context.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import React, { createContext, useContext } from 'react'
  2. import PropTypes from 'prop-types'
  3. import useScopeValue from './util/scope-value-hook'
  4. export const LayoutContext = createContext()
  5. LayoutContext.Provider.propTypes = {
  6. value: PropTypes.shape({
  7. view: PropTypes.string,
  8. setView: PropTypes.func.isRequired,
  9. chatIsOpen: PropTypes.bool,
  10. setChatIsOpen: PropTypes.func.isRequired,
  11. reviewPanelOpen: PropTypes.bool,
  12. setReviewPanelOpen: PropTypes.func.isRequired,
  13. leftMenuShown: PropTypes.bool,
  14. setLeftMenuShown: PropTypes.func.isRequired
  15. }).isRequired
  16. }
  17. export function LayoutProvider({ children, $scope }) {
  18. const [view, setView] = useScopeValue('ui.view', $scope)
  19. const [chatIsOpen, setChatIsOpen] = useScopeValue('ui.chatOpen', $scope)
  20. const [reviewPanelOpen, setReviewPanelOpen] = useScopeValue(
  21. 'ui.reviewPanelOpen',
  22. $scope
  23. )
  24. const [leftMenuShown, setLeftMenuShown] = useScopeValue(
  25. 'ui.leftMenuShown',
  26. $scope
  27. )
  28. const layoutContextValue = {
  29. view,
  30. setView,
  31. chatIsOpen,
  32. setChatIsOpen,
  33. reviewPanelOpen,
  34. setReviewPanelOpen,
  35. leftMenuShown,
  36. setLeftMenuShown
  37. }
  38. return (
  39. <LayoutContext.Provider value={layoutContextValue}>
  40. {children}
  41. </LayoutContext.Provider>
  42. )
  43. }
  44. LayoutProvider.propTypes = {
  45. children: PropTypes.any,
  46. $scope: PropTypes.any.isRequired
  47. }
  48. export function useLayoutContext(propTypes) {
  49. const data = useContext(LayoutContext)
  50. PropTypes.checkPropTypes(propTypes, data, 'data', 'LayoutContext.Provider')
  51. return data
  52. }