diff --git a/services/web/frontend/js/features/chat/context/chat-context.js b/services/web/frontend/js/features/chat/context/chat-context.js
index 224621118f..78f578fe3e 100644
--- a/services/web/frontend/js/features/chat/context/chat-context.js
+++ b/services/web/frontend/js/features/chat/context/chat-context.js
@@ -10,7 +10,7 @@ import PropTypes from 'prop-types'
import { v4 as uuid } from 'uuid'
import { useApplicationContext } from '../../../shared/context/application-context'
-import { useEditorContext } from '../../../shared/context/editor-context'
+import { useProjectContext } from '../../../shared/context/project-context'
import { getJSON, postJSON } from '../../../infrastructure/fetch-json'
import { appendMessage, prependMessages } from '../utils/message-list-appender'
import useBrowserWindow from '../../../shared/hooks/use-browser-window'
@@ -120,8 +120,8 @@ export function ChatProvider({ children }) {
const { user } = useApplicationContext({
user: PropTypes.shape({ id: PropTypes.string.isRequired }),
})
- const { projectId } = useEditorContext({
- projectId: PropTypes.string.isRequired,
+ const { _id: projectId } = useProjectContext({
+ _id: PropTypes.string.isRequired,
})
const { chatIsOpen } = useLayoutContext({ chatIsOpen: PropTypes.bool })
diff --git a/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js b/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
index eff7688a38..aa91caa5be 100644
--- a/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
+++ b/services/web/frontend/js/features/editor-navigation-toolbar/components/editor-navigation-toolbar-root.js
@@ -5,16 +5,20 @@ import { useEditorContext } from '../../../shared/context/editor-context'
import { useChatContext } from '../../chat/context/chat-context'
import { useLayoutContext } from '../../../shared/context/layout-context'
import { useApplicationContext } from '../../../shared/context/application-context'
+import { useProjectContext } from '../../../shared/context/project-context'
const applicationContextPropTypes = {
user: PropTypes.object,
}
+const projectContextPropTypes = {
+ name: PropTypes.string.isRequired,
+}
+
const editorContextPropTypes = {
cobranding: PropTypes.object,
loading: PropTypes.bool,
isRestrictedTokenMember: PropTypes.bool,
- projectName: PropTypes.string.isRequired,
renameProject: PropTypes.func.isRequired,
isProjectOwner: PropTypes.bool,
}
@@ -43,11 +47,12 @@ const EditorNavigationToolbarRoot = React.memo(
}) {
const { user } = useApplicationContext(applicationContextPropTypes)
+ const { name: projectName } = useProjectContext(projectContextPropTypes)
+
const {
cobranding,
loading,
isRestrictedTokenMember,
- projectName,
renameProject,
isProjectOwner,
} = useEditorContext(editorContextPropTypes)
diff --git a/services/web/frontend/js/features/file-view/components/file-view-header.js b/services/web/frontend/js/features/file-view/components/file-view-header.js
index c18fbf87ea..eda9fc9d17 100644
--- a/services/web/frontend/js/features/file-view/components/file-view-header.js
+++ b/services/web/frontend/js/features/file-view/components/file-view-header.js
@@ -5,7 +5,7 @@ import { Trans, useTranslation } from 'react-i18next'
import Icon from '../../../shared/components/icon'
import { formatTime, relativeDate } from '../../utils/format-date'
import { postJSON } from '../../../infrastructure/fetch-json'
-import { useEditorContext } from '../../../shared/context/editor-context'
+import { useProjectContext } from '../../../shared/context/project-context'
import importOverleafModules from '../../../../macros/import-overleaf-module.macro'
import useAbortController from '../../../shared/hooks/use-abort-controller'
@@ -32,8 +32,8 @@ function shortenedUrl(url) {
}
export default function FileViewHeader({ file, storeReferencesKeys }) {
- const { projectId } = useEditorContext({
- projectId: PropTypes.string.isRequired,
+ const { _id: projectId } = useProjectContext({
+ _id: PropTypes.string.isRequired,
})
const { t } = useTranslation()
diff --git a/services/web/frontend/js/features/file-view/components/file-view-image.js b/services/web/frontend/js/features/file-view/components/file-view-image.js
index 64fa6cee16..ff037b3c19 100644
--- a/services/web/frontend/js/features/file-view/components/file-view-image.js
+++ b/services/web/frontend/js/features/file-view/components/file-view-image.js
@@ -1,9 +1,9 @@
import PropTypes from 'prop-types'
-import { useEditorContext } from '../../../shared/context/editor-context'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function FileViewImage({ fileName, fileId, onLoad, onError }) {
- const { projectId } = useEditorContext({
- projectId: PropTypes.string.isRequired,
+ const { _id: projectId } = useProjectContext({
+ _id: PropTypes.string.isRequired,
})
return (
diff --git a/services/web/frontend/js/features/file-view/components/file-view-text.js b/services/web/frontend/js/features/file-view/components/file-view-text.js
index a9c1f11db3..92a475627a 100644
--- a/services/web/frontend/js/features/file-view/components/file-view-text.js
+++ b/services/web/frontend/js/features/file-view/components/file-view-text.js
@@ -1,12 +1,12 @@
import { useState, useEffect } from 'react'
import PropTypes from 'prop-types'
-import { useEditorContext } from '../../../shared/context/editor-context'
+import { useProjectContext } from '../../../shared/context/project-context'
const MAX_FILE_SIZE = 2 * 1024 * 1024
export default function FileViewText({ file, onLoad, onError }) {
- const { projectId } = useEditorContext({
- projectId: PropTypes.string.isRequired,
+ const { _id: projectId } = useProjectContext({
+ _id: PropTypes.string.isRequired,
})
const [textPreview, setTextPreview] = useState('')
diff --git a/services/web/frontend/js/features/outline/components/outline-pane.js b/services/web/frontend/js/features/outline/components/outline-pane.js
index 6dbf1d6080..ba4d47875b 100644
--- a/services/web/frontend/js/features/outline/components/outline-pane.js
+++ b/services/web/frontend/js/features/outline/components/outline-pane.js
@@ -7,7 +7,7 @@ import OutlineRoot from './outline-root'
import Icon from '../../../shared/components/icon'
import localStorage from '../../../infrastructure/local-storage'
import withErrorBoundary from '../../../infrastructure/error-boundary'
-import { useEditorContext } from '../../../shared/context/editor-context'
+import { useProjectContext } from '../../../shared/context/project-context'
const OutlinePane = React.memo(function OutlinePane({
isTexFile,
@@ -19,8 +19,8 @@ const OutlinePane = React.memo(function OutlinePane({
}) {
const { t } = useTranslation()
- const { projectId } = useEditorContext({
- projectId: PropTypes.string.isRequired,
+ const { _id: projectId } = useProjectContext({
+ _id: PropTypes.string.isRequired,
})
const storageKey = `file_outline.expanded.${projectId}`
diff --git a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.js b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.js
index b4ccd96351..da2b2dea01 100644
--- a/services/web/frontend/js/features/share-project-modal/components/add-collaborators.js
+++ b/services/web/frontend/js/features/share-project-modal/components/add-collaborators.js
@@ -2,14 +2,12 @@ import { useState, useMemo } from 'react'
import { useTranslation, Trans } from 'react-i18next'
import { Form, FormGroup, FormControl, Button } from 'react-bootstrap'
import { useMultipleSelection } from 'downshift'
-import {
- useProjectContext,
- useShareProjectContext,
-} from './share-project-modal'
+import { useShareProjectContext } from './share-project-modal'
import SelectCollaborators from './select-collaborators'
import { resendInvite, sendInvite } from '../utils/api'
import { useUserContacts } from '../hooks/use-user-contacts'
import useIsMounted from '../../../shared/hooks/use-is-mounted'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function AddCollaborators() {
const [privileges, setPrivileges] = useState('readAndWrite')
diff --git a/services/web/frontend/js/features/share-project-modal/components/edit-member.js b/services/web/frontend/js/features/share-project-modal/components/edit-member.js
index 5ff38175c2..5c6af53bb3 100644
--- a/services/web/frontend/js/features/share-project-modal/components/edit-member.js
+++ b/services/web/frontend/js/features/share-project-modal/components/edit-member.js
@@ -1,10 +1,7 @@
import { useState, useEffect } from 'react'
import PropTypes from 'prop-types'
import { Trans, useTranslation } from 'react-i18next'
-import {
- useProjectContext,
- useShareProjectContext,
-} from './share-project-modal'
+import { useShareProjectContext } from './share-project-modal'
import Icon from '../../../shared/components/icon'
import TransferOwnershipModal from './transfer-ownership-modal'
import {
@@ -17,6 +14,7 @@ import {
Tooltip,
} from 'react-bootstrap'
import { removeMemberFromProject, updateMember } from '../utils/api'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function EditMember({ member }) {
const [privileges, setPrivileges] = useState(member.privileges)
diff --git a/services/web/frontend/js/features/share-project-modal/components/invite.js b/services/web/frontend/js/features/share-project-modal/components/invite.js
index 59fdf28410..5440beb896 100644
--- a/services/web/frontend/js/features/share-project-modal/components/invite.js
+++ b/services/web/frontend/js/features/share-project-modal/components/invite.js
@@ -1,14 +1,12 @@
import { useCallback } from 'react'
import PropTypes from 'prop-types'
-import {
- useProjectContext,
- useShareProjectContext,
-} from './share-project-modal'
+import { useShareProjectContext } from './share-project-modal'
import Icon from '../../../shared/components/icon'
import { Button, Col, Row, OverlayTrigger, Tooltip } from 'react-bootstrap'
import { Trans, useTranslation } from 'react-i18next'
import MemberPrivileges from './member-privileges'
import { resendInvite, revokeInvite } from '../utils/api'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function Invite({ invite, isAdmin }) {
return (
diff --git a/services/web/frontend/js/features/share-project-modal/components/link-sharing.js b/services/web/frontend/js/features/share-project-modal/components/link-sharing.js
index 6763432b70..c20fa81214 100644
--- a/services/web/frontend/js/features/share-project-modal/components/link-sharing.js
+++ b/services/web/frontend/js/features/share-project-modal/components/link-sharing.js
@@ -3,12 +3,10 @@ import PropTypes from 'prop-types'
import { Button, Col, OverlayTrigger, Row, Tooltip } from 'react-bootstrap'
import { Trans } from 'react-i18next'
import Icon from '../../../shared/components/icon'
-import {
- useProjectContext,
- useShareProjectContext,
-} from './share-project-modal'
+import { useShareProjectContext } from './share-project-modal'
import { setProjectAccessLevel } from '../utils/api'
import CopyLink from '../../../shared/components/copy-link'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function LinkSharing() {
const [inflight, setInflight] = useState(false)
diff --git a/services/web/frontend/js/features/share-project-modal/components/owner-info.js b/services/web/frontend/js/features/share-project-modal/components/owner-info.js
index 4d73d71955..e7ec7a8653 100644
--- a/services/web/frontend/js/features/share-project-modal/components/owner-info.js
+++ b/services/web/frontend/js/features/share-project-modal/components/owner-info.js
@@ -1,4 +1,4 @@
-import { useProjectContext } from './share-project-modal'
+import { useProjectContext } from '../../../shared/context/project-context'
import { Col, Row } from 'react-bootstrap'
import { Trans } from 'react-i18next'
diff --git a/services/web/frontend/js/features/share-project-modal/components/send-invites-notice.js b/services/web/frontend/js/features/share-project-modal/components/send-invites-notice.js
index 2281d4ecf6..2c34d65ab9 100644
--- a/services/web/frontend/js/features/share-project-modal/components/send-invites-notice.js
+++ b/services/web/frontend/js/features/share-project-modal/components/send-invites-notice.js
@@ -1,7 +1,7 @@
import { Col, Row } from 'react-bootstrap'
import PropTypes from 'prop-types'
import { Trans } from 'react-i18next'
-import { useProjectContext } from './share-project-modal'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function SendInvitesNotice() {
const project = useProjectContext()
diff --git a/services/web/frontend/js/features/share-project-modal/components/send-invites.js b/services/web/frontend/js/features/share-project-modal/components/send-invites.js
index 2ff9425fa9..12392a64e5 100644
--- a/services/web/frontend/js/features/share-project-modal/components/send-invites.js
+++ b/services/web/frontend/js/features/share-project-modal/components/send-invites.js
@@ -1,8 +1,8 @@
import { useMemo } from 'react'
import { Row } from 'react-bootstrap'
-import { useProjectContext } from './share-project-modal'
import AddCollaborators from './add-collaborators'
import AddCollaboratorsUpgrade from './add-collaborators-upgrade'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function SendInvites() {
const project = useProjectContext()
diff --git a/services/web/frontend/js/features/share-project-modal/components/share-modal-body.js b/services/web/frontend/js/features/share-project-modal/components/share-modal-body.js
index f02322c965..8944ef2ea4 100644
--- a/services/web/frontend/js/features/share-project-modal/components/share-modal-body.js
+++ b/services/web/frontend/js/features/share-project-modal/components/share-modal-body.js
@@ -1,7 +1,4 @@
-import {
- useProjectContext,
- useShareProjectContext,
-} from './share-project-modal'
+import { useShareProjectContext } from './share-project-modal'
import EditMember from './edit-member'
import LinkSharing from './link-sharing'
import Invite from './invite'
@@ -9,6 +6,7 @@ import SendInvites from './send-invites'
import ViewMember from './view-member'
import OwnerInfo from './owner-info'
import SendInvitesNotice from './send-invites-notice'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function ShareModalBody() {
const { isAdmin } = useShareProjectContext()
diff --git a/services/web/frontend/js/features/share-project-modal/components/share-project-modal.js b/services/web/frontend/js/features/share-project-modal/components/share-project-modal.js
index 27e8b64192..731e59670b 100644
--- a/services/web/frontend/js/features/share-project-modal/components/share-project-modal.js
+++ b/services/web/frontend/js/features/share-project-modal/components/share-project-modal.js
@@ -7,7 +7,7 @@ import React, {
} from 'react'
import PropTypes from 'prop-types'
import ShareProjectModalContent from './share-project-modal-content'
-import useScopeValue from '../../../shared/context/util/scope-value-hook'
+import { useProjectContext } from '../../../shared/context/project-context'
const ShareProjectContext = createContext()
@@ -35,7 +35,7 @@ export function useShareProjectContext() {
return context
}
-const projectShape = PropTypes.shape({
+const projectShape = {
_id: PropTypes.string.isRequired,
members: PropTypes.arrayOf(
PropTypes.shape({
@@ -59,24 +59,6 @@ const projectShape = PropTypes.shape({
owner: PropTypes.shape({
email: PropTypes.string,
}),
-})
-
-const ProjectContext = createContext()
-
-ProjectContext.Provider.propTypes = {
- value: projectShape,
-}
-
-export function useProjectContext() {
- const context = useContext(ProjectContext)
-
- if (!context) {
- throw new Error(
- 'useProjectContext is only available inside ShareProjectProvider'
- )
- }
-
- return context
}
const ShareProjectModal = React.memo(function ShareProjectModal({
@@ -88,7 +70,7 @@ const ShareProjectModal = React.memo(function ShareProjectModal({
const [inFlight, setInFlight] = useState(false)
const [error, setError] = useState()
- const [project, setProject] = useScopeValue('project', true)
+ const project = useProjectContext(projectShape)
// reset error when the modal is opened
useEffect(() => {
@@ -127,12 +109,9 @@ const ShareProjectModal = React.memo(function ShareProjectModal({
}, [])
// merge the new data with the old project data
- const updateProject = useCallback(
- data => {
- setProject(project => Object.assign(project, data))
- },
- [setProject]
- )
+ const updateProject = useCallback(data => Object.assign(project, data), [
+ project,
+ ])
if (!project) {
return null
@@ -150,15 +129,13 @@ const ShareProjectModal = React.memo(function ShareProjectModal({
setError,
}}
>
-
-
-
+
)
})
diff --git a/services/web/frontend/js/features/share-project-modal/components/transfer-ownership-modal.js b/services/web/frontend/js/features/share-project-modal/components/transfer-ownership-modal.js
index 13d305647a..c806aec710 100644
--- a/services/web/frontend/js/features/share-project-modal/components/transfer-ownership-modal.js
+++ b/services/web/frontend/js/features/share-project-modal/components/transfer-ownership-modal.js
@@ -2,11 +2,11 @@ import { useState } from 'react'
import { Modal, Button } from 'react-bootstrap'
import { Trans } from 'react-i18next'
import PropTypes from 'prop-types'
-import { useProjectContext } from './share-project-modal'
import Icon from '../../../shared/components/icon'
import { transferProjectOwnership } from '../utils/api'
import AccessibleModal from '../../../shared/components/accessible-modal'
import { reload } from '../utils/location'
+import { useProjectContext } from '../../../shared/context/project-context'
export default function TransferOwnershipModal({ member, cancel }) {
const [inflight, setInflight] = useState(false)
diff --git a/services/web/frontend/js/shared/context/editor-context.js b/services/web/frontend/js/shared/context/editor-context.js
index 9928bc15ed..c4870806ea 100644
--- a/services/web/frontend/js/shared/context/editor-context.js
+++ b/services/web/frontend/js/shared/context/editor-context.js
@@ -9,6 +9,7 @@ import PropTypes from 'prop-types'
import useScopeValue from './util/scope-value-hook'
import useBrowserWindow from '../hooks/use-browser-window'
import { useIdeContext } from './ide-context'
+import { useProjectContext } from './project-context'
export const EditorContext = createContext()
@@ -27,43 +28,48 @@ EditorContext.Provider.propTypes = {
}),
hasPremiumCompile: PropTypes.bool,
loading: PropTypes.bool,
- projectRootDocId: PropTypes.string,
- projectId: PropTypes.string.isRequired,
- projectName: PropTypes.string.isRequired,
renameProject: PropTypes.func.isRequired,
isProjectOwner: PropTypes.bool,
isRestrictedTokenMember: PropTypes.bool,
- rootFolder: PropTypes.object,
+ rootFolder: PropTypes.shape({
+ children: PropTypes.arrayOf(PropTypes.shape({ type: PropTypes.string })),
+ }),
}),
}
export function EditorProvider({ children, settings }) {
const ide = useIdeContext()
- const cobranding = useMemo(
- () =>
- window.brandVariation
- ? {
- logoImgUrl: window.brandVariation.logo_url,
- brandVariationName: window.brandVariation.name,
- brandVariationId: window.brandVariation.id,
- brandId: window.brandVariation.brand_id,
- brandVariationHomeUrl: window.brandVariation.home_url,
- publishGuideHtml: window.brandVariation.publish_guide_html,
- partner: window.brandVariation.partner,
- brandedMenu: window.brandVariation.branded_menu,
- submitBtnHtml: window.brandVariation.submit_button_html,
- }
- : undefined,
- []
- )
+ const { owner, features } = useProjectContext({
+ owner: PropTypes.shape({
+ _id: PropTypes.string.isRequired,
+ }),
+ features: PropTypes.shape({
+ compileGroup: PropTypes.string,
+ }),
+ })
+
+ const cobranding = useMemo(() => {
+ if (window.brandVariation) {
+ return {
+ logoImgUrl: window.brandVariation.logo_url,
+ brandVariationName: window.brandVariation.name,
+ brandVariationId: window.brandVariation.id,
+ brandId: window.brandVariation.brand_id,
+ brandVariationHomeUrl: window.brandVariation.home_url,
+ publishGuideHtml: window.brandVariation.publish_guide_html,
+ partner: window.brandVariation.partner,
+ brandedMenu: window.brandVariation.branded_menu,
+ submitBtnHtml: window.brandVariation.submit_button_html,
+ }
+ } else {
+ return undefined
+ }
+ }, [])
const [loading] = useScopeValue('state.loading')
- const [projectRootDocId] = useScopeValue('project.rootDoc_id')
const [projectName, setProjectName] = useScopeValue('project.name')
- const [compileGroup] = useScopeValue('project.features.compileGroup')
const [rootFolder] = useScopeValue('rootFolder')
- const [ownerId] = useScopeValue('project.owner._id')
const renameProject = useCallback(
newName => {
@@ -100,24 +106,19 @@ export function EditorProvider({ children, settings }) {
const value = useMemo(
() => ({
cobranding,
- hasPremiumCompile: compileGroup === 'priority',
+ hasPremiumCompile: features?.compileGroup === 'priority',
loading,
- projectId: window.project_id,
- projectRootDocId,
- projectName: projectName || '', // initially might be empty in Angular
renameProject,
- isProjectOwner: ownerId === window.user.id,
+ isProjectOwner: owner?._id === window.user.id,
isRestrictedTokenMember: window.isRestrictedTokenMember,
rootFolder,
}),
[
cobranding,
- compileGroup,
+ features?.compileGroup,
loading,
- ownerId,
- projectName,
- projectRootDocId,
renameProject,
+ owner?._id,
rootFolder,
]
)
diff --git a/services/web/frontend/js/shared/context/project-context.js b/services/web/frontend/js/shared/context/project-context.js
new file mode 100644
index 0000000000..aea17b34a3
--- /dev/null
+++ b/services/web/frontend/js/shared/context/project-context.js
@@ -0,0 +1,72 @@
+import { createContext, useContext } from 'react'
+import PropTypes from 'prop-types'
+import useScopeValue from './util/scope-value-hook'
+
+const ProjectContext = createContext()
+
+ProjectContext.Provider.propTypes = {
+ value: PropTypes.shape({
+ _id: PropTypes.string.isRequired,
+ name: PropTypes.string.isRequired,
+ rootDoc_id: PropTypes.string,
+ members: PropTypes.arrayOf(
+ PropTypes.shape({
+ _id: PropTypes.string.isRequired,
+ })
+ ),
+ invites: PropTypes.arrayOf(
+ PropTypes.shape({
+ _id: PropTypes.string.isRequired,
+ })
+ ),
+ features: PropTypes.shape({
+ collaborators: PropTypes.number,
+ compileGroup: PropTypes.oneOf(['alpha', 'standard', 'priority'])
+ .isRequired,
+ }),
+ publicAccesLevel: PropTypes.string,
+ tokens: PropTypes.shape({
+ readOnly: PropTypes.string,
+ readAndWrite: PropTypes.string,
+ }),
+ owner: PropTypes.shape({
+ _id: PropTypes.string.isRequired,
+ email: PropTypes.string.isRequired,
+ }),
+ }),
+}
+
+export function useProjectContext(propTypes) {
+ const context = useContext(ProjectContext)
+
+ if (!context) {
+ throw new Error(
+ 'useProjectContext is only available inside ProjectProvider'
+ )
+ }
+
+ PropTypes.checkPropTypes(
+ propTypes,
+ context,
+ 'data',
+ 'ProjectContext.Provider'
+ )
+
+ return context
+}
+
+export function ProjectProvider({ children }) {
+ const [project] = useScopeValue('project', true)
+
+ // when the provider is created the project is still not added to the Angular scope.
+ // Name is also populated to prevent errors in existing React components
+ const value = project || { _id: window.project_id, name: '' }
+
+ return (
+ {children}
+ )
+}
+
+ProjectProvider.propTypes = {
+ children: PropTypes.any,
+}
diff --git a/services/web/frontend/js/shared/context/root-context.js b/services/web/frontend/js/shared/context/root-context.js
index a503134dca..e72211b8ef 100644
--- a/services/web/frontend/js/shared/context/root-context.js
+++ b/services/web/frontend/js/shared/context/root-context.js
@@ -7,18 +7,21 @@ import { EditorProvider } from './editor-context'
import { CompileProvider } from './compile-context'
import { LayoutProvider } from './layout-context'
import { ChatProvider } from '../../features/chat/context/chat-context'
+import { ProjectProvider } from './project-context'
export function ContextRoot({ children, ide, settings }) {
return (
-
-
-
- {children}
-
-
-
+
+
+
+
+ {children}
+
+
+
+
)
diff --git a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.js b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.js
index 1c386cb8a1..a467ecc7bb 100644
--- a/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.js
+++ b/services/web/test/frontend/features/share-project-modal/components/share-project-modal.test.js
@@ -23,8 +23,10 @@ describe('', function () {
name: 'Test Project',
features: {
collaborators: 10,
+ compileGroup: 'standard',
},
owner: {
+ _id: 'member_author',
email: 'project-owner@example.com',
},
members: [],
@@ -623,6 +625,7 @@ describe('', function () {
publicAccesLevel: 'tokenBased',
features: {
collaborators: 0,
+ compileGroup: 'standard',
},
},
},
diff --git a/services/web/test/frontend/helpers/render-with-context.js b/services/web/test/frontend/helpers/render-with-context.js
index 59504564da..1b04e78285 100644
--- a/services/web/test/frontend/helpers/render-with-context.js
+++ b/services/web/test/frontend/helpers/render-with-context.js
@@ -9,6 +9,7 @@ import { LayoutProvider } from '../../../frontend/js/shared/context/layout-conte
import { ChatProvider } from '../../../frontend/js/features/chat/context/chat-context'
import { IdeProvider } from '../../../frontend/js/shared/context/ide-context'
import { get } from 'lodash'
+import { ProjectProvider } from '../../../frontend/js/shared/context/project-context'
export function EditorProviders({
user = { id: '123abd' },
@@ -28,8 +29,11 @@ export function EditorProviders({
const $scope = {
project: {
+ _id: window.project_id,
+ name: 'project-name',
owner: {
_id: '124abd',
+ email: 'owner@example.com',
},
},
ui: {
@@ -50,9 +54,11 @@ export function EditorProviders({
return (
-
- {children}
-
+
+
+ {children}
+
+
)