@hisptz/react-ui
Version:
A collection of reusable complex DHIS2 react ui components.
173 lines (156 loc) • 5.07 kB
JavaScript
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 };