app-context.tsx 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. 'use client'
  2. import { createContext, useContext, useContextSelector } from 'use-context-selector'
  3. import type { App } from '@/types/app'
  4. import type { UserProfileResponse } from '@/models/common'
  5. import { createRef, FC, PropsWithChildren } from 'react'
  6. export const useSelector = <T extends any>(selector: (value: AppContextValue) => T): T =>
  7. useContextSelector(AppContext, selector);
  8. export type AppContextValue = {
  9. apps: App[]
  10. mutateApps: () => void
  11. userProfile: UserProfileResponse
  12. mutateUserProfile: () => void
  13. pageContainerRef: React.RefObject<HTMLDivElement>,
  14. useSelector: typeof useSelector,
  15. }
  16. const AppContext = createContext<AppContextValue>({
  17. apps: [],
  18. mutateApps: () => { },
  19. userProfile: {
  20. id: '',
  21. name: '',
  22. email: '',
  23. },
  24. mutateUserProfile: () => { },
  25. pageContainerRef: createRef(),
  26. useSelector,
  27. })
  28. export type AppContextProviderProps = PropsWithChildren<{
  29. value: Omit<AppContextValue, 'useSelector'>
  30. }>
  31. export const AppContextProvider: FC<AppContextProviderProps> = ({ value, children }) => (
  32. <AppContext.Provider value={{ ...value, useSelector }}>
  33. {children}
  34. </AppContext.Provider>
  35. )
  36. export const useAppContext = () => useContext(AppContext)
  37. export default AppContext