editor-context.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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. brandVariationHomeUrl: PropTypes.string.isRequired
  13. }),
  14. loading: PropTypes.bool,
  15. projectId: PropTypes.string.isRequired,
  16. projectName: PropTypes.string.isRequired,
  17. renameProject: PropTypes.func.isRequired,
  18. isProjectOwner: PropTypes.bool,
  19. isRestrictedTokenMember: PropTypes.bool
  20. })
  21. }
  22. export function EditorProvider({ children, ide, settings }) {
  23. const {
  24. exposedSettings: { appName }
  25. } = useApplicationContext({
  26. exposedSettings: PropTypes.shape({ appName: PropTypes.string.isRequired })
  27. .isRequired
  28. })
  29. const cobranding = window.brandVariation
  30. ? {
  31. logoImgUrl: window.brandVariation.logo_url,
  32. brandVariationName: window.brandVariation.name,
  33. brandVariationHomeUrl: window.brandVariation.home_url
  34. }
  35. : undefined
  36. const ownerId =
  37. ide.$scope.project && ide.$scope.project.owner
  38. ? ide.$scope.project.owner._id
  39. : null
  40. const [loading] = useScopeValue('state.loading', ide.$scope)
  41. const [projectName, setProjectName] = useScopeValue(
  42. 'project.name',
  43. ide.$scope
  44. )
  45. const renameProject = useCallback(
  46. newName => {
  47. setProjectName(oldName => {
  48. if (oldName !== newName) {
  49. settings.saveProjectSettings({ name: newName }).catch(response => {
  50. setProjectName(oldName)
  51. const { data, status } = response
  52. if (status === 400) {
  53. return ide.showGenericMessageModal('Error renaming project', data)
  54. } else {
  55. return ide.showGenericMessageModal(
  56. 'Error renaming project',
  57. 'Please try again in a moment'
  58. )
  59. }
  60. })
  61. }
  62. return newName
  63. })
  64. },
  65. [settings, ide, setProjectName]
  66. )
  67. const { setTitle } = useBrowserWindow()
  68. setTitle(
  69. `${projectName ? projectName + ' - ' : ''}Online LaTeX Editor ${appName}`
  70. )
  71. const editorContextValue = {
  72. cobranding,
  73. loading,
  74. projectId: window.project_id,
  75. projectName: projectName || '', // initially might be empty in Angular
  76. renameProject,
  77. isProjectOwner: ownerId === window.user.id,
  78. isRestrictedTokenMember: window.isRestrictedTokenMember
  79. }
  80. return (
  81. <>
  82. <EditorContext.Provider value={editorContextValue}>
  83. {children}
  84. </EditorContext.Provider>
  85. </>
  86. )
  87. }
  88. EditorProvider.propTypes = {
  89. children: PropTypes.any,
  90. ide: PropTypes.any.isRequired,
  91. settings: PropTypes.any.isRequired
  92. }
  93. export function useEditorContext(propTypes) {
  94. const data = useContext(EditorContext)
  95. PropTypes.checkPropTypes(propTypes, data, 'data', 'EditorContext.Provider')
  96. return data
  97. }