UNPKG

@hisptz/react-ui

Version:

A collection of reusable complex DHIS2 react ui components.

173 lines (156 loc) 5.07 kB
import { useDataEngine } from "@dhis2/app-runtime"; import { mapSeries } from "async-es"; import { flattenDeep, get, range, set } from "lodash"; import { useCallback, useEffect, useState } from "react"; import { OFFLINE_ORG_UNIT_PAGE_SIZE } from "../constants/config"; import { groupQuery, levelQuery, ouQuery } from "../constants/queries"; import { db } from "../services/db"; import { getPagination } from "../utils"; function sanitizeOrgUnitGroups(groups) { return groups.map(ou => { var _ou$organisationUnitG; return set(ou, "organisationUnitGroups", (_ou$organisationUnitG = ou.organisationUnitGroups) === null || _ou$organisationUnitG === void 0 ? void 0 : _ou$organisationUnitG.map(ouGroup => ouGroup.id)); }); } function useOrganisationUnitData(pageSize) { const [loading, setLoading] = useState(false); const engine = useDataEngine(); const getLevels = useCallback(async options => { var _pagination$pageCount; db.clearOrgUnitLevels(); const pagination = await getPagination(engine, levelQuery, { queryKey: "levels", options: { ...options, pageSize } }); const pageCount = (_pagination$pageCount = pagination.pageCount) !== null && _pagination$pageCount !== void 0 ? _pagination$pageCount : 0; if (pageCount > 0) { db.updateCount({ resource: "levels", key: "total", value: pageCount }); const levels = await mapSeries(range(1, pageCount + 1), async page => { const data = await engine.query(levelQuery, { variables: { ...options, page } }); db.updateCount({ resource: "levels", key: "page", value: page }); return get(data, ["levels", "organisationUnitLevels"]); }).then(flattenDeep); await db.addOrganisationUnitLevels(levels); } }, []); const getOrgUnits = useCallback(async options => { var _pagination$pageCount2; db.clearOrgUnits(); const pagination = await getPagination(engine, ouQuery, { queryKey: "ous", options: { pageSize } }); const pageCount = (_pagination$pageCount2 = pagination.pageCount) !== null && _pagination$pageCount2 !== void 0 ? _pagination$pageCount2 : 0; db.updateCount({ resource: "orgUnits", key: "total", value: pageCount }); if (pageCount > 0) { const groups = await mapSeries(range(1, pageCount + 1), async page => { const data = await engine.query(ouQuery, { variables: { ...options, page } }); db.updateCount({ resource: "orgUnits", key: "page", value: page }); return get(data, ["ous", "organisationUnits"]); }).then(flattenDeep); await db.addOrganisationUnits(sanitizeOrgUnitGroups(groups)); } }, []); const getGroups = useCallback(async options => { var _pagination$pageCount3; db.clearOrgUnitGroups(); const pagination = await getPagination(engine, groupQuery, { queryKey: "groups", options: { pageSize } }); const pageCount = (_pagination$pageCount3 = pagination.pageCount) !== null && _pagination$pageCount3 !== void 0 ? _pagination$pageCount3 : 0; db.updateCount({ resource: "groups", key: "total", value: pageCount }); if (pageCount > 0) { const groups = await mapSeries(range(1, pageCount + 1), async page => { const data = await engine.query(groupQuery, { variables: { ...options, page } }); db.updateCount({ resource: "groups", key: "page", value: page }); return get(data, ["groups", "organisationUnitGroups"]); }).then(flattenDeep); await db.addOrganisationUnitGroups(groups); } }, []); useEffect(() => { async function get() { setLoading(true); try { const hasLevels = await db.hasOrganisationUnitLevels(); const hasGroups = await db.hasOrganisationUnitGroups(); const hasOus = await db.hasOrganisationUnits(); if (!hasLevels) { await getLevels({ pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : OFFLINE_ORG_UNIT_PAGE_SIZE }); } if (!hasGroups) { await getGroups({ pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : OFFLINE_ORG_UNIT_PAGE_SIZE }); } if (!hasOus) { await getOrgUnits({ pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : OFFLINE_ORG_UNIT_PAGE_SIZE }); } } catch (e) { console.error(e); } setLoading(false); } get(); }, []); return { loading }; } function useClearOrganisationData() { return useCallback(async () => { try { await db.clear(); } catch (e) { console.error(e); } }, []); } export { useOrganisationUnitData, useClearOrganisationData };