editor-context.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import React, { createContext, useCallback, useContext } from 'react'
  2. import PropTypes from 'prop-types'
  3. import useScopeValue from './util/scope-value-hook'
  4. import { useApplicationContext } from './application-context'
  5. import useBrowserWindow from '../../infrastructure/browser-window-hook'
  6. export const EditorContext = createContext()
  7. EditorContext.Provider.propTypes = {
  8. value: PropTypes.shape({
  9. cobranding: PropTypes.shape({
  10. logoImgUrl: PropTypes.string.isRequired,
  11. brandVariationName: PropTypes.string.isRequired,
  12. brandVariationId: PropTypes.number.isRequired,
  13. brandId: PropTypes.number.isRequired,
  14. brandVariationHomeUrl: PropTypes.string.isRequired,
  15. publishGuideHtml: PropTypes.string,
  16. partner: PropTypes.string,
  17. brandedMenu: PropTypes.string,
  18. submitBtnHtml: PropTypes.string
  19. }),
  20. loading: PropTypes.bool,
  21. projectRootDocId: PropTypes.string,
  22. projectId: PropTypes.string.isRequired,
  23. projectName: PropTypes.string.isRequired,
  24. renameProject: PropTypes.func.isRequired,
  25. isProjectOwner: PropTypes.bool,
  26. isRestrictedTokenMember: PropTypes.bool,
  27. rootFolder: PropTypes.object
  28. })
  29. }
  30. export function EditorProvider({ children, ide, settings }) {
  31. const {
  32. exposedSettings: { appName }
  33. } = useApplicationContext({
  34. exposedSettings: PropTypes.shape({ appName: PropTypes.string.isRequired })
  35. .isRequired
  36. })
  37. const cobranding = window.brandVariation
  38. ? {
  39. logoImgUrl: window.brandVariation.logo_url,
  40. brandVariationName: window.brandVariation.name,
  41. brandVariationId: window.brandVariation.id,
  42. brandId: window.brandVariation.brand_id,
  43. brandVariationHomeUrl: window.brandVariation.home_url,
  44. publishGuideHtml: window.brandVariation.publish_guide_html,
  45. partner: window.brandVariation.partner,
  46. brandedMenu: window.brandVariation.branded_menu,
  47. submitBtnHtml: window.brandVariation.submit_button_html
  48. }
  49. : undefined
  50. const ownerId =
  51. ide.$scope.project && ide.$scope.project.owner
  52. ? ide.$scope.project.owner._id
  53. : null
  54. const [loading] = useScopeValue('state.loading', ide.$scope)
  55. const [projectRootDocId] = useScopeValue('project.rootDoc_id', ide.$scope)
  56. const [projectName, setProjectName] = useScopeValue(
  57. 'project.name',
  58. ide.$scope
  59. )
  60. const [rootFolder] = useScopeValue('rootFolder', ide.$scope)
  61. const renameProject = useCallback(
  62. newName => {
  63. setProjectName(oldName => {
  64. if (oldName !== newName) {
  65. settings.saveProjectSettings({ name: newName }).catch(response => {
  66. setProjectName(oldName)
  67. const { data, status } = response
  68. if (status === 400) {
  69. return ide.showGenericMessageModal('Error renaming project', data)
  70. } else {
  71. return ide.showGenericMessageModal(
  72. 'Error renaming project',
  73. 'Please try again in a moment'
  74. )
  75. }
  76. })
  77. }
  78. return newName
  79. })
  80. },
  81. [settings, ide, setProjectName]
  82. )
  83. const { setTitle } = useBrowserWindow()
  84. setTitle(
  85. `${projectName ? projectName + ' - ' : ''}Online LaTeX Editor ${appName}`
  86. )
  87. const editorContextValue = {
  88. cobranding,
  89. loading,
  90. projectId: window.project_id,
  91. projectRootDocId,
  92. projectName: projectName || '', // initially might be empty in Angular
  93. renameProject,
  94. isProjectOwner: ownerId === window.user.id,
  95. isRestrictedTokenMember: window.isRestrictedTokenMember,
  96. rootFolder
  97. }
  98. return (
  99. <>
  100. <EditorContext.Provider value={editorContextValue}>
  101. {children}
  102. </EditorContext.Provider>
  103. </>
  104. )
  105. }
  106. EditorProvider.propTypes = {
  107. children: PropTypes.any,
  108. ide: PropTypes.any.isRequired,
  109. settings: PropTypes.any.isRequired
  110. }
  111. export function useEditorContext(propTypes) {
  112. const data = useContext(EditorContext)
  113. PropTypes.checkPropTypes(propTypes, data, 'data', 'EditorContext.Provider')
  114. return data
  115. }