diff --git a/assets/images/drafts_announcement_nux.webp b/assets/images/drafts_announcement_nux.webp new file mode 100644 index 0000000000..301589690c Binary files /dev/null and b/assets/images/drafts_announcement_nux.webp differ diff --git a/src/components/dialogs/nuxs/DraftsAnnouncement.tsx b/src/components/dialogs/nuxs/DraftsAnnouncement.tsx new file mode 100644 index 0000000000..4aa358f032 --- /dev/null +++ b/src/components/dialogs/nuxs/DraftsAnnouncement.tsx @@ -0,0 +1,154 @@ +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 {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 {Sparkle_Stroke2_Corner0_Rounded as SparkleIcon} from '#/components/icons/Sparkle' +import {Text} from '#/components/Typography' +import {IS_E2E, IS_NATIVE, IS_WEB} from '#/env' +import {createIsEnabledCheck, isExistingUserAsOf} from './utils' + +export const enabled = createIsEnabledCheck(props => { + return ( + !IS_E2E && + IS_NATIVE && + isExistingUserAsOf( + '2026-02-05T00:00:00.000Z', + props.currentProfile.createdAt, + ) + ) +}) + +export function DraftsAnnouncement() { + const t = useTheme() + const {_} = useLingui() + const nuxDialogs = useNuxDialogContext() + const control = Dialog.useDialogControl() + + Dialog.useAutoOpen(control) + + const onClose = useCallback(() => { + nuxDialogs.dismissActiveNux() + }, [nuxDialogs]) + + return ( + + + + + + + + + + New Feature + + + {_( + + + + + Drafts + + + + Not ready to hit post? Keep your best ideas in Drafts until the + timing is just right. + + + + + {!IS_WEB && ( + + )} + + + + + + ) +} diff --git a/src/components/dialogs/nuxs/index.tsx b/src/components/dialogs/nuxs/index.tsx index ba555befd1..2d2e2c6a6a 100644 --- a/src/components/dialogs/nuxs/index.tsx +++ b/src/components/dialogs/nuxs/index.tsx @@ -19,9 +19,9 @@ import {useProfileQuery} from '#/state/queries/profile' import {type SessionAccount, useSession} from '#/state/session' import {useOnboardingState} from '#/state/shell' import { - enabled as isLiveNowBetaDialogEnabled, - LiveNowBetaDialog, -} from '#/components/dialogs/nuxs/LiveNowBetaDialog' + DraftsAnnouncement, + enabled as isDraftsAnnouncementEnabled, +} from '#/components/dialogs/nuxs/DraftsAnnouncement' import {isSnoozed, snooze, unsnooze} from '#/components/dialogs/nuxs/snoozing' import {type EnabledCheckProps} from '#/components/dialogs/nuxs/utils' import {useAnalytics} from '#/analytics' @@ -37,8 +37,8 @@ const queuedNuxs: { enabled?: (props: EnabledCheckProps) => boolean }[] = [ { - id: Nux.LiveNowBetaDialog, - enabled: isLiveNowBetaDialogEnabled, + id: Nux.DraftsAnnouncement, + enabled: isDraftsAnnouncementEnabled, }, ] @@ -186,7 +186,7 @@ function Inner({ return ( {/*For example, activeNux === Nux.NeueTypography && */} - {activeNux === Nux.LiveNowBetaDialog && } + {activeNux === Nux.DraftsAnnouncement && } ) } diff --git a/src/state/queries/nuxs/definitions.ts b/src/state/queries/nuxs/definitions.ts index e23050c465..25f975db26 100644 --- a/src/state/queries/nuxs/definitions.ts +++ b/src/state/queries/nuxs/definitions.ts @@ -14,6 +14,7 @@ export enum Nux { FindContactsDismissibleBanner = 'FindContactsDismissibleBanner', LiveNowBetaDialog = 'LiveNowBetaDialog', LiveNowBetaNudge = 'LiveNowBetaNudge', + DraftsAnnouncement = 'DraftsAnnouncement', /* * Blocking announcements. New IDs are required for each new announcement. @@ -72,6 +73,10 @@ export type AppNux = BaseNux< id: Nux.LiveNowBetaNudge data: undefined } + | { + id: Nux.DraftsAnnouncement + data: undefined + } > export const NuxSchemas: Record | undefined> = { @@ -87,4 +92,5 @@ export const NuxSchemas: Record | undefined> = { [Nux.FindContactsDismissibleBanner]: undefined, [Nux.LiveNowBetaDialog]: undefined, [Nux.LiveNowBetaNudge]: undefined, + [Nux.DraftsAnnouncement]: undefined, }