|
@@ -1,8 +1,6 @@
|
|
|
import {
|
|
import {
|
|
|
CSSProperties,
|
|
CSSProperties,
|
|
|
- Dispatch,
|
|
|
|
|
FC,
|
|
FC,
|
|
|
- SetStateAction,
|
|
|
|
|
useCallback,
|
|
useCallback,
|
|
|
useEffect,
|
|
useEffect,
|
|
|
useMemo,
|
|
useMemo,
|
|
@@ -35,6 +33,7 @@ import { useModalsContext } from '@/features/ide-react/context/modals-context'
|
|
|
import { numberOfChangesInSelection } from '../utils/changes-in-selection'
|
|
import { numberOfChangesInSelection } from '../utils/changes-in-selection'
|
|
|
import { useEditorManagerContext } from '@/features/ide-react/context/editor-manager-context'
|
|
import { useEditorManagerContext } from '@/features/ide-react/context/editor-manager-context'
|
|
|
import classNames from 'classnames'
|
|
import classNames from 'classnames'
|
|
|
|
|
+import useEventListener from '@/shared/hooks/use-event-listener'
|
|
|
|
|
|
|
|
const TRACK_CHANGES_ON_WIDGET_HEIGHT = 25
|
|
const TRACK_CHANGES_ON_WIDGET_HEIGHT = 25
|
|
|
const CM_LINE_RIGHT_PADDING = 2
|
|
const CM_LINE_RIGHT_PADDING = 2
|
|
@@ -45,6 +44,8 @@ const ReviewTooltipMenu: FC = () => {
|
|
|
const view = useCodeMirrorViewContext()
|
|
const view = useCodeMirrorViewContext()
|
|
|
const isViewer = useViewerPermissions()
|
|
const isViewer = useViewerPermissions()
|
|
|
const [show, setShow] = useState(true)
|
|
const [show, setShow] = useState(true)
|
|
|
|
|
+ const { setView } = useReviewPanelViewActionsContext()
|
|
|
|
|
+ const { setReviewPanelOpen } = useLayoutContext()
|
|
|
|
|
|
|
|
const tooltipState = state.field(reviewTooltipStateField, false)?.tooltip
|
|
const tooltipState = state.field(reviewTooltipStateField, false)?.tooltip
|
|
|
const previousTooltipState = usePreviousValue(tooltipState)
|
|
const previousTooltipState = usePreviousValue(tooltipState)
|
|
@@ -55,6 +56,24 @@ const ReviewTooltipMenu: FC = () => {
|
|
|
}
|
|
}
|
|
|
}, [tooltipState, previousTooltipState])
|
|
}, [tooltipState, previousTooltipState])
|
|
|
|
|
|
|
|
|
|
+ const addComment = useCallback(() => {
|
|
|
|
|
+ setReviewPanelOpen(true)
|
|
|
|
|
+ setView('cur_file')
|
|
|
|
|
+
|
|
|
|
|
+ const commentPos = state.selection.main.anchor
|
|
|
|
|
+ const effects = isCursorNearViewportEdge(view, commentPos)
|
|
|
|
|
+ ? [
|
|
|
|
|
+ buildAddNewCommentRangeEffect(state.selection.main),
|
|
|
|
|
+ EditorView.scrollIntoView(commentPos, { y: 'center' }),
|
|
|
|
|
+ ]
|
|
|
|
|
+ : [buildAddNewCommentRangeEffect(state.selection.main)]
|
|
|
|
|
+
|
|
|
|
|
+ view.dispatch({ effects })
|
|
|
|
|
+ setShow(false)
|
|
|
|
|
+ }, [setReviewPanelOpen, setView, setShow, view, state.selection.main])
|
|
|
|
|
+
|
|
|
|
|
+ useEventListener('add-new-review-comment', addComment)
|
|
|
|
|
+
|
|
|
if (isViewer || !show || !tooltipState) {
|
|
if (isViewer || !show || !tooltipState) {
|
|
|
return null
|
|
return null
|
|
|
}
|
|
}
|
|
@@ -66,19 +85,18 @@ const ReviewTooltipMenu: FC = () => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return ReactDOM.createPortal(
|
|
return ReactDOM.createPortal(
|
|
|
- <ReviewTooltipMenuContent setShow={setShow} />,
|
|
|
|
|
|
|
+ <ReviewTooltipMenuContent onAddComment={addComment} />,
|
|
|
tooltipView.dom
|
|
tooltipView.dom
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-const ReviewTooltipMenuContent: FC<{
|
|
|
|
|
- setShow: Dispatch<SetStateAction<boolean>>
|
|
|
|
|
-}> = ({ setShow }) => {
|
|
|
|
|
|
|
+const ReviewTooltipMenuContent: FC<{ onAddComment: () => void }> = ({
|
|
|
|
|
+ onAddComment,
|
|
|
|
|
+}) => {
|
|
|
const { t } = useTranslation()
|
|
const { t } = useTranslation()
|
|
|
const view = useCodeMirrorViewContext()
|
|
const view = useCodeMirrorViewContext()
|
|
|
const state = useCodeMirrorStateContext()
|
|
const state = useCodeMirrorStateContext()
|
|
|
- const { setReviewPanelOpen, reviewPanelOpen } = useLayoutContext()
|
|
|
|
|
- const { setView } = useReviewPanelViewActionsContext()
|
|
|
|
|
|
|
+ const { reviewPanelOpen } = useLayoutContext()
|
|
|
const ranges = useRangesContext()
|
|
const ranges = useRangesContext()
|
|
|
const { acceptChanges, rejectChanges } = useRangesActionsContext()
|
|
const { acceptChanges, rejectChanges } = useRangesActionsContext()
|
|
|
const { showGenericConfirmModal } = useModalsContext()
|
|
const { showGenericConfirmModal } = useModalsContext()
|
|
@@ -86,29 +104,6 @@ const ReviewTooltipMenuContent: FC<{
|
|
|
const [tooltipStyle, setTooltipStyle] = useState<CSSProperties | undefined>()
|
|
const [tooltipStyle, setTooltipStyle] = useState<CSSProperties | undefined>()
|
|
|
const [visible, setVisible] = useState(false)
|
|
const [visible, setVisible] = useState(false)
|
|
|
|
|
|
|
|
- const addComment = useCallback(() => {
|
|
|
|
|
- setReviewPanelOpen(true)
|
|
|
|
|
- setView('cur_file')
|
|
|
|
|
-
|
|
|
|
|
- const commentPos = state.selection.main.anchor
|
|
|
|
|
- const effects = isCursorNearViewportEdge(view, commentPos)
|
|
|
|
|
- ? [
|
|
|
|
|
- buildAddNewCommentRangeEffect(state.selection.main),
|
|
|
|
|
- EditorView.scrollIntoView(commentPos, { y: 'center' }),
|
|
|
|
|
- ]
|
|
|
|
|
- : [buildAddNewCommentRangeEffect(state.selection.main)]
|
|
|
|
|
-
|
|
|
|
|
- view.dispatch({ effects })
|
|
|
|
|
- setShow(false)
|
|
|
|
|
- }, [setReviewPanelOpen, setView, setShow, view, state.selection.main])
|
|
|
|
|
-
|
|
|
|
|
- useEffect(() => {
|
|
|
|
|
- window.addEventListener('add-new-review-comment', addComment)
|
|
|
|
|
- return () => {
|
|
|
|
|
- window.removeEventListener('add-new-review-comment', addComment)
|
|
|
|
|
- }
|
|
|
|
|
- }, [addComment])
|
|
|
|
|
-
|
|
|
|
|
const changeIdsInSelection = useMemo(() => {
|
|
const changeIdsInSelection = useMemo(() => {
|
|
|
return (ranges?.changes ?? [])
|
|
return (ranges?.changes ?? [])
|
|
|
.filter(({ op }) => {
|
|
.filter(({ op }) => {
|
|
@@ -219,7 +214,7 @@ const ReviewTooltipMenuContent: FC<{
|
|
|
>
|
|
>
|
|
|
<button
|
|
<button
|
|
|
className="review-tooltip-menu-button review-tooltip-add-comment-button"
|
|
className="review-tooltip-menu-button review-tooltip-add-comment-button"
|
|
|
- onClick={addComment}
|
|
|
|
|
|
|
+ onClick={onAddComment}
|
|
|
>
|
|
>
|
|
|
<MaterialIcon type="chat" />
|
|
<MaterialIcon type="chat" />
|
|
|
{t('add_comment')}
|
|
{t('add_comment')}
|