layout-context.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import React, { createContext, useContext, useCallback, useMemo } from 'react'
  2. import PropTypes from 'prop-types'
  3. import useScopeValue from './util/scope-value-hook'
  4. import { useIdeContext } from './ide-context'
  5. export const LayoutContext = createContext()
  6. LayoutContext.Provider.propTypes = {
  7. value: PropTypes.shape({
  8. view: PropTypes.string,
  9. setView: PropTypes.func.isRequired,
  10. chatIsOpen: PropTypes.bool,
  11. setChatIsOpen: PropTypes.func.isRequired,
  12. reviewPanelOpen: PropTypes.bool,
  13. setReviewPanelOpen: PropTypes.func.isRequired,
  14. leftMenuShown: PropTypes.bool,
  15. setLeftMenuShown: PropTypes.func.isRequired,
  16. pdfLayout: PropTypes.oneOf(['sideBySide', 'flat', 'split']).isRequired,
  17. }).isRequired,
  18. }
  19. export function LayoutProvider({ children }) {
  20. const { $scope } = useIdeContext()
  21. const [view, _setView] = useScopeValue('ui.view')
  22. const setView = useCallback(
  23. value => {
  24. _setView(oldValue => {
  25. // ensure that the "history:toggle" event is broadcast when switching in or out of history view
  26. if (value === 'history' || oldValue === 'history') {
  27. $scope.toggleHistory()
  28. }
  29. return value
  30. })
  31. },
  32. [$scope, _setView]
  33. )
  34. const [chatIsOpen, setChatIsOpen] = useScopeValue('ui.chatOpen')
  35. const [reviewPanelOpen, setReviewPanelOpen] = useScopeValue(
  36. 'ui.reviewPanelOpen'
  37. )
  38. const [leftMenuShown, setLeftMenuShown] = useScopeValue('ui.leftMenuShown')
  39. const [pdfLayout] = useScopeValue('ui.pdfLayout', $scope)
  40. const value = useMemo(
  41. () => ({
  42. view,
  43. setView,
  44. chatIsOpen,
  45. setChatIsOpen,
  46. reviewPanelOpen,
  47. setReviewPanelOpen,
  48. leftMenuShown,
  49. setLeftMenuShown,
  50. pdfLayout,
  51. }),
  52. [
  53. chatIsOpen,
  54. leftMenuShown,
  55. pdfLayout,
  56. reviewPanelOpen,
  57. setChatIsOpen,
  58. setLeftMenuShown,
  59. setReviewPanelOpen,
  60. setView,
  61. view,
  62. ]
  63. )
  64. return (
  65. <LayoutContext.Provider value={value}>{children}</LayoutContext.Provider>
  66. )
  67. }
  68. LayoutProvider.propTypes = {
  69. children: PropTypes.any,
  70. }
  71. export function useLayoutContext(propTypes) {
  72. const data = useContext(LayoutContext)
  73. PropTypes.checkPropTypes(propTypes, data, 'data', 'LayoutContext.Provider')
  74. return data
  75. }