diff --git a/src/components/dialogs/BlockingAnnouncements/useAnnouncementState.ts b/src/components/dialogs/BlockingAnnouncements/useAnnouncementState.ts
index 8a12b5627f..8b8dfb3e84 100644
--- a/src/components/dialogs/BlockingAnnouncements/useAnnouncementState.ts
+++ b/src/components/dialogs/BlockingAnnouncements/useAnnouncementState.ts
@@ -2,6 +2,7 @@ import {useMemo} from 'react'
import {useNux, useSaveNux} from '#/state/queries/nuxs'
import {ACTIVE_ANNOUNCEMENT} from '#/components/dialogs/BlockingAnnouncements/config'
+import {IS_DEV} from '#/env'
import {device, useStorage} from '#/storage'
export type AnnouncementState = {
@@ -13,6 +14,8 @@ export function useAnnouncementState() {
const nux = useNux(ACTIVE_ANNOUNCEMENT)
const {mutate: save, variables} = useSaveNux()
const deviceStorage = useStorage(device, [ACTIVE_ANNOUNCEMENT])
+ const devOnlyOverride =
+ useStorage(device, ['blockingAnnouncementOverride']) && IS_DEV
return useMemo(() => {
const nuxIsReady = nux.status === 'ready'
const nuxIsCompleted = nux.nux?.completed === true
@@ -26,14 +29,16 @@ export function useAnnouncementState() {
completedForDevice,
})
- syncCompletedState({
- nuxIsReady,
- nuxIsCompleted,
- nuxIsOptimisticallyCompleted,
- completedForDevice,
- save,
- setCompletedForDevice,
- })
+ if (!devOnlyOverride) {
+ syncCompletedState({
+ nuxIsReady,
+ nuxIsCompleted,
+ nuxIsOptimisticallyCompleted,
+ completedForDevice,
+ save,
+ setCompletedForDevice,
+ })
+ }
return {
completed,
@@ -45,7 +50,7 @@ export function useAnnouncementState() {
})
},
}
- }, [nux, save, variables, deviceStorage])
+ }, [nux, save, variables, deviceStorage, devOnlyOverride])
}
export function computeCompletedState({
diff --git a/src/screens/Settings/AboutSettings.tsx b/src/screens/Settings/AboutSettings.tsx
index e48841d9f0..66506a579c 100644
--- a/src/screens/Settings/AboutSettings.tsx
+++ b/src/screens/Settings/AboutSettings.tsx
@@ -12,6 +12,8 @@ import {Statsig} from 'statsig-react-native-expo'
import {STATUS_PAGE_URL} from '#/lib/constants'
import {type CommonNavigatorParams} from '#/lib/routes/types'
import {isAndroid, isIOS, isNative} from '#/platform/detection'
+import {Nux} from '#/state/queries/nuxs'
+import {useAgent} from '#/state/session'
import * as Toast from '#/view/com/util/Toast'
import * as SettingsList from '#/screens/Settings/components/SettingsList'
import {Atom_Stroke2_Corner0_Rounded as AtomIcon} from '#/components/icons/Atom'
@@ -23,6 +25,7 @@ import {Wrench_Stroke2_Corner2_Rounded as WrenchIcon} from '#/components/icons/W
import * as Layout from '#/components/Layout'
import {Loader} from '#/components/Loader'
import * as env from '#/env'
+import {device, useStorage} from '#/storage'
import {useDemoMode} from '#/storage/hooks/demo-mode'
import {useDevMode} from '#/storage/hooks/dev-mode'
import {OTAInfo} from './components/OTAInfo'
@@ -179,6 +182,8 @@ export function AboutSettingsScreen({}: Props) {
)}
+
+
>
)}
@@ -186,3 +191,41 @@ export function AboutSettingsScreen({}: Props) {
)
}
+
+function PolicyUpdateDebug() {
+ const agent = useAgent()
+ const [override, setOverride] = useStorage(device, [
+ 'blockingAnnouncementOverride',
+ ])
+
+ return (
+ <>
+ {
+ setOverride(!override)
+ }}
+ label="Toggle">
+
+
+ Enable policy update override
+
+
+
+ {override && (
+ {
+ device.set([Nux.BlockingAnnouncementPolicyUpdate202508], false)
+ agent.bskyAppRemoveNuxs([
+ Nux.BlockingAnnouncementPolicyUpdate202508,
+ ])
+ }}
+ label="Reset policy update nux">
+
+
+ Reset policy update state
+
+
+ )}
+ >
+ )
+}
diff --git a/src/storage/schema.ts b/src/storage/schema.ts
index 527e0d9e96..1ee780c78c 100644
--- a/src/storage/schema.ts
+++ b/src/storage/schema.ts
@@ -19,6 +19,7 @@ export type Device = {
/**
* Blocking announcements. New IDs are required for each new announcement.
*/
+ blockingAnnouncementOverride?: boolean
[Nux.BlockingAnnouncementPolicyUpdate202508]?: boolean
}