Clean up the call once utils

This commit is contained in:
Eric Bailey
2026-01-21 21:13:28 -06:00
parent 10c44a0e20
commit 28a1c21353
6 changed files with 38 additions and 31 deletions
+3 -2
View File
@@ -28,6 +28,7 @@ import {
storePayloadForAccountSwitch,
} from '#/lib/hooks/useNotificationHandler'
import {useWebScrollRestoration} from '#/lib/hooks/useWebScrollRestoration'
import {useCallOnce} from '#/lib/once'
import {buildStateObject} from '#/lib/routes/helpers'
import {
type AllNavigatorParams,
@@ -41,7 +42,6 @@ import {
type SearchTabNavigatorParams,
type State,
} from '#/lib/routes/types'
import {useRunCallbackOnce} from '#/lib/runCallbackOnce'
import {bskyTitle} from '#/lib/strings/headings'
import {useUnreadNotifications} from '#/state/queries/notifications/unread'
import {useSession} from '#/state/session'
@@ -980,7 +980,8 @@ function RoutesContainer({children}: React.PropsWithChildren<{}>) {
}
}
const onNavigationReady = useRunCallbackOnce(() => {
const onNavigationReady = useCallOnce(() => {
alert('test')
prevLoggedRouteName.current = getCurrentRouteName()
handlePushNotificationEntry()
+27
View File
@@ -0,0 +1,27 @@
import {useCallback, useRef} from 'react'
type Cb = () => void
export function callOnce() {
let ran = false
return function runCallbackOnce(cb: Cb) {
if (ran) return
ran = true
cb()
}
}
export function useCallOnce(cb: Cb): () => void
export function useCallOnce(cb?: undefined): (cb: Cb) => void
export function useCallOnce(cb?: Cb) {
const ran = useRef(false)
return useCallback(
(icb: Cb) => {
if (ran.current) return
ran.current = true
if (icb) icb()
else if (cb) cb()
},
[cb],
)
}
-21
View File
@@ -1,21 +0,0 @@
import {useCallback, useRef} from 'react'
export function createRunCallbackOnce() {
let hasRun = false
return function runCallbackOnce(callback: () => void) {
if (!hasRun) {
hasRun = true
callback()
}
}
}
export function useRunCallbackOnce(callback: () => void) {
const hasRunRef = useRef(false)
return useCallback(() => {
if (!hasRunRef.current) {
hasRunRef.current = true
callback()
}
}, [callback])
}
@@ -2,7 +2,7 @@ import {useCallback, useState} from 'react'
import {LayoutAnimationConfig} from 'react-native-reanimated'
import {SafeAreaView} from 'react-native-safe-area-context'
import {useRunCallbackOnce} from '#/lib/runCallbackOnce'
import {useCallOnce} from '#/lib/once'
import {FindContactsFlow} from '#/components/contacts/FindContactsFlow'
import {type Action, type State} from '#/components/contacts/state'
import {ScreenTransition} from '#/components/ScreenTransition'
@@ -19,9 +19,9 @@ export function StepFindContacts({
const {dispatch} = useOnboardingInternalState()
const ax = useAnalytics()
useRunCallbackOnce(() => {
useCallOnce(() => {
ax.metric('onboarding:contacts:begin', {})
})
})()
const [transitionDirection, setTransitionDirection] = useState<
'Forward' | 'Backward'
@@ -5,7 +5,7 @@ import {useLingui} from '@lingui/react'
import {useQuery} from '@tanstack/react-query'
import {urls} from '#/lib/constants'
import {useRunCallbackOnce} from '#/lib/runCallbackOnce'
import {useCallOnce} from '#/lib/once'
import {atoms as a} from '#/alf'
import {Admonition} from '#/components/Admonition'
import {Button, ButtonText} from '#/components/Button'
@@ -25,9 +25,9 @@ export function StepFindContactsIntro() {
const {_} = useLingui()
const {dispatch} = useOnboardingInternalState()
useRunCallbackOnce(() => {
useCallOnce(() => {
ax.metric('onboarding:contacts:presented', {})
})
})()
const {data: isAvailable, isSuccess} = useQuery({
queryKey: ['contacts-available'],
@@ -2,7 +2,7 @@ import {useCallback, useMemo, useRef, useState} from 'react'
import {type AppBskyUnspeccedGetPostThreadV2} from '@atproto/api'
import debounce from 'lodash.debounce'
import {OnceKey, useCallOnce} from '#/lib/hooks/useCallOnce'
import {useCallOnce} from '#/lib/once'
import {
usePreferencesQuery,
useSetThreadViewPreferencesMutation,
@@ -31,7 +31,7 @@ export function useThreadPreferences({
const ax = useAnalytics()
const {data: preferences} = usePreferencesQuery()
const serverPrefs = preferences?.threadViewPrefs
const once = useCallOnce(OnceKey.PreferencesThread)
const once = useCallOnce()
/*
* Create local state representations of server state