From ae7d1a8bc47041d8d6188dfe22d86be035a108e9 Mon Sep 17 00:00:00 2001 From: Paul Frazee Date: Tue, 11 Jun 2024 22:59:08 -0700 Subject: [PATCH] Add initial Nudge component --- src/components/Nudge.tsx | 117 +++++++++++++++++++++++++ src/view/com/home/HomeNewUserNudge.tsx | 58 ++++++++++++ src/view/screens/Home.tsx | 73 +++++++-------- 3 files changed, 213 insertions(+), 35 deletions(-) create mode 100644 src/components/Nudge.tsx create mode 100644 src/view/com/home/HomeNewUserNudge.tsx diff --git a/src/components/Nudge.tsx b/src/components/Nudge.tsx new file mode 100644 index 0000000000..a0ed04fda4 --- /dev/null +++ b/src/components/Nudge.tsx @@ -0,0 +1,117 @@ +import React from 'react' +import {Keyboard, StyleProp, View, ViewStyle} from 'react-native' +import {LinearGradient} from 'expo-linear-gradient' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import {isWeb} from '#/platform/detection' +import {atoms as a, useTheme} from '#/alf' +import {FullWindowOverlay} from '#/components/FullWindowOverlay' +import {Portal} from '#/components/Portal' +import {Button} from './Button' +import {Text} from './Typography' + +type Anchor = 'top_left' | 'top_center' | 'top_right' + +interface NudgeProps { + testID?: string + isOpen: boolean + anchor: Anchor + onClose: () => void + style?: StyleProp +} + +export function Nudge({ + children, + testID, + isOpen, + anchor, + onClose, + style, +}: React.PropsWithChildren) { + const t = useTheme() + const {_} = useLingui() + const anchorPositioningStyle = useAnchorPositioningStyle(anchor) + return ( + isOpen && ( + + + {/* Backdrop overlay */} + + Keyboard.dismiss()}> + {/* Angle pointer up */} + + + + {children} + + + + + ) + ) +} + +function useAnchorPositioningStyle(anchor: Anchor): ViewStyle { + if (anchor === 'top_center') { + return {left: isWeb ? '48%' : '52%', top: -8} + } + if (anchor === 'top_right') { + return {right: 20, top: -8} + } + return {left: 20, top: -8} +} diff --git a/src/view/com/home/HomeNewUserNudge.tsx b/src/view/com/home/HomeNewUserNudge.tsx new file mode 100644 index 0000000000..8ee2284f0e --- /dev/null +++ b/src/view/com/home/HomeNewUserNudge.tsx @@ -0,0 +1,58 @@ +import React from 'react' +import {View} from 'react-native' + +import {isWeb} from '#/platform/detection' +import {Nudge} from '#/components/Nudge' +import {Text} from '#/components/Typography' + +export function HomeNewUserNudge() { + const [isOpen, setIsOpen] = React.useState(true) + return ( + setIsOpen(false)} + style={ + isWeb + ? { + left: '50%', + top: 105, + maxWidth: 380, + transform: [{translateX: '-50%'}], + } + : { + top: 155, + left: 10, + right: 10, + } + }> + + + Welcome to Bluesky! + + + You're on the Discover algorithm. Swipe right to change your current + feed. + + + + ) +} diff --git a/src/view/screens/Home.tsx b/src/view/screens/Home.tsx index e49f2fbb21..aaada49a38 100644 --- a/src/view/screens/Home.tsx +++ b/src/view/screens/Home.tsx @@ -29,6 +29,7 @@ import {FollowingEmptyState} from 'view/com/posts/FollowingEmptyState' import {FollowingEndOfFeed} from 'view/com/posts/FollowingEndOfFeed' import {NoFeedsPinned} from '#/screens/Home/NoFeedsPinned' import {HomeHeader} from '../com/home/HomeHeader' +import {HomeNewUserNudge} from '../com/home/HomeNewUserNudge' type Props = NativeStackScreenProps export function HomeScreen(props: Props) { @@ -173,7 +174,6 @@ function HomeScreenReady({ }, [setMinimalShellMode], ) - const renderTabBar = React.useCallback( (props: RenderTabBarFnProps) => { return ( @@ -209,47 +209,50 @@ function HomeScreenReady({ }, [preferences]) return hasSession ? ( - - {pinnedFeedInfos.length ? ( - pinnedFeedInfos.map(feedInfo => { - const feed = feedInfo.feedDescriptor - if (feed === 'following') { + <> + + + {pinnedFeedInfos.length ? ( + pinnedFeedInfos.map(feedInfo => { + const feed = feedInfo.feedDescriptor + if (feed === 'following') { + return ( + + ) + } + const savedFeedConfig = feedInfo.savedFeed return ( ) - } - const savedFeedConfig = feedInfo.savedFeed - return ( - - ) - }) - ) : ( - - )} - + }) + ) : ( + + )} + + ) : (