From e52478e0324aa53541b18f9cc8a9245e53898288 Mon Sep 17 00:00:00 2001 From: Eric Bailey Date: Tue, 24 Jun 2025 15:23:01 -0500 Subject: [PATCH] Formatting nits --- src/lib/notifications/notifications.ts | 90 ++++++++++++++++---------- src/platform/detection.ts | 1 - 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/src/lib/notifications/notifications.ts b/src/lib/notifications/notifications.ts index ab7fc57088..12b5a6e57d 100644 --- a/src/lib/notifications/notifications.ts +++ b/src/lib/notifications/notifications.ts @@ -1,39 +1,41 @@ import React from 'react' +import {Platform} from 'react-native' import * as Notifications from 'expo-notifications' import {getBadgeCountAsync, setBadgeCountAsync} from 'expo-notifications' -import {BskyAgent} from '@atproto/api' +import {type AtpAgent} from '@atproto/api' -import {logEvent} from '#/lib/statsig/statsig' import {Logger} from '#/logger' -import {devicePlatform, isAndroid, isNative} from '#/platform/detection' -import {SessionAccount, useAgent, useSession} from '#/state/session' +import {isAndroid, isNative} from '#/platform/detection' +import {type SessionAccount, useAgent, useSession} from '#/state/session' import BackgroundNotificationHandler from '../../../modules/expo-background-notification-handler' -const SERVICE_DID = (serviceUrl?: string) => - serviceUrl?.includes('staging') - ? 'did:web:api.staging.bsky.dev' - : 'did:web:api.bsky.app' - const logger = Logger.create(Logger.Context.Notifications) async function registerPushToken( - agent: BskyAgent, + agent: AtpAgent, account: SessionAccount, token: Notifications.DevicePushToken, ) { try { - await agent.api.app.bsky.notification.registerPush({ - serviceDid: SERVICE_DID(account.service), - platform: devicePlatform, + await agent.app.bsky.notification.registerPush({ + serviceDid: account.service?.includes('staging') + ? 'did:web:api.staging.bsky.dev' + : 'did:web:api.bsky.app', + platform: Platform.select({ + ios: 'ios', + android: 'android', + default: 'web', + }), token: token.data, appId: 'xyz.blueskyweb.app', }) - logger.debug('Notifications: Sent push token (init)', { + + logger.debug(`registerPushToken`, { tokenType: token.type, token: token.data, }) } catch (error) { - logger.error('Notifications: Failed to set push token', {message: error}) + logger.error(`registerPushToken: failed`, {safeMessage: error}) } } @@ -50,14 +52,16 @@ export function useNotificationsRegistration() { const {currentAccount} = useSession() React.useEffect(() => { - if (!currentAccount) { - return - } + if (!currentAccount) return - // HACK - see https://github.com/bluesky-social/social-app/pull/4467 - // An apparent regression in expo-notifications causes `addPushTokenListener` to not fire on Android whenever the - // token changes by calling `getPushToken()`. This is a workaround to ensure we register the token once it is - // generated on Android. + /** + * HACK — An apparent regression in expo-notifications causes + * `addPushTokenListener` to not fire on Android whenever the token changes + * by calling `getPushToken()`. This is a workaround to ensure we register + * the token once it is generated on Android. + * + * @see https://github.com/bluesky-social/social-app/pull/4467 + */ if (isAndroid) { ;(async () => { const token = await getPushToken() @@ -71,8 +75,11 @@ export function useNotificationsRegistration() { getPushToken() } - // According to the Expo docs, there is a chance that the token will change while the app is open in some rare - // cases. This will fire `registerPushToken` whenever that happens. + /* + * According to the Expo docs, there is a chance that the token will change + * while the app is open in some rare cases. This will fire + * `registerPushToken` whenever that happens. + */ const subscription = Notifications.addPushTokenListener(async newToken => { registerPushToken(agent, currentAccount, newToken) }) @@ -107,24 +114,37 @@ export function useRequestNotificationsPermission() { } const res = await Notifications.requestPermissionsAsync() - logEvent('notifications:request', { + logger.metric(`notifications:request`, { context: context, status: res.status, }) if (res.granted) { - // This will fire a pushTokenEvent, which will handle registration of the token + /* + * This will fire a pushTokenEvent, which will handle registration of the + * token + */ const token = await getPushToken(true) - // Same hack as above. We cannot rely on the `addPushTokenListener` to fire on Android due to an Expo bug, so we - // will manually register it here. Note that this will occur only: - // 1. right after the user signs in, leading to no `currentAccount` account being available - this will be instead - // picked up from the useEffect above on `currentAccount` change - // 2. right after onboarding. In this case, we _need_ this registration, since `currentAccount` will not change - // and we need to ensure the token is registered right after permission is granted. `currentAccount` will already - // be available in this case, so the registration will succeed. - // We should remove this once expo-notifications (and possibly FCMv1) is fixed and the `addPushTokenListener` is - // working again. See https://github.com/expo/expo/issues/28656 + /** + * Same hack as above. We cannot rely on the `addPushTokenListener` to + * fire on Android due to an Expo bug, so we will manually register it + * here. Note that this will occur only: + * + * 1) Right after the user signs in, leading to no `currentAccount` + * account being available - this will be instead picked up from the + * useEffect above on `currentAccount` change + * + * 2) Right after onboarding. In this case, we _need_ this + * registration, since `currentAccount` will not change and we need to + * ensure the token is registered right after permission is granted. + * `currentAccount` will already be available in this case, so the + * registration will succeed. We should remove this once + * expo-notifications (and possibly FCMv1) is fixed and the + * `addPushTokenListener` is working again. + * + * @see https://github.com/expo/expo/issues/28656 + */ if (isAndroid && currentAccount && token) { registerPushToken(agent, currentAccount, token) } diff --git a/src/platform/detection.ts b/src/platform/detection.ts index dc30c2fd33..083c005624 100644 --- a/src/platform/detection.ts +++ b/src/platform/detection.ts @@ -3,7 +3,6 @@ import {Platform} from 'react-native' export const isIOS = Platform.OS === 'ios' export const isAndroid = Platform.OS === 'android' export const isNative = isIOS || isAndroid -export const devicePlatform = isIOS ? 'ios' : isAndroid ? 'android' : 'web' export const isWeb = !isNative export const isMobileWebMediaQuery = 'only screen and (max-width: 1300px)' export const isMobileWeb =