From 0b6a7de27089a74db689abe1d4b58f66e4783aa3 Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 10 Dec 2025 21:48:33 +0200 Subject: [PATCH] [Contacts] NUXes (#9515) * add a bunch of number parsing logic with libphonenumber * add banner nux * add announcement nux * native only nux * rm shitty animation * move isNative check --- .../find_friends_illustration_small.webp | Bin 0 -> 40962 bytes package.json | 2 +- src/components/Layout/Header/index.tsx | 4 +- .../contacts/FindContactsBannerNUX.tsx | 102 ++++++++++++++++ .../contacts/SyncContactsFlow.web.tsx | 3 + .../dialogs/nuxs/FindContactsAnnouncement.tsx | 114 ++++++++++++++++++ src/components/dialogs/nuxs/index.tsx | 42 ++++--- src/state/queries/nuxs/definitions.ts | 12 ++ src/view/com/profile/ProfileFollows.tsx | 2 + yarn.lock | 14 +-- 10 files changed, 269 insertions(+), 26 deletions(-) create mode 100644 assets/images/find_friends_illustration_small.webp create mode 100644 src/components/contacts/FindContactsBannerNUX.tsx create mode 100644 src/components/contacts/SyncContactsFlow.web.tsx create mode 100644 src/components/dialogs/nuxs/FindContactsAnnouncement.tsx diff --git a/assets/images/find_friends_illustration_small.webp b/assets/images/find_friends_illustration_small.webp new file mode 100644 index 0000000000000000000000000000000000000000..af7cd083f2344d874d8430981b341f5ef7ce6ddb GIT binary patch literal 40962 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 G0001xR{V7U literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 970c3fd170..ef97b9d71b 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@atproto/api": "^0.18.6", "@bitdrift/react-native": "^0.6.8", "@braintree/sanitize-url": "^6.0.2", - "@bsky.app/alf": "^0.1.5", + "@bsky.app/alf": "^0.1.6", "@bsky.app/react-native-mmkv": "2.12.5", "@discord/bottom-sheet": "bluesky-social/react-native-bottom-sheet", "@emoji-mart/react": "^1.1.1", diff --git a/src/components/Layout/Header/index.tsx b/src/components/Layout/Header/index.tsx index 762223fc35..6e4256c1e9 100644 --- a/src/components/Layout/Header/index.tsx +++ b/src/components/Layout/Header/index.tsx @@ -38,7 +38,7 @@ export function Outer({ }: { children: React.ReactNode noBottomBorder?: boolean - headerRef?: React.MutableRefObject + headerRef?: React.RefObject sticky?: boolean }) { const t = useTheme() @@ -183,7 +183,7 @@ export function TitleText({ + + + + + + + Import contacts to find your friends + + + + + + + + ) +} +function useInternalState() { + const {nux} = useNux(Nux.FindContactsDismissibleBanner) + const {mutate: save, variables} = useSaveNux() + const hidden = !!variables + + const visible = useMemo(() => { + if (isWeb) return false + if (hidden) return false + if (nux && nux.completed) return false + return true + }, [hidden, nux]) + + const close = () => { + save({ + id: Nux.FindContactsDismissibleBanner, + completed: true, + data: undefined, + }) + } + + return {visible, close} +} diff --git a/src/components/contacts/SyncContactsFlow.web.tsx b/src/components/contacts/SyncContactsFlow.web.tsx new file mode 100644 index 0000000000..d40435f6fa --- /dev/null +++ b/src/components/contacts/SyncContactsFlow.web.tsx @@ -0,0 +1,3 @@ +export function SyncContactsFlow() { + throw new Error('SyncContactsFlow is not available on web') +} diff --git a/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx b/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx new file mode 100644 index 0000000000..3666578898 --- /dev/null +++ b/src/components/dialogs/nuxs/FindContactsAnnouncement.tsx @@ -0,0 +1,114 @@ +import {useCallback} from 'react' +import {View} from 'react-native' +import {Image} from 'expo-image' +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, web} from '#/alf' +import {Button, ButtonText} from '#/components/Button' +import * as Dialog from '#/components/Dialog' +import {useNuxDialogContext} from '#/components/dialogs/nuxs' +import {Text} from '#/components/Typography' +import {navigate} from '#/Navigation' + +export function FindContactsAnnouncement() { + const t = useTheme() + const {_} = useLingui() + const nuxDialogs = useNuxDialogContext() + const control = Dialog.useDialogControl() + + Dialog.useAutoOpen(control) + + const onClose = useCallback(() => { + nuxDialogs.dismissActiveNux() + }, [nuxDialogs]) + + return ( + + + + + + + + {_( + + + + + + Find your friends + + + + Bluesky is more fun with friends! Import your contacts to see + who’s already here. + + + + + + + + + + + ) +} diff --git a/src/components/dialogs/nuxs/index.tsx b/src/components/dialogs/nuxs/index.tsx index 4076708fc0..63e11a7f4b 100644 --- a/src/components/dialogs/nuxs/index.tsx +++ b/src/components/dialogs/nuxs/index.tsx @@ -1,8 +1,16 @@ -import React from 'react' +import { + createContext, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react' import {type AppBskyActorDefs} from '@atproto/api' import {useGate} from '#/lib/statsig/statsig' import {logger} from '#/logger' +import {isNative} from '#/platform/detection' import {STALE} from '#/state/queries' import {Nux, useNuxs, useResetNuxs, useSaveNux} from '#/state/queries/nuxs' import { @@ -12,11 +20,11 @@ import { import {useProfileQuery} from '#/state/queries/profile' import {type SessionAccount, useSession} from '#/state/session' import {useOnboardingState} from '#/state/shell' -import {BookmarksAnnouncement} from '#/components/dialogs/nuxs/BookmarksAnnouncement' +import {isSnoozed, snooze, unsnooze} from '#/components/dialogs/nuxs/snoozing' /* * NUXs */ -import {isSnoozed, snooze, unsnooze} from '#/components/dialogs/nuxs/snoozing' +import {FindContactsAnnouncement} from './FindContactsAnnouncement' import {isExistingUserAsOf} from './utils' type Context = { @@ -34,24 +42,24 @@ const queuedNuxs: { }) => boolean }[] = [ { - id: Nux.BookmarksAnnouncement, + id: Nux.FindContactsAnnouncement, enabled: ({currentProfile}) => { - return isExistingUserAsOf( - '2025-09-08T00:00:00.000Z', - currentProfile.createdAt, + return ( + isNative && + isExistingUserAsOf('2025-12-16T00:00:00.000Z', currentProfile.createdAt) ) }, }, ] -const Context = React.createContext({ +const Context = createContext({ activeNux: undefined, dismissActiveNux: () => {}, }) Context.displayName = 'NuxDialogContext' export function useNuxDialogContext() { - return React.useContext(Context) + return useContext(Context) } export function NuxDialogs() { @@ -92,19 +100,19 @@ function Inner({ }) { const gate = useGate() const {nuxs} = useNuxs() - const [snoozed, setSnoozed] = React.useState(() => { + const [snoozed, setSnoozed] = useState(() => { return isSnoozed() }) - const [activeNux, setActiveNux] = React.useState() + const [activeNux, setActiveNux] = useState() const {mutateAsync: saveNux} = useSaveNux() const {mutate: resetNuxs} = useResetNuxs() - const snoozeNuxDialog = React.useCallback(() => { + const snoozeNuxDialog = useCallback(() => { snooze() setSnoozed(true) }, [setSnoozed]) - const dismissActiveNux = React.useCallback(() => { + const dismissActiveNux = useCallback(() => { if (!activeNux) return setActiveNux(undefined) }, [activeNux, setActiveNux]) @@ -118,7 +126,7 @@ function Inner({ } } - React.useEffect(() => { + useEffect(() => { if (snoozed) return // comment this out to test if (!nuxs) return @@ -170,7 +178,7 @@ function Inner({ preferences, ]) - const ctx = React.useMemo(() => { + const ctx = useMemo(() => { return { activeNux, dismissActiveNux, @@ -180,7 +188,9 @@ function Inner({ return ( {/*For example, activeNux === Nux.NeueTypography && */} - {activeNux === Nux.BookmarksAnnouncement && } + {activeNux === Nux.FindContactsAnnouncement && ( + + )} ) } diff --git a/src/state/queries/nuxs/definitions.ts b/src/state/queries/nuxs/definitions.ts index 1656494471..6c03c936a6 100644 --- a/src/state/queries/nuxs/definitions.ts +++ b/src/state/queries/nuxs/definitions.ts @@ -10,6 +10,8 @@ export enum Nux { AgeAssuranceDismissibleNotice = 'AgeAssuranceDismissibleNotice', AgeAssuranceDismissibleFeedBanner = 'AgeAssuranceDismissibleFeedBanner', BookmarksAnnouncement = 'BookmarksAnnouncement', + FindContactsAnnouncement = 'FindContactsAnnouncement', + FindContactsDismissibleBanner = 'FindContactsDismissibleBanner', /* * Blocking announcements. New IDs are required for each new announcement. @@ -52,6 +54,14 @@ export type AppNux = BaseNux< id: Nux.BookmarksAnnouncement data: undefined } + | { + id: Nux.FindContactsAnnouncement + data: undefined + } + | { + id: Nux.FindContactsDismissibleBanner + data: undefined + } > export const NuxSchemas: Record | undefined> = { @@ -63,4 +73,6 @@ export const NuxSchemas: Record | undefined> = { [Nux.AgeAssuranceDismissibleFeedBanner]: undefined, [Nux.PolicyUpdate202508]: undefined, [Nux.BookmarksAnnouncement]: undefined, + [Nux.FindContactsAnnouncement]: undefined, + [Nux.FindContactsDismissibleBanner]: undefined, } diff --git a/src/view/com/profile/ProfileFollows.tsx b/src/view/com/profile/ProfileFollows.tsx index 243f3705b5..44d4aeaee8 100644 --- a/src/view/com/profile/ProfileFollows.tsx +++ b/src/view/com/profile/ProfileFollows.tsx @@ -12,6 +12,7 @@ import {isWeb} from '#/platform/detection' import {useProfileFollowsQuery} from '#/state/queries/profile-follows' import {useResolveDidQuery} from '#/state/queries/resolve-uri' import {useSession} from '#/state/session' +import {FindContactsBannerNUX} from '#/components/contacts/FindContactsBannerNUX' import {PeopleRemove2_Stroke1_Corner0_Rounded as PeopleRemoveIcon} from '#/components/icons/PeopleRemove2' import {ListFooter, ListMaybePlaceholder} from '#/components/Lists' import {List} from '../util/List' @@ -208,6 +209,7 @@ export function ProfileFollows({name}: {name: string}) { onEndReached={onEndReached} onEndReachedThreshold={4} onItemSeen={onItemSeen} + ListHeaderComponent={} ListFooterComponent={