Skip to content

Commit a385954

Browse files
authored
IncubatorDialog - not opening correctly (#2335)
1 parent bc6e266 commit a385954

File tree

2 files changed

+13
-20
lines changed

2 files changed

+13
-20
lines changed

src/incubator/Dialog/index.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {isEmpty} from 'lodash';
22
import React, {useRef, useMemo, useCallback, useState, useImperativeHandle, forwardRef, ForwardedRef} from 'react';
33
import {StyleSheet, View as RNView} from 'react-native';
44
import hoistStatics from 'hoist-non-react-statics';
5-
import {useAnimatedStyle, useDerivedValue, useSharedValue, withTiming} from 'react-native-reanimated';
5+
import {useAnimatedStyle, useDerivedValue} from 'react-native-reanimated';
66
import {PanGestureHandler} from 'react-native-gesture-handler';
77
import {Spacings, Colors, BorderRadiuses} from 'style';
88
import {asBaseComponent} from '../../commons/new';
@@ -47,7 +47,6 @@ const Dialog = (props: DialogProps, ref: ForwardedRef<DialogImperativeMethods>)
4747
const {overlayBackgroundColor, ...otherModalProps} = modalProps;
4848
const initialVisibility = useRef(propsVisibility);
4949
const [visible, setVisible] = useState(propsVisibility);
50-
const opacity = useSharedValue<number>(Number(propsVisibility));
5150

5251
const directions = useMemo((): DialogDirections[] => {
5352
return [direction];
@@ -68,7 +67,6 @@ const Dialog = (props: DialogProps, ref: ForwardedRef<DialogImperativeMethods>)
6867
const onTransitionAnimationEnd = useCallback((type: TransitionViewAnimationType) => {
6968
if (type === 'exit') {
7069
setVisible(false);
71-
opacity.value = withTiming(0, {duration: 0});
7270
onDismiss?.();
7371
}
7472
},
@@ -89,20 +87,13 @@ const Dialog = (props: DialogProps, ref: ForwardedRef<DialogImperativeMethods>)
8987
hiddenLocation
9088
});
9189

92-
const onInitPosition = useCallback(() => {
93-
if (opacity.value === 0) {
94-
opacity.value = withTiming(1, {duration: 0});
95-
}
96-
// eslint-disable-next-line react-hooks/exhaustive-deps
97-
}, []);
98-
9990
const {
10091
animateIn,
10192
animateOut,
102-
translation: transitionTranslation
93+
translation: transitionTranslation,
94+
isMounted
10395
} = useAnimatedTransition({
10496
hiddenLocation,
105-
onInitPosition,
10697
enterFrom: direction,
10798
exitTo: direction,
10899
onAnimationStart: fade,
@@ -149,7 +140,7 @@ const Dialog = (props: DialogProps, ref: ForwardedRef<DialogImperativeMethods>)
149140
return {
150141
transform: [{translateX: translation.value.x}, {translateY: translation.value.y}],
151142
// TODO: do we want to take the component's opacity here? - I think combining opacities is buggy
152-
opacity: opacity.value
143+
opacity: isMounted.value ? 1 : 0
153144
};
154145
// eslint-disable-next-line react-hooks/exhaustive-deps
155146
}, []);

src/incubator/Dialog/useAnimatedTransition.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +45,16 @@ export interface AnimatedTransitionProps extends AnimationNotifierEndProps {
4545
*/
4646
delay?: Delay;
4747
hiddenLocation: HiddenLocation;
48-
onInitPosition: () => void;
4948
}
5049

5150
export default function useAnimatedTransition(props: AnimatedTransitionProps) {
52-
const {hiddenLocation, onInitPosition, enterFrom, exitTo, onAnimationStart, onAnimationEnd, delay} = props;
51+
const {hiddenLocation, enterFrom, exitTo, onAnimationStart, onAnimationEnd, delay} = props;
5352

5453
// Has to start at {0, 0} with {opacity: 0} so layout can be measured
5554
const translationX = useSharedValue<number>(0);
5655
const translationY = useSharedValue<number>(0);
5756
const {onEnterAnimationEnd, onExitAnimationEnd} = useAnimationEndNotifier({onAnimationEnd});
57+
const isMounted = useSharedValue(false);
5858

5959
const getLocation = (direction?: TransitionViewDirection) => {
6060
return {
@@ -71,7 +71,7 @@ export default function useAnimatedTransition(props: AnimatedTransitionProps) {
7171
};
7272
};
7373

74-
const initPosition = useCallback(() => {
74+
const onHiddenLocationUpdated = useCallback(() => {
7575
'worklet';
7676
const to = getLocation(enterFrom);
7777
// @ts-expect-error
@@ -82,12 +82,14 @@ export default function useAnimatedTransition(props: AnimatedTransitionProps) {
8282
translationY.value = withTiming(to.y, {duration: 0}, animateIn);
8383
}
8484

85-
onInitPosition();
86-
}, [onInitPosition]);
85+
if (!isMounted.value) {
86+
isMounted.value = true;
87+
}
88+
}, []);
8789

8890
useEffect(() => {
8991
if (hiddenLocation.wasMeasured && enterFrom) {
90-
initPosition();
92+
onHiddenLocationUpdated();
9193
}
9294
}, [hiddenLocation]);
9395

@@ -130,5 +132,5 @@ export default function useAnimatedTransition(props: AnimatedTransitionProps) {
130132
}
131133
}, [hiddenLocation, exitTo, onExitAnimationEnd, delay?.exit]);
132134

133-
return {animateIn, animateOut, translation: {x: translationX, y: translationY}};
135+
return {animateIn, animateOut, translation: {x: translationX, y: translationY}, isMounted};
134136
}

0 commit comments

Comments
 (0)