Fix stale Notifications after push (#3507)
parent
14208eef11
commit
835f2e6548
|
@ -4,6 +4,7 @@ import {QueryClient} from '@tanstack/react-query'
|
||||||
|
|
||||||
import {logger} from '#/logger'
|
import {logger} from '#/logger'
|
||||||
import {RQKEY as RQKEY_NOTIFS} from '#/state/queries/notifications/feed'
|
import {RQKEY as RQKEY_NOTIFS} from '#/state/queries/notifications/feed'
|
||||||
|
import {invalidateCachedUnreadPage} from '#/state/queries/notifications/unread'
|
||||||
import {truncateAndInvalidate} from '#/state/queries/util'
|
import {truncateAndInvalidate} from '#/state/queries/util'
|
||||||
import {getAgent, SessionAccount} from '#/state/session'
|
import {getAgent, SessionAccount} from '#/state/session'
|
||||||
import {track} from 'lib/analytics/analytics'
|
import {track} from 'lib/analytics/analytics'
|
||||||
|
@ -87,6 +88,7 @@ export function useNotificationsListener(queryClient: QueryClient) {
|
||||||
// handle notifications that are received, both in the foreground or background
|
// handle notifications that are received, both in the foreground or background
|
||||||
// NOTE: currently just here for debug logging
|
// NOTE: currently just here for debug logging
|
||||||
const sub1 = Notifications.addNotificationReceivedListener(event => {
|
const sub1 = Notifications.addNotificationReceivedListener(event => {
|
||||||
|
invalidateCachedUnreadPage()
|
||||||
logger.debug(
|
logger.debug(
|
||||||
'Notifications: received',
|
'Notifications: received',
|
||||||
{event},
|
{event},
|
||||||
|
@ -131,11 +133,13 @@ export function useNotificationsListener(queryClient: QueryClient) {
|
||||||
)
|
)
|
||||||
track('Notificatons:OpenApp')
|
track('Notificatons:OpenApp')
|
||||||
logEvent('notifications:openApp', {})
|
logEvent('notifications:openApp', {})
|
||||||
|
invalidateCachedUnreadPage()
|
||||||
truncateAndInvalidate(queryClient, RQKEY_NOTIFS())
|
truncateAndInvalidate(queryClient, RQKEY_NOTIFS())
|
||||||
resetToTab('NotificationsTab') // open notifications tab
|
resetToTab('NotificationsTab') // open notifications tab
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
sub1.remove()
|
sub1.remove()
|
||||||
sub2.remove()
|
sub2.remove()
|
||||||
|
|
|
@ -3,24 +3,28 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React from 'react'
|
import React from 'react'
|
||||||
|
import {AppState} from 'react-native'
|
||||||
import * as Notifications from 'expo-notifications'
|
import * as Notifications from 'expo-notifications'
|
||||||
import {useQueryClient} from '@tanstack/react-query'
|
import {useQueryClient} from '@tanstack/react-query'
|
||||||
|
import EventEmitter from 'eventemitter3'
|
||||||
|
|
||||||
import BroadcastChannel from '#/lib/broadcast'
|
import BroadcastChannel from '#/lib/broadcast'
|
||||||
import {useSession, getAgent} from '#/state/session'
|
import {logger} from '#/logger'
|
||||||
import {useModerationOpts} from '../preferences'
|
|
||||||
import {fetchPage} from './util'
|
|
||||||
import {CachedFeedPage, FeedPage} from './types'
|
|
||||||
import {isNative} from '#/platform/detection'
|
import {isNative} from '#/platform/detection'
|
||||||
import {useMutedThreads} from '#/state/muted-threads'
|
import {useMutedThreads} from '#/state/muted-threads'
|
||||||
import {RQKEY as RQKEY_NOTIFS} from './feed'
|
import {getAgent, useSession} from '#/state/session'
|
||||||
import {logger} from '#/logger'
|
import {useModerationOpts} from '../preferences'
|
||||||
import {truncateAndInvalidate} from '../util'
|
import {truncateAndInvalidate} from '../util'
|
||||||
import {AppState} from 'react-native'
|
import {RQKEY as RQKEY_NOTIFS} from './feed'
|
||||||
|
import {CachedFeedPage, FeedPage} from './types'
|
||||||
|
import {fetchPage} from './util'
|
||||||
|
|
||||||
const UPDATE_INTERVAL = 30 * 1e3 // 30sec
|
const UPDATE_INTERVAL = 30 * 1e3 // 30sec
|
||||||
|
|
||||||
const broadcast = new BroadcastChannel('NOTIFS_BROADCAST_CHANNEL')
|
const broadcast = new BroadcastChannel('NOTIFS_BROADCAST_CHANNEL')
|
||||||
|
|
||||||
|
const emitter = new EventEmitter()
|
||||||
|
|
||||||
type StateContext = string
|
type StateContext = string
|
||||||
|
|
||||||
interface ApiContext {
|
interface ApiContext {
|
||||||
|
@ -56,6 +60,18 @@ export function Provider({children}: React.PropsWithChildren<{}>) {
|
||||||
unreadCount: 0,
|
unreadCount: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
function markAsUnusable() {
|
||||||
|
if (cacheRef.current) {
|
||||||
|
cacheRef.current.usableInFeed = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
emitter.addListener('invalidate', markAsUnusable)
|
||||||
|
return () => {
|
||||||
|
emitter.removeListener('invalidate', markAsUnusable)
|
||||||
|
}
|
||||||
|
}, [])
|
||||||
|
|
||||||
// periodic sync
|
// periodic sync
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (!hasSession || !checkUnreadRef.current) {
|
if (!hasSession || !checkUnreadRef.current) {
|
||||||
|
@ -214,3 +230,7 @@ function countUnread(page: FeedPage) {
|
||||||
}
|
}
|
||||||
return num
|
return num
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function invalidateCachedUnreadPage() {
|
||||||
|
emitter.emit('invalidate')
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue