51 lines
1.1 KiB
TypeScript
51 lines
1.1 KiB
TypeScript
import {createContext, useContext, useMemo} from 'react'
|
|
import {type SharedValue} from 'react-native-reanimated'
|
|
|
|
import {IS_NATIVE} from '#/env'
|
|
|
|
export const PagerHeaderContext = createContext<{
|
|
scrollY: SharedValue<number>
|
|
headerHeight: number
|
|
} | null>(null)
|
|
PagerHeaderContext.displayName = 'PagerHeaderContext'
|
|
|
|
/**
|
|
* Passes information about the scroll position and header height down via
|
|
* context for the pager header to consume.
|
|
*
|
|
* @platform ios, android
|
|
*/
|
|
export function PagerHeaderProvider({
|
|
scrollY,
|
|
headerHeight,
|
|
children,
|
|
}: {
|
|
scrollY: SharedValue<number>
|
|
headerHeight: number
|
|
children: React.ReactNode
|
|
}) {
|
|
const value = useMemo(
|
|
() => ({scrollY, headerHeight}),
|
|
[scrollY, headerHeight],
|
|
)
|
|
return (
|
|
<PagerHeaderContext.Provider value={value}>
|
|
{children}
|
|
</PagerHeaderContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function usePagerHeaderContext() {
|
|
const ctx = useContext(PagerHeaderContext)
|
|
if (IS_NATIVE) {
|
|
if (!ctx) {
|
|
throw new Error(
|
|
'usePagerHeaderContext must be used within a HeaderProvider',
|
|
)
|
|
}
|
|
return ctx
|
|
} else {
|
|
return null
|
|
}
|
|
}
|