Skip to content

Commit 92086c0

Browse files
authored
Merge pull request #71417 from NJ-2020/fix/68722-1
fix edit comment input: mention suggestions is not displayed
2 parents ace916f + 76bee3d commit 92086c0

3 files changed

Lines changed: 40 additions & 25 deletions

File tree

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import {useCallback, useRef} from 'react';
2+
import useDebounce from './useDebounce';
3+
4+
export default function useIsScrollLikelyLayoutTriggered() {
5+
// A flag to indicate whether the onScroll callback is likely triggered by a layout change (caused by text change) or not
6+
const isScrollLayoutTriggered = useRef(false);
7+
8+
/**
9+
* Reset isScrollLikelyLayoutTriggered to false.
10+
*
11+
* The function is debounced with a handpicked wait time to address 2 issues:
12+
* 1. There is a slight delay between onChangeText and onScroll
13+
* 2. Layout change will trigger onScroll multiple times
14+
*/
15+
const debouncedLowerIsScrollLayoutTriggered = useDebounce(
16+
useCallback(() => (isScrollLayoutTriggered.current = false), []),
17+
500,
18+
);
19+
20+
const raiseIsScrollLayoutTriggered = useCallback(() => {
21+
isScrollLayoutTriggered.current = true;
22+
debouncedLowerIsScrollLayoutTriggered();
23+
}, [debouncedLowerIsScrollLayoutTriggered]);
24+
25+
return {isScrollLayoutTriggered, raiseIsScrollLayoutTriggered};
26+
}

src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ import OfflineIndicator from '@components/OfflineIndicator';
1919
import OfflineWithFeedback from '@components/OfflineWithFeedback';
2020
import {usePersonalDetails} from '@components/OnyxListItemProvider';
2121
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
22-
import useDebounce from '@hooks/useDebounce';
2322
import useHandleExceedMaxCommentLength from '@hooks/useHandleExceedMaxCommentLength';
2423
import useHandleExceedMaxTaskTitleLength from '@hooks/useHandleExceedMaxTaskTitleLength';
24+
import useIsScrollLikelyLayoutTriggered from '@hooks/useIsScrollLikelyLayoutTriggered';
2525
import useLocalize from '@hooks/useLocalize';
2626
import useNetwork from '@hooks/useNetwork';
2727
import useOnyx from '@hooks/useOnyx';
@@ -155,25 +155,7 @@ function ReportActionCompose({
155155
});
156156
const [isFullComposerAvailable, setIsFullComposerAvailable] = useState(isComposerFullSize);
157157

158-
// A flag to indicate whether the onScroll callback is likely triggered by a layout change (caused by text change) or not
159-
const isScrollLikelyLayoutTriggered = useRef(false);
160-
161-
/**
162-
* Reset isScrollLikelyLayoutTriggered to false.
163-
*
164-
* The function is debounced with a handpicked wait time to address 2 issues:
165-
* 1. There is a slight delay between onChangeText and onScroll
166-
* 2. Layout change will trigger onScroll multiple times
167-
*/
168-
const debouncedLowerIsScrollLikelyLayoutTriggered = useDebounce(
169-
useCallback(() => (isScrollLikelyLayoutTriggered.current = false), []),
170-
500,
171-
);
172-
173-
const raiseIsScrollLikelyLayoutTriggered = useCallback(() => {
174-
isScrollLikelyLayoutTriggered.current = true;
175-
debouncedLowerIsScrollLikelyLayoutTriggered();
176-
}, [debouncedLowerIsScrollLikelyLayoutTriggered]);
158+
const {isScrollLayoutTriggered, raiseIsScrollLayoutTriggered} = useIsScrollLikelyLayoutTriggered();
177159

