Преглед изворни кода

Fixed "Add comment" tooltip if cursor is out of viewport (#21852)

* Fixed "Add comment" tooltip if cursor is out of viewport

* account for cm-line padding when calulation tooltip pos

GitOrigin-RevId: f4b69a3bf83dd15c0304bfd6b37f3be8b07cd727
Domagoj Kriskovic пре 1 година
родитељ
комит
99f77b2205

+ 47 - 2
services/web/frontend/js/features/review-panel-new/components/review-tooltip-menu.tsx

@@ -1,4 +1,5 @@
 import {
 import {
+  CSSProperties,
   Dispatch,
   Dispatch,
   FC,
   FC,
   SetStateAction,
   SetStateAction,
@@ -32,6 +33,10 @@ import { isCursorNearViewportEdge } from '@/features/source-editor/utils/is-curs
 import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
 import OLTooltip from '@/features/ui/components/ol/ol-tooltip'
 import { useModalsContext } from '@/features/ide-react/context/modals-context'
 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'
+
+const TRACK_CHANGES_ON_WIDGET_HEIGHT = 25
+const CM_LINE_RIGHT_PADDING = 2
 
 
 const ReviewTooltipMenu: FC = () => {
 const ReviewTooltipMenu: FC = () => {
   const state = useCodeMirrorStateContext()
   const state = useCodeMirrorStateContext()
@@ -70,11 +75,13 @@ const ReviewTooltipMenuContent: FC<{
   const { t } = useTranslation()
   const { t } = useTranslation()
   const view = useCodeMirrorViewContext()
   const view = useCodeMirrorViewContext()
   const state = useCodeMirrorStateContext()
   const state = useCodeMirrorStateContext()
-  const { setReviewPanelOpen } = useLayoutContext()
+  const { setReviewPanelOpen, reviewPanelOpen } = useLayoutContext()
   const { setView } = useReviewPanelViewActionsContext()
   const { setView } = useReviewPanelViewActionsContext()
   const ranges = useRangesContext()
   const ranges = useRangesContext()
   const { acceptChanges, rejectChanges } = useRangesActionsContext()
   const { acceptChanges, rejectChanges } = useRangesActionsContext()
   const { showGenericConfirmModal } = useModalsContext()
   const { showGenericConfirmModal } = useModalsContext()
+  const { wantTrackChanges } = useEditorManagerContext()
+  const [tooltipStyle, setTooltipStyle] = useState<CSSProperties | undefined>()
 
 
   const addComment = useCallback(() => {
   const addComment = useCallback(() => {
     setReviewPanelOpen(true)
     setReviewPanelOpen(true)
@@ -151,8 +158,46 @@ const ReviewTooltipMenuContent: FC<{
 
 
   const showChangesButtons = changeIdsInSelection.length > 0
   const showChangesButtons = changeIdsInSelection.length > 0
 
 
+  useEffect(() => {
+    view.requestMeasure({
+      key: 'review-tooltip-outside-viewport',
+      read(view) {
+        const cursorCoords = view.coordsAtPos(view.state.selection.main.head)
+
+        if (!cursorCoords) {
+          return
+        }
+
+        const scrollDomRect = view.scrollDOM.getBoundingClientRect()
+        const contentDomRect = view.contentDOM.getBoundingClientRect()
+        const editorRightPos = contentDomRect.right - CM_LINE_RIGHT_PADDING
+
+        if (
+          cursorCoords.top > scrollDomRect.top &&
+          cursorCoords.top < scrollDomRect.bottom
+        ) {
+          return
+        }
+
+        const widgetOffset =
+          wantTrackChanges && !reviewPanelOpen
+            ? TRACK_CHANGES_ON_WIDGET_HEIGHT
+            : 0
+
+        return {
+          position: 'fixed' as const,
+          top: scrollDomRect.top + widgetOffset,
+          right: window.innerWidth - editorRightPos,
+        }
+      },
+      write(res) {
+        setTooltipStyle(res)
+      },
+    })
+  }, [view, reviewPanelOpen, wantTrackChanges])
+
   return (
   return (
-    <div className="review-tooltip-menu">
+    <div className="review-tooltip-menu" style={tooltipStyle}>
       <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={addComment}