layout-context.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. pdfLayout: PropTypes.oneOf(['sideBySide', 'flat', 'split']).isRequired,
  16. }).isRequired,
  17. }
  18. export function LayoutProvider({ children, $scope }) {
  19. const [view, setView] = useScopeValue('ui.view', $scope)
  20. const [chatIsOpen, setChatIsOpen] = useScopeValue('ui.chatOpen', $scope)
  21. const [reviewPanelOpen, setReviewPanelOpen] = useScopeValue(
  22. 'ui.reviewPanelOpen',
  23. $scope
  24. )
  25. const [leftMenuShown, setLeftMenuShown] = useScopeValue(
  26. 'ui.leftMenuShown',
  27. $scope
  28. )
  29. const [pdfLayout] = useScopeValue('ui.pdfLayout', $scope)
  30. const layoutContextValue = {
  31. view,
  32. setView,
  33. chatIsOpen,
  34. setChatIsOpen,
  35. reviewPanelOpen,
  36. setReviewPanelOpen,
  37. leftMenuShown,
  38. setLeftMenuShown,
  39. pdfLayout,
  40. }
  41. return (
  42. <LayoutContext.Provider value={layoutContextValue}>
  43. {children}
  44. </LayoutContext.Provider>
  45. )
  46. }
  47. LayoutProvider.propTypes = {
  48. children: PropTypes.any,
  49. $scope: PropTypes.any.isRequired,
  50. }
  51. export function useLayoutContext(propTypes) {
  52. const data = useContext(LayoutContext)
  53. PropTypes.checkPropTypes(propTypes, data, 'data', 'LayoutContext.Provider')
  54. return data
  55. }