import { createContext, useContext, useCallback, ReactNode } from 'react'; import { overlayHeldBundle } from '../utils/writeThroughHold'; import { ActivityDefinition, Bundle } from 'fhir/r4'; import { environment } from '../environments/environment'; import { useHttpService } from './HttpService.tsx'; import { fetchAllPagesAsBundle } from '../utils/fetchAllPagesAsBundle'; import { searchPageSize } from '../utils/pageSizeOverride'; const API_URL = environment.fhirClinicalApi; export const useActivityDefinitionService = () => { const { get, post, put, delete: del } = useHttpService(); const fetchActivityDefinitions = useCallback(async (): Promise> => { // Server scopes the result to the caller's organization via the X-Organization-ID header. // The list is the whole practice, and the hold is emptied when the practice changes. return overlayHeldBundle('ActivityDefinition', await fetchAllPagesAsBundle((pageParam) => { const params = new URLSearchParams(); params.append('_count', searchPageSize('100')); if (pageParam) params.set('page', pageParam); return get>(`${API_URL}/ActivityDefinition?${params.toString()}`); }), () => true) as Bundle; }, [get]); const createActivityDefinition = useCallback(async (resource: ActivityDefinition): Promise => { return post(`${API_URL}/ActivityDefinition`, resource); }, [post]); const updateActivityDefinition = useCallback(async (resource: ActivityDefinition): Promise => { return put(`${API_URL}/ActivityDefinition/${resource.id}`, resource); }, [put]); const deleteActivityDefinition = useCallback(async (resource: ActivityDefinition): Promise => { await del(`${API_URL}/ActivityDefinition/${resource.id}`); }, [del]); return { fetchActivityDefinitions, createActivityDefinition, updateActivityDefinition, deleteActivityDefinition }; }; const ActivityDefinitionServiceContext = createContext | undefined>(undefined); export const ActivityDefinitionServiceProvider: React.FC<{ children: ReactNode }> = ({ children }) => { const service = useActivityDefinitionService(); return ( {children} ); }; export const useActivityDefinitionServiceContext = () => { const context = useContext(ActivityDefinitionServiceContext); if (context === undefined) { throw new Error('useActivityDefinitionServiceContext must be used within an ActivityDefinitionServiceProvider'); } return context; };