mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-21 20:47:08 -05:00
Refactor review panel context (#17383)
GitOrigin-RevId: 23e7ff8632172ebd0bc544a2297d1d4179010832
This commit is contained in:
parent
bd2c3a61f3
commit
749660e168
9 changed files with 66 additions and 90 deletions
|
@ -28,7 +28,7 @@ import { useEditorContext } from '@/shared/context/editor-context'
|
||||||
import { deleteJSON, getJSON, postJSON } from '@/infrastructure/fetch-json'
|
import { deleteJSON, getJSON, postJSON } from '@/infrastructure/fetch-json'
|
||||||
import ColorManager from '@/ide/colors/ColorManager'
|
import ColorManager from '@/ide/colors/ColorManager'
|
||||||
import RangesTracker from '@overleaf/ranges-tracker'
|
import RangesTracker from '@overleaf/ranges-tracker'
|
||||||
import * as ReviewPanel from '../types/review-panel-state'
|
import type * as ReviewPanel from '@/features/source-editor/context/review-panel/types/review-panel-state'
|
||||||
import {
|
import {
|
||||||
CommentId,
|
CommentId,
|
||||||
ReviewPanelCommentThreadMessage,
|
ReviewPanelCommentThreadMessage,
|
||||||
|
@ -39,7 +39,6 @@ import {
|
||||||
} from '../../../../../../../types/review-panel/review-panel'
|
} from '../../../../../../../types/review-panel/review-panel'
|
||||||
import { UserId } from '../../../../../../../types/user'
|
import { UserId } from '../../../../../../../types/user'
|
||||||
import { PublicAccessLevel } from '../../../../../../../types/public-access-level'
|
import { PublicAccessLevel } from '../../../../../../../types/public-access-level'
|
||||||
import { ReviewPanelStateReactIde } from '../types/review-panel-state'
|
|
||||||
import {
|
import {
|
||||||
DeepReadonly,
|
DeepReadonly,
|
||||||
Entries,
|
Entries,
|
||||||
|
@ -125,7 +124,7 @@ const formatComment = (
|
||||||
return commentTyped
|
return commentTyped
|
||||||
}
|
}
|
||||||
|
|
||||||
function useReviewPanelState(): ReviewPanelStateReactIde {
|
function useReviewPanelState(): ReviewPanel.ReviewPanelState {
|
||||||
const { t } = useTranslation()
|
const { t } = useTranslation()
|
||||||
const { reviewPanelOpen, setReviewPanelOpen, setMiniReviewPanelVisible } =
|
const { reviewPanelOpen, setReviewPanelOpen, setMiniReviewPanelVisible } =
|
||||||
useLayoutContext()
|
useLayoutContext()
|
||||||
|
@ -1510,7 +1509,7 @@ function useReviewPanelState(): ReviewPanelStateReactIde {
|
||||||
}
|
}
|
||||||
}, [users])
|
}, [users])
|
||||||
|
|
||||||
const values = useMemo<ReviewPanelStateReactIde['values']>(
|
const values = useMemo<ReviewPanel.ReviewPanelState['values']>(
|
||||||
() => ({
|
() => ({
|
||||||
collapsed,
|
collapsed,
|
||||||
commentThreads,
|
commentThreads,
|
||||||
|
@ -1567,7 +1566,7 @@ function useReviewPanelState(): ReviewPanelStateReactIde {
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
const updaterFns = useMemo<ReviewPanelStateReactIde['updaterFns']>(
|
const updaterFns = useMemo<ReviewPanel.ReviewPanelState['updaterFns']>(
|
||||||
() => ({
|
() => ({
|
||||||
handleSetSubview,
|
handleSetSubview,
|
||||||
handleLayoutChange,
|
handleLayoutChange,
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
import { createContext } from 'react'
|
|
||||||
import useReviewPanelState from '@/features/ide-react/context/review-panel/hooks/use-review-panel-state'
|
|
||||||
import { ReviewPanelStateReactIde } from '@/features/ide-react/context/review-panel/types/review-panel-state'
|
|
||||||
|
|
||||||
export const ReviewPanelReactIdeValueContext = createContext<
|
|
||||||
ReviewPanelStateReactIde['values'] | undefined
|
|
||||||
>(undefined)
|
|
||||||
|
|
||||||
export const ReviewPanelReactIdeUpdaterFnsContext = createContext<
|
|
||||||
ReviewPanelStateReactIde['updaterFns'] | undefined
|
|
||||||
>(undefined)
|
|
||||||
|
|
||||||
export const ReviewPanelReactIdeProvider: React.FC = ({ children }) => {
|
|
||||||
const { values, updaterFns } = useReviewPanelState()
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ReviewPanelReactIdeValueContext.Provider value={values}>
|
|
||||||
<ReviewPanelReactIdeUpdaterFnsContext.Provider value={updaterFns}>
|
|
||||||
{children}
|
|
||||||
</ReviewPanelReactIdeUpdaterFnsContext.Provider>
|
|
||||||
</ReviewPanelReactIdeValueContext.Provider>
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
import useReviewPanelState from '@/features/ide-react/context/review-panel/hooks/use-review-panel-state'
|
||||||
|
import {
|
||||||
|
ReviewPanelUpdaterFnsContext,
|
||||||
|
ReviewPanelValueContext,
|
||||||
|
} from '@/features/source-editor/context/review-panel/review-panel-context'
|
||||||
|
|
||||||
|
const ReviewPanelReactIdeProvider: React.FC = ({ children }) => {
|
||||||
|
const { values, updaterFns } = useReviewPanelState()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ReviewPanelValueContext.Provider value={values}>
|
||||||
|
<ReviewPanelUpdaterFnsContext.Provider value={updaterFns}>
|
||||||
|
{children}
|
||||||
|
</ReviewPanelUpdaterFnsContext.Provider>
|
||||||
|
</ReviewPanelValueContext.Provider>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReviewPanelReactIdeProvider
|
|
@ -1,11 +0,0 @@
|
||||||
import { ReviewPanelState } from '@/features/source-editor/context/review-panel/types/review-panel-state'
|
|
||||||
|
|
||||||
export interface ReviewPanelStateReactIde extends ReviewPanelState {}
|
|
||||||
|
|
||||||
// Getter for values
|
|
||||||
export type Value<T extends keyof ReviewPanelStateReactIde['values']> =
|
|
||||||
ReviewPanelStateReactIde['values'][T]
|
|
||||||
|
|
||||||
// Getter for stable functions
|
|
||||||
export type UpdaterFn<T extends keyof ReviewPanelStateReactIde['updaterFns']> =
|
|
||||||
ReviewPanelStateReactIde['updaterFns'][T]
|
|
|
@ -3,15 +3,13 @@ import EditorWidgets from './editor-widgets/editor-widgets'
|
||||||
import CurrentFileContainer from './current-file-container'
|
import CurrentFileContainer from './current-file-container'
|
||||||
import OverviewContainer from './overview-container'
|
import OverviewContainer from './overview-container'
|
||||||
import { useCodeMirrorViewContext } from '../codemirror-editor'
|
import { useCodeMirrorViewContext } from '../codemirror-editor'
|
||||||
import {
|
import { useReviewPanelValueContext } from '../../context/review-panel/review-panel-context'
|
||||||
ReviewPanelProvider,
|
|
||||||
useReviewPanelValueContext,
|
|
||||||
} from '../../context/review-panel/review-panel-context'
|
|
||||||
import { ReviewPanelReactIdeProvider } from '@/features/ide-react/context/review-panel/review-panel-context'
|
|
||||||
import { isCurrentFileView } from '../../utils/sub-view'
|
import { isCurrentFileView } from '../../utils/sub-view'
|
||||||
import { useLayoutContext } from '@/shared/context/layout-context'
|
import { useLayoutContext } from '@/shared/context/layout-context'
|
||||||
import { useIdeContext } from '@/shared/context/ide-context'
|
import { useIdeContext } from '@/shared/context/ide-context'
|
||||||
import classnames from 'classnames'
|
import classnames from 'classnames'
|
||||||
|
import { lazy, memo } from 'react'
|
||||||
|
import getMeta from '@/utils/meta'
|
||||||
|
|
||||||
type ReviewPanelViewProps = {
|
type ReviewPanelViewProps = {
|
||||||
parentDomNode: Element
|
parentDomNode: Element
|
||||||
|
@ -58,19 +56,22 @@ function ReviewPanelView({ parentDomNode }: ReviewPanelViewProps) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const isReactIde: boolean = getMeta('ol-idePageReact')
|
||||||
|
|
||||||
|
const ReviewPanelProvider = lazy(() =>
|
||||||
|
isReactIde
|
||||||
|
? import('@/features/ide-react/context/review-panel/review-panel-provider')
|
||||||
|
: import('../../context/review-panel/review-panel-provider')
|
||||||
|
)
|
||||||
|
|
||||||
function ReviewPanel() {
|
function ReviewPanel() {
|
||||||
const view = useCodeMirrorViewContext()
|
const view = useCodeMirrorViewContext()
|
||||||
const { isReactIde } = useIdeContext()
|
|
||||||
|
|
||||||
return isReactIde ? (
|
return (
|
||||||
<ReviewPanelReactIdeProvider>
|
|
||||||
<ReviewPanelView parentDomNode={view.scrollDOM} />
|
|
||||||
</ReviewPanelReactIdeProvider>
|
|
||||||
) : (
|
|
||||||
<ReviewPanelProvider>
|
<ReviewPanelProvider>
|
||||||
<ReviewPanelView parentDomNode={view.scrollDOM} />
|
<ReviewPanelView parentDomNode={view.scrollDOM} />
|
||||||
</ReviewPanelProvider>
|
</ReviewPanelProvider>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ReviewPanel
|
export default memo(ReviewPanel)
|
||||||
|
|
|
@ -2,8 +2,7 @@ import { useState, useMemo, useCallback } from 'react'
|
||||||
import useScopeValue from '../../../../../shared/hooks/use-scope-value'
|
import useScopeValue from '../../../../../shared/hooks/use-scope-value'
|
||||||
import useLayoutToLeft from '@/features/ide-react/context/review-panel/hooks/useLayoutToLeft'
|
import useLayoutToLeft from '@/features/ide-react/context/review-panel/hooks/useLayoutToLeft'
|
||||||
import { sendMB } from '../../../../../infrastructure/event-tracking'
|
import { sendMB } from '../../../../../infrastructure/event-tracking'
|
||||||
import { ReviewPanelState } from '../types/review-panel-state'
|
import type * as ReviewPanel from '../types/review-panel-state'
|
||||||
import * as ReviewPanel from '../types/review-panel-state'
|
|
||||||
import {
|
import {
|
||||||
SubView,
|
SubView,
|
||||||
ThreadId,
|
ThreadId,
|
||||||
|
@ -11,7 +10,7 @@ import {
|
||||||
import { DocId } from '../../../../../../../types/project-settings'
|
import { DocId } from '../../../../../../../types/project-settings'
|
||||||
import { dispatchReviewPanelLayout as handleLayoutChange } from '../../../extensions/changes/change-manager'
|
import { dispatchReviewPanelLayout as handleLayoutChange } from '../../../extensions/changes/change-manager'
|
||||||
|
|
||||||
function useAngularReviewPanelState(): ReviewPanelState {
|
function useAngularReviewPanelState(): ReviewPanel.ReviewPanelState {
|
||||||
const [subView, setSubView] = useScopeValue<ReviewPanel.Value<'subView'>>(
|
const [subView, setSubView] = useScopeValue<ReviewPanel.Value<'subView'>>(
|
||||||
'reviewPanel.subView'
|
'reviewPanel.subView'
|
||||||
)
|
)
|
||||||
|
@ -155,7 +154,7 @@ function useAngularReviewPanelState(): ReviewPanelState {
|
||||||
const [layoutSuspended, setLayoutSuspended] = useState(false)
|
const [layoutSuspended, setLayoutSuspended] = useState(false)
|
||||||
const [unsavedComment, setUnsavedComment] = useState('')
|
const [unsavedComment, setUnsavedComment] = useState('')
|
||||||
|
|
||||||
const values = useMemo<ReviewPanelState['values']>(
|
const values = useMemo<ReviewPanel.ReviewPanelState['values']>(
|
||||||
() => ({
|
() => ({
|
||||||
collapsed,
|
collapsed,
|
||||||
commentThreads,
|
commentThreads,
|
||||||
|
@ -212,7 +211,7 @@ function useAngularReviewPanelState(): ReviewPanelState {
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
const updaterFns = useMemo<ReviewPanelState['updaterFns']>(
|
const updaterFns = useMemo<ReviewPanel.ReviewPanelState['updaterFns']>(
|
||||||
() => ({
|
() => ({
|
||||||
handleSetSubview,
|
handleSetSubview,
|
||||||
handleLayoutChange,
|
handleLayoutChange,
|
||||||
|
|
|
@ -1,41 +1,16 @@
|
||||||
import { createContext, useContext } from 'react'
|
import { createContext, useContext } from 'react'
|
||||||
import useAngularReviewPanelState from './hooks/use-angular-review-panel-state'
|
import type { ReviewPanelState } from './types/review-panel-state'
|
||||||
import {
|
|
||||||
ReviewPanelReactIdeUpdaterFnsContext,
|
|
||||||
ReviewPanelReactIdeValueContext,
|
|
||||||
} from '@/features/ide-react/context/review-panel/review-panel-context'
|
|
||||||
import { useIdeContext } from '@/shared/context/ide-context'
|
|
||||||
import { ReviewPanelState } from './types/review-panel-state'
|
|
||||||
|
|
||||||
const ReviewPanelValueContext = createContext<
|
export const ReviewPanelValueContext = createContext<
|
||||||
ReviewPanelState['values'] | undefined
|
ReviewPanelState['values'] | undefined
|
||||||
>(undefined)
|
>(undefined)
|
||||||
|
|
||||||
const ReviewPanelUpdaterFnsContext = createContext<
|
export const ReviewPanelUpdaterFnsContext = createContext<
|
||||||
ReviewPanelState['updaterFns'] | undefined
|
ReviewPanelState['updaterFns'] | undefined
|
||||||
>(undefined)
|
>(undefined)
|
||||||
|
|
||||||
type ReviewPanelProviderProps = {
|
|
||||||
children?: React.ReactNode
|
|
||||||
}
|
|
||||||
|
|
||||||
export function ReviewPanelProvider({ children }: ReviewPanelProviderProps) {
|
|
||||||
const { values, updaterFns } = useAngularReviewPanelState()
|
|
||||||
|
|
||||||
return (
|
|
||||||
<ReviewPanelValueContext.Provider value={values}>
|
|
||||||
<ReviewPanelUpdaterFnsContext.Provider value={updaterFns}>
|
|
||||||
{children}
|
|
||||||
</ReviewPanelUpdaterFnsContext.Provider>
|
|
||||||
</ReviewPanelValueContext.Provider>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function useReviewPanelValueContext() {
|
export function useReviewPanelValueContext() {
|
||||||
const contextAngularIde = useContext(ReviewPanelValueContext)
|
const context = useContext(ReviewPanelValueContext)
|
||||||
const contextReactIde = useContext(ReviewPanelReactIdeValueContext)
|
|
||||||
const { isReactIde } = useIdeContext()
|
|
||||||
const context = isReactIde ? contextReactIde : contextAngularIde
|
|
||||||
|
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
@ -46,10 +21,7 @@ export function useReviewPanelValueContext() {
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useReviewPanelUpdaterFnsContext() {
|
export function useReviewPanelUpdaterFnsContext() {
|
||||||
const contextAngularIde = useContext(ReviewPanelUpdaterFnsContext)
|
const context = useContext(ReviewPanelUpdaterFnsContext)
|
||||||
const contextReactIde = useContext(ReviewPanelReactIdeUpdaterFnsContext)
|
|
||||||
const { isReactIde } = useIdeContext()
|
|
||||||
const context = isReactIde ? contextReactIde : contextAngularIde
|
|
||||||
|
|
||||||
if (!context) {
|
if (!context) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
import useAngularReviewPanelState from '@/features/source-editor/context/review-panel/hooks/use-angular-review-panel-state'
|
||||||
|
import { FC } from 'react'
|
||||||
|
import {
|
||||||
|
ReviewPanelUpdaterFnsContext,
|
||||||
|
ReviewPanelValueContext,
|
||||||
|
} from './review-panel-context'
|
||||||
|
|
||||||
|
const ReviewPanelProvider: FC = ({ children }) => {
|
||||||
|
const { values, updaterFns } = useAngularReviewPanelState()
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ReviewPanelValueContext.Provider value={values}>
|
||||||
|
<ReviewPanelUpdaterFnsContext.Provider value={updaterFns}>
|
||||||
|
{children}
|
||||||
|
</ReviewPanelUpdaterFnsContext.Provider>
|
||||||
|
</ReviewPanelValueContext.Provider>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReviewPanelProvider
|
|
@ -3,7 +3,7 @@ import useScopeValue from '../hooks/use-scope-value'
|
||||||
import getMeta from '@/utils/meta'
|
import getMeta from '@/utils/meta'
|
||||||
import { UserId } from '../../../../types/user'
|
import { UserId } from '../../../../types/user'
|
||||||
import { PublicAccessLevel } from '../../../../types/public-access-level'
|
import { PublicAccessLevel } from '../../../../types/public-access-level'
|
||||||
import * as ReviewPanel from '@/features/ide-react/context/review-panel/types/review-panel-state'
|
import type * as ReviewPanel from '@/features/source-editor/context/review-panel/types/review-panel-state'
|
||||||
|
|
||||||
const ProjectContext = createContext<
|
const ProjectContext = createContext<
|
||||||
| {
|
| {
|
||||||
|
|
Loading…
Reference in a new issue