Skip to content

Commit a403e6e

Browse files
committed
messaging as hook
1 parent 7444a81 commit a403e6e

4 files changed

Lines changed: 33 additions & 16 deletions

File tree

apps/mobile/src/App.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,20 @@ import { RootSiblingParent } from "react-native-root-siblings"
55
import { useSheet } from "react-native-sheet-transitions"
66

77
import { useIntentHandler } from "./hooks/useIntentHandler"
8-
import { useMessaging } from "./initialize/messaging"
98
import { DebugButton, EnvProfileIndicator } from "./modules/debug"
9+
import { usePrefetchActions } from "./store/action/hooks"
10+
import { useMessaging, useMessagingToken } from "./store/messaging/hooks"
1011
import { useUnreadCountBadge } from "./store/unread/hooks"
1112
import { useOnboarding, usePrefetchSessionUser } from "./store/user/hooks"
1213

1314
export function App({ children }: { children: React.ReactNode }) {
1415
useIntentHandler()
1516
useOnboarding()
1617
useUnreadCountBadge()
18+
19+
// prefetch actions to detect if the user has any actions contains notifications
20+
usePrefetchActions()
21+
useMessagingToken()
1722
useMessaging()
1823
const { scale } = useSheet()
1924

apps/mobile/src/initialize/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { initBackgroundFetch } from "./background"
88
import { initCrashlytics } from "./crashlytics"
99
import { initializeDayjs } from "./dayjs"
1010
import { hydrateDatabaseToStore, hydrateQueryClient, hydrateSettings } from "./hydrate"
11-
import { initMessaging } from "./messaging"
1211
import { migrateDatabase } from "./migration"
1312
import { initializePlayer } from "./player"
1413

@@ -42,7 +41,6 @@ export const initializeApp = async () => {
4241
using_indexed_db: true,
4342
})
4443
initCrashlytics()
45-
initMessaging()
4644
initBackgroundFetch()
4745
console.log(`Initialize done,`, `${loadingTime}ms`)
4846
}

apps/mobile/src/store/action/hooks.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,9 @@ export function useActionRuleCondition({
6464
export const useIsActionDataDirty = () => {
6565
return useActionStore((state) => state.isDirty)
6666
}
67+
68+
export const useHasNotificationActions = () => {
69+
return useActionStore((state) => {
70+
return state.rules.some((rule) => !!rule.result.newEntryNotification)
71+
})
72+
}
Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
import type { FirebaseMessagingTypes } from "@react-native-firebase/messaging"
22
import messaging from "@react-native-firebase/messaging"
3+
import { useMutation } from "@tanstack/react-query"
34
import { useEffect } from "react"
45
import { Platform } from "react-native"
56

6-
import { apiClient } from "../lib/api-fetch"
7-
import { kv } from "../lib/kv"
8-
import { useNavigation } from "../lib/navigation/hooks"
9-
import { requestNotificationPermission } from "../lib/permission"
10-
import { EntryDetailScreen } from "../screens/(stack)/entries/[entryId]"
11-
import { whoami } from "../store/user/getters"
7+
import { apiClient } from "@/src/lib/api-fetch"
8+
import { kv } from "@/src/lib/kv"
9+
import { useNavigation } from "@/src/lib/navigation/hooks"
10+
import { requestNotificationPermission } from "@/src/lib/permission"
11+
import { EntryDetailScreen } from "@/src/screens/(stack)/entries/[entryId]"
12+
13+
import { useHasNotificationActions } from "../action/hooks"
14+
import { useWhoami } from "../user/hooks"
1215

1316
const FIREBASE_MESSAGING_TOKEN_STORAGE_KEY = "firebase_messaging_token"
1417

@@ -27,14 +30,19 @@ async function saveMessagingToken() {
2730
kv.set(FIREBASE_MESSAGING_TOKEN_STORAGE_KEY, token)
2831
}
2932

30-
export const initMessaging = () => {
31-
const user = whoami()
32-
if (!user) {
33-
return
34-
}
33+
export function useMessagingToken() {
34+
const whoami = useWhoami()
35+
const hasNotificationActions = useHasNotificationActions()
36+
const { mutate } = useMutation({
37+
mutationFn: async () => {
38+
return Promise.all([saveMessagingToken(), requestNotificationPermission()])
39+
},
40+
})
3541

36-
saveMessagingToken()
37-
requestNotificationPermission()
42+
useEffect(() => {
43+
if (!whoami || !hasNotificationActions) return
44+
mutate()
45+
}, [hasNotificationActions, mutate, whoami])
3846
}
3947

4048
export function useMessaging() {

0 commit comments

Comments
 (0)