layout-context.js 1.8 KB

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