Page MenuHomePhabricator

D13136.diff
No OneTemporary

D13136.diff

diff --git a/native/components/nux-handler.react.js b/native/components/nux-handler.react.js
--- a/native/components/nux-handler.react.js
+++ b/native/components/nux-handler.react.js
@@ -6,12 +6,7 @@
import { isLoggedIn } from 'lib/selectors/user-selectors.js';
-import {
- firstNUXTipKey,
- NUXTipsContext,
- getNUXTipParams,
-} from './nux-tips-context.react.js';
-import type { NUXTipRouteNames } from '../navigation/route-names.js';
+import { NUXTipsContext } from './nux-tips-context.react.js';
import { useSelector } from '../redux/redux-utils.js';
import { useOnFirstLaunchEffect } from '../utils/hooks.js';
@@ -33,16 +28,8 @@
const navigation = useNavigation();
const effect = React.useCallback(() => {
- const { nextTip, tooltipLocation, nextRouteName } =
- getNUXTipParams(firstNUXTipKey);
- invariant(nextRouteName && nextTip, 'first nux tip should be defined');
-
- navigation.navigate<NUXTipRouteNames>({
- name: nextRouteName,
- params: {
- tipKey: nextTip,
- tooltipLocation,
- },
+ navigation.navigate<'NUXTipOverlayBackdrop'>({
+ name: 'NUXTipOverlayBackdrop',
});
}, [navigation]);
diff --git a/native/components/nux-tips-context.react.js b/native/components/nux-tips-context.react.js
--- a/native/components/nux-tips-context.react.js
+++ b/native/components/nux-tips-context.react.js
@@ -4,6 +4,7 @@
import { values } from 'lib/utils/objects.js';
+import type { AppNavigationProp } from '../navigation/app-navigator.react.js';
import {
CommunityDrawerTipRouteName,
MutedTabTipRouteName,
@@ -22,6 +23,9 @@
+nextTip: ?NUXTip,
+tooltipLocation: 'below' | 'above',
+nextRouteName: ?NUXTipRouteNames,
+ +exitingCallback?: <Route: NUXTipRouteNames>(
+ navigation: AppNavigationProp<Route>,
+ ) => void,
};
const firstNUXTipKey = 'firstTip';
@@ -42,6 +46,7 @@
nextTip: undefined,
nextRouteName: undefined,
tooltipLocation: 'below',
+ exitingCallback: navigation => navigation.goBack(),
},
};
diff --git a/native/navigation/app-navigator.react.js b/native/navigation/app-navigator.react.js
--- a/native/navigation/app-navigator.react.js
+++ b/native/navigation/app-navigator.react.js
@@ -8,6 +8,7 @@
import { CommunityDrawerNavigator } from './community-drawer-navigator.react.js';
import CommunityDrawerTip from './community-drawer-tip.react.js';
import MutedTabTip from './muted-tab-tip.react.js';
+import NUXTipOverlayBackdrop from './nux-tip-overlay-backdrop.react.js';
import { createOverlayNavigator } from './overlay-navigator.react.js';
import type {
OverlayNavigationProp,
@@ -17,6 +18,7 @@
import {
CommunityDrawerTipRouteName,
MutedTabTipRouteName,
+ NUXTipOverlayBackdropRouteName,
} from './route-names.js';
import {
UserAvatarCameraModalRouteName,
@@ -164,6 +166,10 @@
component={CommunityDrawerTip}
/>
<App.Screen name={MutedTabTipRouteName} component={MutedTabTip} />
+ <App.Screen
+ name={NUXTipOverlayBackdropRouteName}
+ component={NUXTipOverlayBackdrop}
+ />
<App.Screen name={TogglePinModalRouteName} component={TogglePinModal} />
</App.Navigator>
{pushHandler}
diff --git a/native/navigation/nux-tip-overlay-backdrop.react.js b/native/navigation/nux-tip-overlay-backdrop.react.js
new file mode 100644
--- /dev/null
+++ b/native/navigation/nux-tip-overlay-backdrop.react.js
@@ -0,0 +1,105 @@
+// @flow
+
+import invariant from 'invariant';
+import * as React from 'react';
+import { withTiming } from 'react-native-reanimated';
+
+import type { AppNavigationProp } from './app-navigator.react.js';
+import { OverlayContext } from './overlay-context.js';
+import type { NUXTipRouteNames, NavigationRoute } from './route-names';
+import {
+ firstNUXTipKey,
+ getNUXTipParams,
+} from '../components/nux-tips-context.react.js';
+import { useStyles } from '../themes/colors.js';
+import { animationDuration } from '../tooltip/nux-tips-overlay.react.js';
+import { AnimatedView } from '../types/styles.js';
+
+type Props = {
+ +navigation: AppNavigationProp<'NUXTipOverlayBackdrop'>,
+ +route: NavigationRoute<'NUXTipOverlayBackdrop'>,
+};
+
+function NUXTipOverlayBackdrop(props: Props): React.Node {
+ const overlayContext = React.useContext(OverlayContext);
+ invariant(overlayContext, 'NUXTipsOverlay should have OverlayContext');
+ const { shouldRenderScreenContent } = overlayContext;
+
+ return shouldRenderScreenContent ? (
+ <NUXTipOverlayBackdropInner {...props} />
+ ) : null;
+}
+
+function opacityEnteringAnimation() {
+ 'worklet';
+
+ return {
+ animations: {
+ opacity: withTiming(0.7, { duration: animationDuration }),
+ },
+ initialValues: {
+ opacity: 0,
+ },
+ };
+}
+
+function NUXTipOverlayBackdropInner(props: Props): React.Node {
+ const overlayContext = React.useContext(OverlayContext);
+ invariant(overlayContext, 'NUXTipsOverlay should have OverlayContext');
+ const { onExitFinish } = overlayContext;
+
+ const styles = useStyles(unboundStyles);
+
+ const opacityExitingAnimation = React.useCallback(() => {
+ 'worklet';
+
+ return {
+ animations: {
+ opacity: withTiming(0, { duration: animationDuration }),
+ },
+ initialValues: {
+ opacity: 0.7,
+ },
+ callback: onExitFinish,
+ };
+ }, [onExitFinish]);
+
+ const { nextTip, tooltipLocation, nextRouteName } =
+ getNUXTipParams(firstNUXTipKey);
+ invariant(nextRouteName && nextTip, 'first nux tip should be defined');
+
+ React.useEffect(
+ () =>
+ props.navigation.navigate<NUXTipRouteNames>({
+ name: nextRouteName,
+ params: {
+ tipKey: nextTip,
+ tooltipLocation,
+ },
+ }),
+ // We want this effect to run exactly once, when this component is mounted
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [],
+ );
+
+ return (
+ <AnimatedView
+ style={styles.backdrop}
+ entering={opacityEnteringAnimation}
+ exiting={opacityExitingAnimation}
+ />
+ );
+}
+
+const unboundStyles = {
+ backdrop: {
+ backgroundColor: 'black',
+ bottom: 0,
+ left: 0,
+ position: 'absolute',
+ right: 0,
+ top: 0,
+ },
+};
+
+export default NUXTipOverlayBackdrop;
diff --git a/native/navigation/overlay-navigator.react.js b/native/navigation/overlay-navigator.react.js
--- a/native/navigation/overlay-navigator.react.js
+++ b/native/navigation/overlay-navigator.react.js
@@ -41,12 +41,14 @@
TabNavigatorRouteName,
CommunityDrawerTipRouteName,
MutedTabTipRouteName,
+ NUXTipOverlayBackdropRouteName,
} from './route-names.js';
import { isMessageTooltipKey } from '../chat/utils.js';
const newReanimatedRoutes = new Set([
CommunityDrawerTipRouteName,
MutedTabTipRouteName,
+ NUXTipOverlayBackdropRouteName,
]);
export type OverlayNavigationHelpers<ParamList: ParamListBase = ParamListBase> =
diff --git a/native/navigation/route-names.js b/native/navigation/route-names.js
--- a/native/navigation/route-names.js
+++ b/native/navigation/route-names.js
@@ -170,6 +170,7 @@
'ThreadSettingsNotifications';
export const CommunityDrawerTipRouteName = 'CommunityDrawerTip';
export const MutedTabTipRouteName = 'MutedTabTip';
+export const NUXTipOverlayBackdropRouteName = 'NUXTipOverlayBackdrop';
export type RootParamList = {
+LoggedOutModal: void,
@@ -233,6 +234,7 @@
+TogglePinModal: TogglePinModalParams,
+CommunityDrawerTip: NUXTipsOverlayParams,
+MutedTabTip: NUXTipsOverlayParams,
+ +NUXTipOverlayBackdrop: void,
...TooltipModalParamList,
};
diff --git a/native/tooltip/nux-tips-overlay.react.js b/native/tooltip/nux-tips-overlay.react.js
--- a/native/tooltip/nux-tips-overlay.react.js
+++ b/native/tooltip/nux-tips-overlay.react.js
@@ -35,14 +35,6 @@
const animationDuration = 150;
const unboundStyles = {
- backdrop: {
- backgroundColor: 'black',
- bottom: 0,
- left: 0,
- position: 'absolute',
- right: 0,
- top: 0,
- },
container: {
flex: 1,
},
@@ -120,19 +112,6 @@
const marginVertical: number = 20;
const marginHorizontal: number = 10;
-function opacityEnteringAnimation() {
- 'worklet';
-
- return {
- animations: {
- opacity: withTiming(0.7, { duration: animationDuration }),
- },
- initialValues: {
- opacity: 0,
- },
- };
-}
-
function createNUXTipsOverlay<Route: NUXTipRouteNames>(
ButtonComponent: React.ComponentType<void | NUXTipsOverlayProps<Route>>,
tipText: string,
@@ -268,20 +247,6 @@
}
}, [dimensions.width, initialCoordinates]);
- const opacityExitingAnimation = React.useCallback(() => {
- 'worklet';
-
- return {
- animations: {
- opacity: withTiming(0, { duration: animationDuration }),
- },
- initialValues: {
- opacity: 0.7,
- },
- callback: onExitFinish,
- };
- }, [onExitFinish]);
-
// prettier-ignore
const tipContainerEnteringAnimation = React.useCallback(
(values/*: EntryAnimationsValues*/) => {
@@ -355,9 +320,10 @@
opacity: 1,
transform: [{ translateX: 0 }, { translateY: 0 }, { scale: 1 }],
},
+ callback: onExitFinish,
};
},
- [initialCoordinates.width, initialCoordinates.x, tooltipLocation],
+ [initialCoordinates.width, initialCoordinates.x, onExitFinish, tooltipLocation],
);
let triangleDown = null;
@@ -368,16 +334,21 @@
triangleUp = <View style={[styles.triangleUp, triangleStyle]} />;
}
- const callbackParams = getNUXTipParams(route.params.tipKey);
-
const onPressOk = React.useCallback(() => {
+ const callbackParams = getNUXTipParams(route.params.tipKey);
+
const {
nextTip,
tooltipLocation: nextLocation,
nextRouteName,
+ exitingCallback,
} = callbackParams;
goBackOnce();
+ if (exitingCallback) {
+ exitingCallback?.(navigation);
+ }
+
if (!nextTip || !nextRouteName) {
return;
}
@@ -388,16 +359,11 @@
tooltipLocation: nextLocation,
},
});
- }, [callbackParams, goBackOnce, navigation]);
+ }, [goBackOnce, navigation, route.params.tipKey]);
return (
<TouchableWithoutFeedback onPress={onPressOk}>
<View style={styles.container}>
- <AnimatedView
- style={styles.backdrop}
- entering={opacityEnteringAnimation}
- exiting={opacityExitingAnimation}
- />
<View style={contentContainerStyle}>
<Animated.View
style={buttonStyle}
@@ -443,4 +409,4 @@
return React.memo<NUXTipsOverlayProps<Route>>(NUXTipsOverlayWrapper);
}
-export { createNUXTipsOverlay };
+export { createNUXTipsOverlay, animationDuration };

File Metadata

Mime Type
text/plain
Expires
Sat, Dec 21, 1:03 AM (12 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2684321
Default Alt Text
D13136.diff (10 KB)

Event Timeline