2023-11-14 20:50:58 +00:00
|
|
|
import React from 'react'
|
2023-12-08 04:40:45 +00:00
|
|
|
|
2023-11-22 10:53:36 +00:00
|
|
|
import { useHydrated } from './use-hydration'
|
2023-11-14 20:50:58 +00:00
|
|
|
|
2023-11-22 10:53:36 +00:00
|
|
|
export const useStore = <T extends { _hasHydrated?: boolean }, F>(
|
2023-11-14 20:50:58 +00:00
|
|
|
store: (callback: (state: T) => unknown) => unknown,
|
|
|
|
|
callback: (state: T) => F
|
|
|
|
|
) => {
|
2023-11-22 10:53:36 +00:00
|
|
|
const hydrated = useHydrated()
|
|
|
|
|
const _hasZustandHydrated = store((state: T) => state?._hasHydrated)
|
2023-11-14 20:50:58 +00:00
|
|
|
const result = store(callback) as F
|
2023-11-22 10:53:36 +00:00
|
|
|
const [data, setData] = React.useState<F>(
|
|
|
|
|
hydrated && _hasZustandHydrated ? result : (undefined as F)
|
|
|
|
|
)
|
2023-11-14 20:50:58 +00:00
|
|
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
|
|
setData(result)
|
|
|
|
|
}, [result])
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
}
|