diff --git a/packages/common/src/services/audius-backend/AudiusBackend.ts b/packages/common/src/services/audius-backend/AudiusBackend.ts index ebb2806f34d..ba67b01f297 100644 --- a/packages/common/src/services/audius-backend/AudiusBackend.ts +++ b/packages/common/src/services/audius-backend/AudiusBackend.ts @@ -392,6 +392,31 @@ export const audiusBackend = ({ } } + async function pingActivity({ + sdk, + userId + }: { + sdk: AudiusSdkWithServices + userId: number + }) { + try { + const { data, signature } = await signAPIRequest({ sdk }) + if (!signature) return + const encodedUserId = encodeHashId(userId) + if (!encodedUserId) return + const base = env.API_URL.replace(/\/$/, '') + await fetch(`${base}/v1/users/me/ping?user_id=${encodedUserId}`, { + method: 'POST', + headers: { + [AuthHeaders.Message]: data, + [AuthHeaders.Signature]: signature + } + }) + } catch { + // Fire-and-forget + } + } + async function signAPIRequest({ sdk, input @@ -1181,6 +1206,7 @@ export const audiusBackend = ({ getSignature, getWAudioBalance, identityServiceUrl, + pingActivity, registerDeviceToken, reportNotificationCampaignPushOpen, sendTokens, diff --git a/packages/mobile/src/hooks/useActivityPing.ts b/packages/mobile/src/hooks/useActivityPing.ts new file mode 100644 index 00000000000..00d472f20cd --- /dev/null +++ b/packages/mobile/src/hooks/useActivityPing.ts @@ -0,0 +1,26 @@ +import { useCallback } from 'react' + +import { useCurrentUserId, useQueryContext } from '@audius/common/api' + +import { useEnterForeground } from 'app/hooks/useAppState' +import { audiusBackendInstance } from 'app/services/audius-backend-instance' + +export const useActivityPing = () => { + const { data: currentUserId } = useCurrentUserId() + const { audiusSdk } = useQueryContext() + + useEnterForeground( + useCallback(async () => { + if (!currentUserId) return + try { + const sdk = await audiusSdk() + await audiusBackendInstance.pingActivity({ + sdk, + userId: currentUserId + }) + } catch { + // Fire-and-forget + } + }, [currentUserId, audiusSdk]) + ) +} diff --git a/packages/mobile/src/screens/root-screen/RootScreen.tsx b/packages/mobile/src/screens/root-screen/RootScreen.tsx index 09758022b72..342e7e61de5 100644 --- a/packages/mobile/src/screens/root-screen/RootScreen.tsx +++ b/packages/mobile/src/screens/root-screen/RootScreen.tsx @@ -40,6 +40,8 @@ import { OAuthScreen } from '../oauth-screen/OAuthScreen' import { ResetPasswordModalScreen } from '../reset-password-screen' import { SignOnStack } from '../sign-on-screen' +import { useActivityPing } from 'app/hooks/useActivityPing' + import { StatusBar } from './StatusBar' import { useResetNotificationBadgeCount } from './useResetNotificationBadgeCount' @@ -97,6 +99,7 @@ export const RootScreen = () => { ) useResetNotificationBadgeCount() + useActivityPing() // Reset the player on first mount so a crash doesn't leak previous playback // state into the next session. PAY-1412.