import { JsonApiObject } from "json-api-normalizer"; import { useCallback } from "react"; import { useDispatch, useSelector } from "react-redux"; import { ApiActionHandler } from ".."; import { Dispatch } from "../interfaces/Dispatch"; import { JSONAModel } from "../interfaces/JSONAModel"; import { Operation } from "../interfaces/Operation"; import { RootState } from "../interfaces/RootState"; import { getTotalCount } from "../selectors/apiSelectors"; import { RequestMethod } from "../selectors/enums/RequestMethod"; import { JsonApiQuery } from "../services/JsonApiQuery/JsonApiQuery"; import { StateHelper } from "../services/StateHelper/StateHelper"; import { ExtractJSONAModel } from "../types/UtilityTypes"; export const useGetAllControlled = < T extends ApiActionHandler, F = ExtractJSONAModel >( apiActionHandler: T, jsonApiQuery?: JsonApiQuery, headers?: { [key: string]: string }, ): { operation: Operation; ids: string[]; collection: F[]; loading: boolean; count: number | undefined; getAll: () => Promise; } => { const dispatch: Dispatch = useDispatch(); const getAll = useCallback(() => { return new Promise((resolve, reject) => { dispatch(apiActionHandler.getAll(jsonApiQuery, headers)) .then((response) => { resolve(response?.data as JsonApiObject[]); }) .catch((e) => { reject(e); }); }); }, [apiActionHandler, dispatch, jsonApiQuery, headers]); const operation = apiActionHandler.operationUtility.getOperationGetAll( jsonApiQuery, ); const loading = useSelector((state: RootState) => { return StateHelper.getLoading(state, operation, RequestMethod.Get); }); const ids = useSelector((state: RootState) => { return StateHelper.getIdentifiers(state, operation, RequestMethod.Get); }); const collection = useSelector((state: RootState) => { return (apiActionHandler.apiSelector.getCollection( state, ids, ) as unknown) as F[]; }); const count = useSelector((state: RootState) => { return getTotalCount(state, operation); }); return { operation, ids, collection, loading, count, getAll, }; };