178160
const [isCommentEmpty, setIsCommentEmpty] = useState(() => {
179161
const draftComment = getDraftComment(reportID);
@@ -534,7 +516,7 @@ function ReportActionCompose({
534516
setMenuVisibility={setMenuVisibility}
535517
isMenuVisible={isMenuVisible}
536518
onTriggerAttachmentPicker={onTriggerAttachmentPicker}
537-
raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
519+
raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLayoutTriggered}
538520
onAddActionPressed={onAddActionPressed}
539521
onItemSelected={onItemSelected}
540522
onCanceledAttachmentPicker={() => {
@@ -555,8 +537,8 @@ function ReportActionCompose({
555537
}}
556538
suggestionsRef={suggestionsRef}
557539
isNextModalWillOpenRef={isNextModalWillOpenRef}
558-
isScrollLikelyLayoutTriggered={isScrollLikelyLayoutTriggered}
559-
raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLikelyLayoutTriggered}
540+
isScrollLikelyLayoutTriggered={isScrollLayoutTriggered}
541+
raiseIsScrollLikelyLayoutTriggered={raiseIsScrollLayoutTriggered}
560542
reportID={reportID}
561543
policyID={report?.policyID}
562544
includeChronos={chatIncludesChronos(report)}

src/pages/home/report/ReportActionItemMessageEdit.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import * as Expensicons from '@components/Icon/Expensicons';
1616
import PressableWithFeedback from '@components/Pressable/PressableWithFeedback';
1717
import Tooltip from '@components/Tooltip';
1818
import useHandleExceedMaxCommentLength from '@hooks/useHandleExceedMaxCommentLength';
19+
import useIsScrollLikelyLayoutTriggered from '@hooks/useIsScrollLikelyLayoutTriggered';
1920
import useKeyboardState from '@hooks/useKeyboardState';
2021
import useLocalize from '@hooks/useLocalize';
2122
import useOnyx from '@hooks/useOnyx';
@@ -133,6 +134,8 @@ function ReportActionItemMessageEdit({
133134
const {hasExceededMaxCommentLength, validateCommentMaxLength} = useHandleExceedMaxCommentLength();
134135
const debouncedValidateCommentMaxLength = useMemo(() => lodashDebounce(validateCommentMaxLength, CONST.TIMING.COMMENT_LENGTH_DEBOUNCE_TIME), [validateCommentMaxLength]);
135136

137+
const {isScrollLayoutTriggered, raiseIsScrollLayoutTriggered} = useIsScrollLikelyLayoutTriggered();
138+
136139
const [modal = DEFAULT_MODAL_VALUE] = useOnyx(ONYXKEYS.MODAL, {canBeMissing: true});
137140
const [onyxInputFocused = false] = useOnyx(ONYXKEYS.INPUT_FOCUSED, {canBeMissing: true});
138141

@@ -236,6 +239,7 @@ function ReportActionItemMessageEdit({
236239
*/
237240
const updateDraft = useCallback(
238241
(newDraftInput: string) => {
242+
raiseIsScrollLayoutTriggered();
239243
const {text: newDraft, emojis, cursorPosition} = replaceAndExtractEmojis(newDraftInput, preferredSkinTone, preferredLocale);
240244

241245
emojisPresentBefore.current = emojis;
@@ -258,7 +262,7 @@ function ReportActionItemMessageEdit({
258262
debouncedSaveDraft(newDraft);
259263
isCommentPendingSaved.current = true;
260264
},
261-
[debouncedSaveDraft, preferredSkinTone, preferredLocale, selection.end],
265+
[raiseIsScrollLayoutTriggered, debouncedSaveDraft, preferredSkinTone, preferredLocale, selection.end],
262266
);
263267

264268
useEffect(() => {
@@ -337,11 +341,14 @@ function ReportActionItemMessageEdit({
337341
}, [suggestionsRef]);
338342
const onSaveScrollAndHideSuggestionMenu = useCallback(
339343
(e: NativeSyntheticEvent<TextInputScrollEventData>) => {
344+
if (isScrollLayoutTriggered.current) {
345+
return;
346+
}
340347
mobileInputScrollPosition.current = e?.nativeEvent?.contentOffset?.y ?? 0;
341348

342349
hideSuggestionMenu();
343350
},
344-
[hideSuggestionMenu],
351+
[isScrollLayoutTriggered, hideSuggestionMenu],
345352
);
346353

347354
/**

0 commit comments

Comments
 (0)