|
@@ -4,6 +4,7 @@ import {
|
|
|
SetStateAction,
|
|
SetStateAction,
|
|
|
useCallback,
|
|
useCallback,
|
|
|
useEffect,
|
|
useEffect,
|
|
|
|
|
+ useMemo,
|
|
|
useState,
|
|
useState,
|
|
|
} from 'react'
|
|
} from 'react'
|
|
|
import ReactDOM from 'react-dom'
|
|
import ReactDOM from 'react-dom'
|
|
@@ -14,14 +15,19 @@ import {
|
|
|
useCodeMirrorViewContext,
|
|
useCodeMirrorViewContext,
|
|
|
} from '@/features/source-editor/components/codemirror-context'
|
|
} from '@/features/source-editor/components/codemirror-context'
|
|
|
import {
|
|
import {
|
|
|
- addCommentStateField,
|
|
|
|
|
buildAddNewCommentRangeEffect,
|
|
buildAddNewCommentRangeEffect,
|
|
|
-} from '@/features/source-editor/extensions/add-comment'
|
|
|
|
|
|
|
+ reviewTooltipStateField,
|
|
|
|
|
+} from '@/features/source-editor/extensions/review-tooltip'
|
|
|
import { getTooltip } from '@codemirror/view'
|
|
import { getTooltip } from '@codemirror/view'
|
|
|
import useViewerPermissions from '@/shared/hooks/use-viewer-permissions'
|
|
import useViewerPermissions from '@/shared/hooks/use-viewer-permissions'
|
|
|
import usePreviousValue from '@/shared/hooks/use-previous-value'
|
|
import usePreviousValue from '@/shared/hooks/use-previous-value'
|
|
|
import { useLayoutContext } from '@/shared/context/layout-context'
|
|
import { useLayoutContext } from '@/shared/context/layout-context'
|
|
|
import { useReviewPanelViewActionsContext } from '../context/review-panel-view-context'
|
|
import { useReviewPanelViewActionsContext } from '../context/review-panel-view-context'
|
|
|
|
|
+import {
|
|
|
|
|
+ useRangesActionsContext,
|
|
|
|
|
+ useRangesContext,
|
|
|
|
|
+} from '../context/ranges-context'
|
|
|
|
|
+import { isInsertOperation } from '@/utils/operations'
|
|
|
|
|
|
|
|
const ReviewTooltipMenu: FC = () => {
|
|
const ReviewTooltipMenu: FC = () => {
|
|
|
const state = useCodeMirrorStateContext()
|
|
const state = useCodeMirrorStateContext()
|
|
@@ -29,7 +35,7 @@ const ReviewTooltipMenu: FC = () => {
|
|
|
const isViewer = useViewerPermissions()
|
|
const isViewer = useViewerPermissions()
|
|
|
const [show, setShow] = useState(true)
|
|
const [show, setShow] = useState(true)
|
|
|
|
|
|
|
|
- const tooltipState = state.field(addCommentStateField, false)?.tooltip
|
|
|
|
|
|
|
+ const tooltipState = state.field(reviewTooltipStateField, false)?.tooltip
|
|
|
const previousTooltipState = usePreviousValue(tooltipState)
|
|
const previousTooltipState = usePreviousValue(tooltipState)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
@@ -62,6 +68,8 @@ const ReviewTooltipMenuContent: FC<{
|
|
|
const state = useCodeMirrorStateContext()
|
|
const state = useCodeMirrorStateContext()
|
|
|
const { setReviewPanelOpen } = useLayoutContext()
|
|
const { setReviewPanelOpen } = useLayoutContext()
|
|
|
const { setView } = useReviewPanelViewActionsContext()
|
|
const { setView } = useReviewPanelViewActionsContext()
|
|
|
|
|
+ const ranges = useRangesContext()
|
|
|
|
|
+ const { acceptChanges, rejectChanges } = useRangesActionsContext()
|
|
|
|
|
|
|
|
const addComment = useCallback(() => {
|
|
const addComment = useCallback(() => {
|
|
|
setReviewPanelOpen(true)
|
|
setReviewPanelOpen(true)
|
|
@@ -80,6 +88,28 @@ const ReviewTooltipMenuContent: FC<{
|
|
|
}
|
|
}
|
|
|
}, [addComment])
|
|
}, [addComment])
|
|
|
|
|
|
|
|
|
|
+ const changeIdsInSelection = useMemo(() => {
|
|
|
|
|
+ return (ranges?.changes ?? [])
|
|
|
|
|
+ .filter(({ op }) => {
|
|
|
|
|
+ const opFrom = op.p
|
|
|
|
|
+ const opLength = isInsertOperation(op) ? op.i.length : 0
|
|
|
|
|
+ const opTo = opFrom + opLength
|
|
|
|
|
+ const selection = state.selection.main
|
|
|
|
|
+ return opFrom >= selection.from && opTo <= selection.to
|
|
|
|
|
+ })
|
|
|
|
|
+ .map(({ id }) => id)
|
|
|
|
|
+ }, [ranges, state.selection.main])
|
|
|
|
|
+
|
|
|
|
|
+ const acceptChangesHandler = useCallback(() => {
|
|
|
|
|
+ acceptChanges(...changeIdsInSelection)
|
|
|
|
|
+ }, [acceptChanges, changeIdsInSelection])
|
|
|
|
|
+
|
|
|
|
|
+ const rejectChangesHandler = useCallback(() => {
|
|
|
|
|
+ rejectChanges(...changeIdsInSelection)
|
|
|
|
|
+ }, [rejectChanges, changeIdsInSelection])
|
|
|
|
|
+
|
|
|
|
|
+ const showChangesButtons = changeIdsInSelection.length > 0
|
|
|
|
|
+
|
|
|
return (
|
|
return (
|
|
|
<div className="review-tooltip-menu">
|
|
<div className="review-tooltip-menu">
|
|
|
<button
|
|
<button
|
|
@@ -89,6 +119,23 @@ const ReviewTooltipMenuContent: FC<{
|
|
|
<MaterialIcon type="chat" />
|
|
<MaterialIcon type="chat" />
|
|
|
{t('add_comment')}
|
|
{t('add_comment')}
|
|
|
</button>
|
|
</button>
|
|
|
|
|
+ {showChangesButtons && (
|
|
|
|
|
+ <>
|
|
|
|
|
+ <div className="review-tooltip-menu-divider" />
|
|
|
|
|
+ <button
|
|
|
|
|
+ className="review-tooltip-menu-button"
|
|
|
|
|
+ onClick={acceptChangesHandler}
|
|
|
|
|
+ >
|
|
|
|
|
+ <MaterialIcon type="check" />
|
|
|
|
|
+ </button>
|
|
|
|
|
+ <button
|
|
|
|
|
+ className="review-tooltip-menu-button"
|
|
|
|
|
+ onClick={rejectChangesHandler}
|
|
|
|
|
+ >
|
|
|
|
|
+ <MaterialIcon type="clear" />
|
|
|
|
|
+ </button>
|
|
|
|
|
+ </>
|
|
|
|
|
+ )}
|
|
|
</div>
|
|
</div>
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|