Initial pass at push notifications + some fixes to the session management (#91)

* Fix: test the session during resume to ensure it's valid

* Don't delete sessions for now

* Add notifee and request notif permissions on first login

* Set unread notifications badge on app icon

* Trigger a notifee card on new notifications

* Experimental: use react-native-background-fetch to check for notifications

* Add missing mocks

* Fix to resumeSession()
This commit is contained in:
Paul Frazee 2023-01-24 19:32:24 -06:00 committed by GitHub
parent 21f5f4de15
commit 869f6c4e0e
12 changed files with 189 additions and 27 deletions

View file

@ -1,4 +1,5 @@
import {makeAutoObservable, runInAction} from 'mobx'
import notifee from '@notifee/react-native'
import {RootStoreModel} from './root-store'
import {FeedModel} from './feed-view'
import {NotificationsViewModel} from './notifications-view'
@ -104,6 +105,9 @@ export class MeModel {
this.rootStore.log.error('Failed to setup notifications model', e)
}),
])
// request notifications permission once the user has logged in
notifee.requestPermission()
} else {
this.clear()
}
@ -111,16 +115,28 @@ export class MeModel {
clearNotificationCount() {
this.notificationCount = 0
notifee.setBadgeCount(0)
}
async fetchStateUpdate() {
async fetchNotifications() {
const res = await this.rootStore.api.app.bsky.notification.getCount()
runInAction(() => {
const newNotifications = this.notificationCount !== res.data.count
this.notificationCount = res.data.count
notifee.setBadgeCount(this.notificationCount)
if (newNotifications) {
// trigger pre-emptive fetch on new notifications
this.notifications.refresh()
let oldMostRecent = this.notifications.mostRecentNotification
this.notifications.refresh().then(() => {
// if a new most recent notification is found, trigger a notification card
const mostRecent = this.notifications.mostRecentNotification
if (mostRecent && oldMostRecent?.uri !== mostRecent?.uri) {
const notifeeOpts = mostRecent.toNotifeeOpts()
if (notifeeOpts) {
notifee.displayNotification(notifeeOpts)
}
}
})
}
})
}