Reorg, rename everything

This commit is contained in:
Eric Bailey
2025-08-05 14:03:29 -05:00
parent dc156c1b63
commit 3232f7ae48
17 changed files with 57 additions and 55 deletions
+3 -3
View File
@@ -70,9 +70,9 @@ import {Provider as ContextMenuProvider} from '#/components/ContextMenu'
import {NuxDialogs} from '#/components/dialogs/nuxs' import {NuxDialogs} from '#/components/dialogs/nuxs'
import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry'
import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs'
import {Provider as PolicyUpdateOverlayProvider} from '#/components/PolicyUpdateOverlay'
import {Provider as PortalProvider} from '#/components/Portal' import {Provider as PortalProvider} from '#/components/Portal'
import {Provider as VideoVolumeProvider} from '#/components/Post/Embed/VideoEmbed/VideoVolumeContext' import {Provider as VideoVolumeProvider} from '#/components/Post/Embed/VideoEmbed/VideoVolumeContext'
import {Provider as BlockingAnnouncementsPortalProvider} from '#/components/dialogs/BlockingAnnouncements'
import {Splash} from '#/Splash' import {Splash} from '#/Splash'
import {BottomSheetProvider} from '../modules/bottom-sheet' import {BottomSheetProvider} from '../modules/bottom-sheet'
import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider' import {BackgroundNotificationPreferencesProvider} from '../modules/expo-background-notification-handler/src/BackgroundNotificationHandlerProvider'
@@ -221,7 +221,7 @@ function App() {
<ModalStateProvider> <ModalStateProvider>
<DialogStateProvider> <DialogStateProvider>
<LightboxStateProvider> <LightboxStateProvider>
<BlockingAnnouncementsPortalProvider> <PolicyUpdateOverlayProvider>
<PortalProvider> <PortalProvider>
<BottomSheetProvider> <BottomSheetProvider>
<StarterPackProvider> <StarterPackProvider>
@@ -232,7 +232,7 @@ function App() {
</StarterPackProvider> </StarterPackProvider>
</BottomSheetProvider> </BottomSheetProvider>
</PortalProvider> </PortalProvider>
</BlockingAnnouncementsPortalProvider> </PolicyUpdateOverlayProvider>
</LightboxStateProvider> </LightboxStateProvider>
</DialogStateProvider> </DialogStateProvider>
</ModalStateProvider> </ModalStateProvider>
+3 -3
View File
@@ -54,10 +54,10 @@ import {Shell} from '#/view/shell/index'
import {ThemeProvider as Alf} from '#/alf' import {ThemeProvider as Alf} from '#/alf'
import {useColorModeTheme} from '#/alf/util/useColorModeTheme' import {useColorModeTheme} from '#/alf/util/useColorModeTheme'
import {Provider as ContextMenuProvider} from '#/components/ContextMenu' import {Provider as ContextMenuProvider} from '#/components/ContextMenu'
import {Provider as BlockingAnnouncementsPortalProvider} from '#/components/dialogs/BlockingAnnouncements'
import {NuxDialogs} from '#/components/dialogs/nuxs' import {NuxDialogs} from '#/components/dialogs/nuxs'
import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry' import {useStarterPackEntry} from '#/components/hooks/useStarterPackEntry'
import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs' import {Provider as IntentDialogProvider} from '#/components/intents/IntentDialogs'
import {Provider as PolicyUpdateOverlayProvider} from '#/components/PolicyUpdateOverlay'
import {Provider as PortalProvider} from '#/components/Portal' import {Provider as PortalProvider} from '#/components/Portal'
import {Provider as ActiveVideoProvider} from '#/components/Post/Embed/VideoEmbed/ActiveVideoWebContext' import {Provider as ActiveVideoProvider} from '#/components/Post/Embed/VideoEmbed/ActiveVideoWebContext'
import {Provider as VideoVolumeProvider} from '#/components/Post/Embed/VideoEmbed/VideoVolumeContext' import {Provider as VideoVolumeProvider} from '#/components/Post/Embed/VideoEmbed/VideoVolumeContext'
@@ -197,13 +197,13 @@ function App() {
<ModalStateProvider> <ModalStateProvider>
<DialogStateProvider> <DialogStateProvider>
<LightboxStateProvider> <LightboxStateProvider>
<BlockingAnnouncementsPortalProvider> <PolicyUpdateOverlayProvider>
<PortalProvider> <PortalProvider>
<StarterPackProvider> <StarterPackProvider>
<InnerApp /> <InnerApp />
</StarterPackProvider> </StarterPackProvider>
</PortalProvider> </PortalProvider>
</BlockingAnnouncementsPortalProvider> </PolicyUpdateOverlayProvider>
</LightboxStateProvider> </LightboxStateProvider>
</DialogStateProvider> </DialogStateProvider>
</ModalStateProvider> </ModalStateProvider>
@@ -5,7 +5,7 @@ import {Logo} from '#/view/icons/Logo'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
export function AnnouncementBadge() { export function Badge() {
const t = useTheme() const t = useTheme()
return ( return (
<View style={[a.align_start]}> <View style={[a.align_start]}>
@@ -15,7 +15,7 @@ import {LockScroll} from '#/components/LockScroll'
const GUTTER = 24 const GUTTER = 24
export function AnnouncementDialog({ export function Overlay({
children, children,
label, label,
}: { }: {
@@ -3,9 +3,9 @@ import {describe, test} from '@jest/globals'
import { import {
computeCompletedState, computeCompletedState,
syncCompletedState, syncCompletedState,
} from '#/components/dialogs/BlockingAnnouncements/useAnnouncementState' } from '#/components/PolicyUpdateOverlay/usePolicyUpdateState'
jest.mock('../../../../state/queries/nuxs') jest.mock('../../../state/queries/nuxs')
describe('computeCompletedState', () => { describe('computeCompletedState', () => {
test(`initial state`, () => { test(`initial state`, () => {
@@ -0,0 +1,7 @@
import {ID} from '#/components/PolicyUpdateOverlay/updates/202508/config'
/**
* The singulary active update ID. This is configured here to ensure that
* the relationship is clear.
*/
export const ACTIVE_UPDATE_ID = ID
@@ -2,9 +2,9 @@ import {View} from 'react-native'
import {isIOS} from '#/platform/detection' import {isIOS} from '#/platform/detection'
import {atoms as a} from '#/alf' import {atoms as a} from '#/alf'
import {Announcement} from '#/components/dialogs/BlockingAnnouncements/announcements/PolicyUpdate202508'
import {useAnnouncementState} from '#/components/dialogs/BlockingAnnouncements/useAnnouncementState'
import {FullWindowOverlay} from '#/components/FullWindowOverlay' import {FullWindowOverlay} from '#/components/FullWindowOverlay'
import {Content} from '#/components/PolicyUpdateOverlay/updates/202508'
import {usePolicyUpdateState} from '#/components/PolicyUpdateOverlay/usePolicyUpdateState'
import {createPortalGroup} from '#/components/Portal' import {createPortalGroup} from '#/components/Portal'
const portalGroup = createPortalGroup() const portalGroup = createPortalGroup()
@@ -13,8 +13,8 @@ export const Provider = portalGroup.Provider
export const Portal = portalGroup.Portal export const Portal = portalGroup.Portal
export const Outlet = portalGroup.Outlet export const Outlet = portalGroup.Outlet
export function BlockingAnnouncements() { export function PolicyUpdateOverlay() {
const state = useAnnouncementState() const state = usePolicyUpdateState()
/* /*
* See `window.clearNux` example in `/state/queries/nuxs` for a way to clear * See `window.clearNux` example in `/state/queries/nuxs` for a way to clear
@@ -35,7 +35,7 @@ export function BlockingAnnouncements() {
// so don't set it on iOS. FullWindowOverlay already does the job. // so don't set it on iOS. FullWindowOverlay already does the job.
!isIOS && {zIndex: 9999}, !isIOS && {zIndex: 9999},
]}> ]}>
<Announcement state={state} /> <Content state={state} />
</View> </View>
</FullWindowOverlay> </FullWindowOverlay>
</Portal> </Portal>
@@ -4,4 +4,4 @@
import {Nux} from '#/state/queries/nuxs' import {Nux} from '#/state/queries/nuxs'
export const ID = Nux.BlockingAnnouncementPolicyUpdate202508 export const ID = Nux.PolicyUpdate202508
@@ -7,13 +7,13 @@ import {isAndroid} from '#/platform/detection'
import {useA11y} from '#/state/a11y' import {useA11y} from '#/state/a11y'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import {Button, ButtonText} from '#/components/Button' import {Button, ButtonText} from '#/components/Button'
import {AnnouncementBadge} from '#/components/dialogs/BlockingAnnouncements/AnnouncementBadge'
import {AnnouncementDialog} from '#/components/dialogs/BlockingAnnouncements/AnnouncementDialog'
import {type AnnouncementState} from '#/components/dialogs/BlockingAnnouncements/useAnnouncementState'
import {InlineLinkText, Link} from '#/components/Link' import {InlineLinkText, Link} from '#/components/Link'
import {Badge} from '#/components/PolicyUpdateOverlay/Badge'
import {Overlay} from '#/components/PolicyUpdateOverlay/Overlay'
import {type PolicyUpdateState} from '#/components/PolicyUpdateOverlay/usePolicyUpdateState'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
export function Announcement({state}: {state: AnnouncementState}) { export function Content({state}: {state: PolicyUpdateState}) {
const t = useTheme() const t = useTheme()
const {_} = useLingui() const {_} = useLingui()
const {screenReaderEnabled} = useA11y() const {screenReaderEnabled} = useA11y()
@@ -63,9 +63,9 @@ export function Announcement({state}: {state: AnnouncementState}) {
: _(msg`We're updating our policies`) : _(msg`We're updating our policies`)
return ( return (
<AnnouncementDialog label={label}> <Overlay label={label}>
<View style={[a.align_start, a.gap_xl]}> <View style={[a.align_start, a.gap_xl]}>
<AnnouncementBadge /> <Badge />
{screenReaderEnabled ? ( {screenReaderEnabled ? (
<View style={[a.gap_sm]}> <View style={[a.gap_sm]}>
@@ -184,6 +184,6 @@ export function Announcement({state}: {state: AnnouncementState}) {
</Text> </Text>
</View> </View>
</View> </View>
</AnnouncementDialog> </Overlay>
) )
} }
@@ -1,21 +1,21 @@
import {useMemo} from 'react' import {useMemo} from 'react'
import {useNux, useSaveNux} from '#/state/queries/nuxs' import {useNux, useSaveNux} from '#/state/queries/nuxs'
import {ACTIVE_ANNOUNCEMENT} from '#/components/dialogs/BlockingAnnouncements/config' import {ACTIVE_UPDATE_ID} from '#/components/PolicyUpdateOverlay/config'
import {IS_DEV} from '#/env' import {IS_DEV} from '#/env'
import {device, useStorage} from '#/storage' import {device, useStorage} from '#/storage'
export type AnnouncementState = { export type PolicyUpdateState = {
completed: boolean completed: boolean
complete: () => void complete: () => void
} }
export function useAnnouncementState() { export function usePolicyUpdateState() {
const nux = useNux(ACTIVE_ANNOUNCEMENT) const nux = useNux(ACTIVE_UPDATE_ID)
const {mutate: save, variables} = useSaveNux() const {mutate: save, variables} = useSaveNux()
const deviceStorage = useStorage(device, [ACTIVE_ANNOUNCEMENT]) const deviceStorage = useStorage(device, [ACTIVE_UPDATE_ID])
const devOnlyOverride = const debugOverride =
useStorage(device, ['blockingAnnouncementOverride']) && IS_DEV useStorage(device, ['policyUpdateDebugOverride']) && IS_DEV
return useMemo(() => { return useMemo(() => {
const nuxIsReady = nux.status === 'ready' const nuxIsReady = nux.status === 'ready'
const nuxIsCompleted = nux.nux?.completed === true const nuxIsCompleted = nux.nux?.completed === true
@@ -29,7 +29,7 @@ export function useAnnouncementState() {
completedForDevice, completedForDevice,
}) })
if (!devOnlyOverride) { if (!debugOverride) {
syncCompletedState({ syncCompletedState({
nuxIsReady, nuxIsReady,
nuxIsCompleted, nuxIsCompleted,
@@ -44,13 +44,13 @@ export function useAnnouncementState() {
completed, completed,
complete() { complete() {
save({ save({
id: ACTIVE_ANNOUNCEMENT, id: ACTIVE_UPDATE_ID,
completed: true, completed: true,
data: undefined, data: undefined,
}) })
}, },
} }
}, [nux, save, variables, deviceStorage, devOnlyOverride]) }, [nux, save, variables, deviceStorage, debugOverride])
} }
export function computeCompletedState({ export function computeCompletedState({
@@ -111,7 +111,7 @@ export function syncCompletedState({
!!completedForDevice !!completedForDevice
) { ) {
save({ save({
id: ACTIVE_ANNOUNCEMENT, id: ACTIVE_UPDATE_ID,
completed: true, completed: true,
data: undefined, data: undefined,
}) })
@@ -1,7 +0,0 @@
import {ID} from '#/components/dialogs/BlockingAnnouncements/announcements/PolicyUpdate202508/config'
/**
* The singulary active announcement ID. This is configured here to ensure that
* the relationship is clear.
*/
export const ACTIVE_ANNOUNCEMENT = ID
+2 -2
View File
@@ -17,7 +17,6 @@ import * as Toast from '#/view/com/util/Toast'
import * as SettingsList from '#/screens/Settings/components/SettingsList' import * as SettingsList from '#/screens/Settings/components/SettingsList'
import {atoms as a} from '#/alf' import {atoms as a} from '#/alf'
import {Button, ButtonText} from '#/components/Button' import {Button, ButtonText} from '#/components/Button'
import {ID as PolicyUpdate202508} from '#/components/dialogs/BlockingAnnouncements/announcements/PolicyUpdate202508/config'
import {Atom_Stroke2_Corner0_Rounded as AtomIcon} from '#/components/icons/Atom' import {Atom_Stroke2_Corner0_Rounded as AtomIcon} from '#/components/icons/Atom'
import {BroomSparkle_Stroke2_Corner2_Rounded as BroomSparkleIcon} from '#/components/icons/BroomSparkle' import {BroomSparkle_Stroke2_Corner2_Rounded as BroomSparkleIcon} from '#/components/icons/BroomSparkle'
import {CodeLines_Stroke2_Corner2_Rounded as CodeLinesIcon} from '#/components/icons/CodeLines' import {CodeLines_Stroke2_Corner2_Rounded as CodeLinesIcon} from '#/components/icons/CodeLines'
@@ -26,6 +25,7 @@ import {Newspaper_Stroke2_Corner2_Rounded as NewspaperIcon} from '#/components/i
import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/Wrench' import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/Wrench'
import * as Layout from '#/components/Layout' import * as Layout from '#/components/Layout'
import {Loader} from '#/components/Loader' import {Loader} from '#/components/Loader'
import {ID as PolicyUpdate202508} from '#/components/PolicyUpdateOverlay/updates/202508/config'
import {Text} from '#/components/Typography' import {Text} from '#/components/Typography'
import * as env from '#/env' import * as env from '#/env'
import {device, useStorage} from '#/storage' import {device, useStorage} from '#/storage'
@@ -198,7 +198,7 @@ export function AboutSettingsScreen({}: Props) {
function PolicyUpdateDebug() { function PolicyUpdateDebug() {
const agent = useAgent() const agent = useAgent()
const [override, setOverride] = useStorage(device, [ const [override, setOverride] = useStorage(device, [
'blockingAnnouncementOverride', 'policyUpdateDebugOverride',
]) ])
return ( return (
+3 -3
View File
@@ -13,7 +13,7 @@ export enum Nux {
/* /*
* Blocking announcements. New IDs are required for each new announcement. * Blocking announcements. New IDs are required for each new announcement.
*/ */
BlockingAnnouncementPolicyUpdate202508 = 'BlockingAnnouncementPolicyUpdate202508', PolicyUpdate202508 = 'PolicyUpdate202508',
} }
export const nuxNames = new Set(Object.values(Nux)) export const nuxNames = new Set(Object.values(Nux))
@@ -44,7 +44,7 @@ export type AppNux = BaseNux<
data: undefined data: undefined
} }
| { | {
id: Nux.BlockingAnnouncementPolicyUpdate202508 id: Nux.PolicyUpdate202508
data: undefined data: undefined
} }
> >
@@ -56,5 +56,5 @@ export const NuxSchemas: Record<Nux, zod.ZodObject<any> | undefined> = {
[Nux.ActivitySubscriptions]: undefined, [Nux.ActivitySubscriptions]: undefined,
[Nux.AgeAssuranceDismissibleNotice]: undefined, [Nux.AgeAssuranceDismissibleNotice]: undefined,
[Nux.AgeAssuranceDismissibleFeedBanner]: undefined, [Nux.AgeAssuranceDismissibleFeedBanner]: undefined,
[Nux.BlockingAnnouncementPolicyUpdate202508]: undefined, [Nux.PolicyUpdate202508]: undefined,
} }
+3 -3
View File
@@ -1,4 +1,4 @@
import {type ID as PolicyUpdate202508} from '#/components/dialogs/BlockingAnnouncements/announcements/PolicyUpdate202508/config' import {type ID as PolicyUpdate202508} from '#/components/PolicyUpdateOverlay/updates/202508/config'
/** /**
* Device data that's specific to the device and does not vary based account * Device data that's specific to the device and does not vary based account
@@ -17,9 +17,9 @@ export type Device = {
activitySubscriptionsNudged?: boolean activitySubscriptionsNudged?: boolean
/** /**
* Blocking announcements. New IDs are required for each new announcement. * Policy update overlays. New IDs are required for each new announcement.
*/ */
blockingAnnouncementOverride?: boolean policyUpdateDebugOverride?: boolean
[PolicyUpdate202508]?: boolean [PolicyUpdate202508]?: boolean
} }
@@ -40,7 +40,7 @@ import {Onboarding} from '#/screens/Onboarding'
import {SignupQueued} from '#/screens/SignupQueued' import {SignupQueued} from '#/screens/SignupQueued'
import {Takendown} from '#/screens/Takendown' import {Takendown} from '#/screens/Takendown'
import {atoms as a, useLayoutBreakpoints} from '#/alf' import {atoms as a, useLayoutBreakpoints} from '#/alf'
import {BlockingAnnouncements} from '#/components/dialogs/BlockingAnnouncements' import {PolicyUpdateOverlay} from '#/components/PolicyUpdateOverlay'
import {BottomBarWeb} from './bottom-bar/BottomBarWeb' import {BottomBarWeb} from './bottom-bar/BottomBarWeb'
import {DesktopLeftNav} from './desktop/LeftNav' import {DesktopLeftNav} from './desktop/LeftNav'
import {DesktopRightNav} from './desktop/RightNav' import {DesktopRightNav} from './desktop/RightNav'
@@ -168,7 +168,9 @@ function NativeStackNavigator({
{!isMobile && <DesktopRightNav routeName={activeRoute.name} />} {!isMobile && <DesktopRightNav routeName={activeRoute.name} />}
</> </>
)} )}
<BlockingAnnouncements />
{/* Only shown after logged in and onboaring etc are complete */}
{hasSession && <PolicyUpdateOverlay />}
</NavigationContent> </NavigationContent>
) )
} }
+2 -2
View File
@@ -31,8 +31,8 @@ import {InAppBrowserConsentDialog} from '#/components/dialogs/InAppBrowserConsen
import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' import {LinkWarningDialog} from '#/components/dialogs/LinkWarning'
import {MutedWordsDialog} from '#/components/dialogs/MutedWords' import {MutedWordsDialog} from '#/components/dialogs/MutedWords'
import {SigninDialog} from '#/components/dialogs/Signin' import {SigninDialog} from '#/components/dialogs/Signin'
import {Outlet as PolicyUpdateOverlayPortal} from '#/components/PolicyUpdateOverlay'
import {Outlet as PortalOutlet} from '#/components/Portal' import {Outlet as PortalOutlet} from '#/components/Portal'
import {Outlet as BlockingAccouncementsPortalOutlet} from '#/components/dialogs/BlockingAnnouncements'
import {RoutesContainer, TabsNavigator} from '#/Navigation' import {RoutesContainer, TabsNavigator} from '#/Navigation'
import {BottomSheetOutlet} from '../../../modules/bottom-sheet' import {BottomSheetOutlet} from '../../../modules/bottom-sheet'
import {updateActiveViewAsync} from '../../../modules/expo-bluesky-swiss-army/src/VisibilityView' import {updateActiveViewAsync} from '../../../modules/expo-bluesky-swiss-army/src/VisibilityView'
@@ -165,7 +165,7 @@ function ShellInner() {
<BottomSheetOutlet /> <BottomSheetOutlet />
{/* MUST BE LAST */} {/* MUST BE LAST */}
<BlockingAccouncementsPortalOutlet /> <PolicyUpdateOverlayPortal />
</> </>
) )
} }
+2 -2
View File
@@ -18,11 +18,11 @@ import {ModalsContainer} from '#/view/com/modals/Modal'
import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' import {ErrorBoundary} from '#/view/com/util/ErrorBoundary'
import {atoms as a, select, useTheme} from '#/alf' import {atoms as a, select, useTheme} from '#/alf'
import {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog' import {AgeAssuranceRedirectDialog} from '#/components/ageAssurance/AgeAssuranceRedirectDialog'
import {Outlet as BlockingAccouncementsPortalOutlet} from '#/components/dialogs/BlockingAnnouncements'
import {EmailDialog} from '#/components/dialogs/EmailDialog' import {EmailDialog} from '#/components/dialogs/EmailDialog'
import {LinkWarningDialog} from '#/components/dialogs/LinkWarning' import {LinkWarningDialog} from '#/components/dialogs/LinkWarning'
import {MutedWordsDialog} from '#/components/dialogs/MutedWords' import {MutedWordsDialog} from '#/components/dialogs/MutedWords'
import {SigninDialog} from '#/components/dialogs/Signin' import {SigninDialog} from '#/components/dialogs/Signin'
import {Outlet as PolicyUpdateOverlayPortal} from '#/components/PolicyUpdateOverlay'
import {Outlet as PortalOutlet} from '#/components/Portal' import {Outlet as PortalOutlet} from '#/components/Portal'
import {FlatNavigator, RoutesContainer} from '#/Navigation' import {FlatNavigator, RoutesContainer} from '#/Navigation'
import {Composer} from './Composer.web' import {Composer} from './Composer.web'
@@ -116,7 +116,7 @@ function ShellInner() {
)} )}
{/* MUST BE LAST */} {/* MUST BE LAST */}
<BlockingAccouncementsPortalOutlet /> <PolicyUpdateOverlayPortal />
</> </>
) )
} }