layout-context.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import React, { createContext, useContext, useCallback } 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 setView = useCallback(
  21. value => {
  22. _setView(value)
  23. if (value === 'history') {
  24. $scope.toggleHistory()
  25. }
  26. },
  27. [$scope, _setView]
  28. )
  29. const [chatIsOpen, setChatIsOpen] = useScopeValue('ui.chatOpen', $scope)
  30. const [reviewPanelOpen, setReviewPanelOpen] = useScopeValue(
  31. 'ui.reviewPanelOpen',
  32. $scope
  33. )
  34. const [leftMenuShown, setLeftMenuShown] = useScopeValue(
  35. 'ui.leftMenuShown',
  36. $scope
  37. )
  38. const [pdfLayout] = useScopeValue('ui.pdfLayout', $scope)
  39. const layoutContextValue = {
  40. view,
  41. setView,
  42. chatIsOpen,
  43. setChatIsOpen,
  44. reviewPanelOpen,
  45. setReviewPanelOpen,
  46. leftMenuShown,
  47. setLeftMenuShown,
  48. pdfLayout,
  49. }
  50. return (
  51. <LayoutContext.Provider value={layoutContextValue}>
  52. {children}
  53. </LayoutContext.Provider>
  54. )
  55. }
  56. LayoutProvider.propTypes = {
  57. children: PropTypes.any,
  58. $scope: PropTypes.shape({
  59. toggleHistory: PropTypes.func.isRequired,
  60. }).isRequired,
  61. }
  62. export function useLayoutContext(propTypes) {
  63. const data = useContext(LayoutContext)
  64. PropTypes.checkPropTypes(propTypes, data, 'data', 'LayoutContext.Provider')
  65. return data
  66. }