import { createContext, useContext } from 'react'; import type { BaseEntity, BaseRemoteDataServices } from '@repo/core-api/data-services'; import type { ConfigSlice, DataServiceSlice, SelectionSlice, NavigationSlice, ModalSlice, TranslationSlice, } from '../entities/entity'; import { StandardPaginationMeta } from '../../../../../core-api/src/data-services/base-data.transformer'; // --------------------------------------------------------------------------- // Context Definitions // --------------------------------------------------------------------------- export const EnterpriseConfigContext = createContext | null>(null); export const EnterpriseDataServiceContext = createContext | null>(null); export const EnterpriseSelectionContext = createContext | null>(null); export const EnterpriseNavigationContext = createContext(null); export const EnterpriseModalContext = createContext(null); export const EnterpriseTranslationContext = createContext(null); // --------------------------------------------------------------------------- // Granular Hooks // --------------------------------------------------------------------------- export function useEnterpriseModuleConfigContext(): ConfigSlice { const context = useContext(EnterpriseConfigContext); if (!context) { throw new Error('useEnterpriseModuleConfigContext must be used within an EnterpriseModuleProvider'); } return context; } export function useEnterpriseModuleDataServiceContext< E extends BaseEntity = BaseEntity, S extends BaseRemoteDataServices = BaseRemoteDataServices, >(): DataServiceSlice { const context = useContext(EnterpriseDataServiceContext); if (!context) { throw new Error('useEnterpriseModuleDataServiceContext must be used within an EnterpriseModuleProvider'); } return context; } export function useEnterpriseModuleSelectionContext(): SelectionSlice< E, any, StandardPaginationMeta > { const context = useContext(EnterpriseSelectionContext); if (!context) { throw new Error('useEnterpriseModuleSelectionContext must be used within an EnterpriseModuleProvider'); } return context; } export function useEnterpriseModuleNavigationContext(): NavigationSlice { const context = useContext(EnterpriseNavigationContext); if (!context) { throw new Error('useEnterpriseModuleNavigationContext must be used within an EnterpriseModuleProvider'); } return context; } export function useEnterpriseModuleModalContext(): ModalSlice { const context = useContext(EnterpriseModalContext); if (!context) { throw new Error('useEnterpriseModuleModalContext must be used within an EnterpriseModuleProvider'); } return context; } export function useEnterpriseModuleTranslationContext(): TranslationSlice { const context = useContext(EnterpriseTranslationContext); if (!context) { throw new Error('useEnterpriseModuleTranslationContext must be used within an EnterpriseModuleProvider'); } return context; } // --------------------------------------------------------------------------- // Composed Hook (Use Sparingly) // --------------------------------------------------------------------------- export function useEnterpriseModuleContext() { return { ...useEnterpriseModuleConfigContext(), ...useEnterpriseModuleDataServiceContext(), ...useEnterpriseModuleSelectionContext(), ...useEnterpriseModuleNavigationContext(), ...useEnterpriseModuleModalContext(), ...useEnterpriseModuleTranslationContext(), }; }