Skip to content

Commit 259c21f

Browse files
authored
Merge pull request #60952 from software-mansion-labs/feature/new-modal-on-money-request-report-transaction-list
[UX Reliability] Add new modal for MoneyRequestReportTransactionList
2 parents 1073e86 + 57fa559 commit 259c21f

File tree

4 files changed

+31
-36
lines changed

4 files changed

+31
-36
lines changed

src/components/Modal/BottomDockedModal/Backdrop/index.web.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,19 @@ function Backdrop({
5454

5555
if (!customBackdrop) {
5656
return (
57-
<PressableWithoutFeedback
58-
accessible
59-
accessibilityLabel={translate('modal.backdropLabel')}
60-
onPress={onBackdropPress}
57+
<Animated.View
58+
style={[styles.modalBackdrop, backdropStyle, style]}
59+
entering={Entering}
60+
exiting={Exiting}
6161
>
62-
<Animated.View
63-
style={[styles.modalBackdrop, backdropStyle, style]}
64-
entering={Entering}
65-
exiting={Exiting}
66-
/>
67-
</PressableWithoutFeedback>
62+
<PressableWithoutFeedback
63+
accessible
64+
accessibilityLabel={translate('modal.backdropLabel')}
65+
onPress={onBackdropPress}
66+
>
67+
<View style={[styles.modalBackdrop, backdropStyle, style]} />
68+
</PressableWithoutFeedback>
69+
</Animated.View>
6870
);
6971
}
7072

src/components/Modal/BottomDockedModal/Container/index.web.tsx

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ function Container({style, animationInTiming = 300, animationOutTiming = 300, on
1212
const isInitiated = useSharedValue(false);
1313

1414
useEffect(
15-
() => () => {
16-
setTimeout(onCloseCallBack, animationOutTiming);
17-
},
15+
() => () => onCloseCallBack(),
1816
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
1917
[],
2018
);
@@ -53,16 +51,12 @@ function Container({style, animationInTiming = 300, animationOutTiming = 300, on
5351

5452
return (
5553
<Animated.View
56-
style={[style, styles.modalContainer]}
54+
style={[style, styles.modalContainer, styles.modalAnimatedContainer, animatedStyles]}
55+
exiting={Exiting}
5756
// eslint-disable-next-line react/jsx-props-no-spreading
5857
{...props}
5958
>
60-
<Animated.View
61-
style={[styles.modalAnimatedContainer, animatedStyles]}
62-
exiting={Exiting}
63-
>
64-
{props.children}
65-
</Animated.View>
59+
{props.children}
6660
</Animated.View>
6761
);
6862
}

src/components/Modal/BottomDockedModal/index.tsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ function BottomDockedModal({
3737
...props
3838
}: ModalProps) {
3939
const [isVisibleState, setIsVisibleState] = useState(isVisible);
40-
const [isContainerOpen, setIsContainerOpen] = useState(false);
4140
const [isTransitioning, setIsTransitioning] = useState(false);
4241
const [deviceWidth, setDeviceWidth] = useState(() => Dimensions.get('window').width);
4342
const [deviceHeight, setDeviceHeight] = useState(() => Dimensions.get('window').height);
@@ -107,28 +106,27 @@ function BottomDockedModal({
107106
}
108107

109108
setIsVisibleState(false);
110-
setIsContainerOpen(false);
111109
},
112110
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
113111
[],
114112
);
115113

116114
useEffect(() => {
117-
if (isVisible && !isContainerOpen && !isTransitioning) {
115+
if (isVisible && !isVisibleState && !isTransitioning) {
118116
handleRef.current = InteractionManager.createInteractionHandle();
119117
onModalWillShow();
120118

121119
setIsVisibleState(true);
122120
setIsTransitioning(true);
123-
} else if (!isVisible && isContainerOpen && !isTransitioning) {
121+
} else if (!isVisible && isVisibleState && !isTransitioning) {
124122
handleRef.current = InteractionManager.createInteractionHandle();
125123
onModalWillHide();
126-
127-
setIsVisibleState(false);
128124
setIsTransitioning(true);
125+
} else if (!isVisible && isVisibleState && isTransitioning) {
126+
setIsVisibleState(false);
129127
}
130128
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
131-
}, [isVisible, isContainerOpen, isTransitioning]);
129+
}, [isVisible, isTransitioning, isVisibleState]);
132130

133131
const backdropStyle: ViewStyle = useMemo(() => {
134132
return {
@@ -140,7 +138,6 @@ function BottomDockedModal({
140138

141139
const onOpenCallBack = useCallback(() => {
142140
setIsTransitioning(false);
143-
setIsContainerOpen(true);
144141
if (handleRef.current) {
145142
InteractionManager.clearInteractionHandle(handleRef.current);
146143
}
@@ -149,7 +146,6 @@ function BottomDockedModal({
149146

150147
const onCloseCallBack = useCallback(() => {
151148
setIsTransitioning(false);
152-
setIsContainerOpen(false);
153149
if (handleRef.current) {
154150
InteractionManager.clearInteractionHandle(handleRef.current);
155151
}
@@ -190,12 +186,10 @@ function BottomDockedModal({
190186
pointerEvents="box-none"
191187
style={[styles.modalBackdrop, styles.modalContainerBox]}
192188
>
193-
{isVisibleState && (
194-
<>
195-
{hasBackdrop && backdropView}
196-
{containerView}
197-
</>
198-
)}
189+
<>
190+
{hasBackdrop && backdropView}
191+
{containerView}
192+
</>
199193
</View>
200194
);
201195
}
@@ -206,7 +200,7 @@ function BottomDockedModal({
206200
transparent
207201
animationType="none"
208202
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
209-
visible={isVisibleState || isTransitioning || isContainerOpen !== isVisibleState}
203+
visible={isVisibleState || isTransitioning}
210204
onRequestClose={onBackButtonPress}
211205
statusBarTranslucent={statusBarTranslucent}
212206
testID={testID}

src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ import useResponsiveLayout from '@hooks/useResponsiveLayout';
2121
import useStyleUtils from '@hooks/useStyleUtils';
2222
import useThemeStyles from '@hooks/useThemeStyles';
2323
import {turnOnMobileSelectionMode} from '@libs/actions/MobileSelectionMode';
24+
import ControlSelection from '@libs/ControlSelection';
2425
import {convertToDisplayString} from '@libs/CurrencyUtils';
26+
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
2527
import {getThreadReportIDsForTransactions} from '@libs/MoneyRequestReportUtils';
2628
import {navigationRef} from '@libs/Navigation/Navigation';
2729
import {getIOUActionForTransactionID} from '@libs/ReportActionsUtils';
@@ -236,6 +238,8 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
236238
id={transaction.transactionID}
237239
style={[pressableStyle]}
238240
onMouseLeave={handleMouseLeave}
241+
onPressIn={() => canUseTouchScreen() && ControlSelection.block()}
242+
onPressOut={() => ControlSelection.unblock()}
239243
onLongPress={() => {
240244
if (!shouldUseNarrowLayout) {
241245
return;
@@ -298,6 +302,7 @@ function MoneyRequestReportTransactionList({report, transactions, reportActions,
298302
type={CONST.MODAL.MODAL_TYPE.BOTTOM_DOCKED}
299303
onClose={() => setIsModalVisible(false)}
300304
shouldPreventScrollOnFocus
305+
shouldUseNewModal
301306
>
302307
<MenuItem
303308
title={translate('common.select')}

0 commit comments

Comments
 (0)