Law/app/web/admin/hooks/useAdminCatalogLoaders.js
2026-02-26 18:55:02 +03:00

82 lines
2.6 KiB
JavaScript

import { normalizeReferenceMeta } from "../shared/utils.js";
export function useAdminCatalogLoaders({ api, setStatus, setTableState, setReferenceRowsMap, buildUniversalQuery }) {
const { useCallback } = React;
const loadAvailableTables = useCallback(
async (tokenOverride) => {
setStatus("availableTables", "Загрузка...", "");
try {
const data = await api("/api/admin/crud/meta/available-tables", {}, tokenOverride);
const rows = Array.isArray(data.rows) ? data.rows : [];
setTableState("availableTables", {
filters: [],
sort: null,
offset: 0,
total: rows.length,
showAll: true,
rows,
});
setStatus("availableTables", "Список обновлен", "ok");
return true;
} catch (error) {
setStatus("availableTables", "Ошибка: " + error.message, "error");
return false;
}
},
[api, setStatus, setTableState]
);
const loadReferenceRows = useCallback(
async (catalogRows, tokenOverride) => {
const rows = Array.isArray(catalogRows) ? catalogRows : [];
const byTable = {};
rows.forEach((item) => {
const table = String(item?.table || "");
if (!table) return;
byTable[table] = item;
});
const references = new Set();
rows.forEach((item) => {
(item?.columns || []).forEach((column) => {
const meta = normalizeReferenceMeta(column?.reference);
if (meta?.table) references.add(meta.table);
});
});
if (!references.size) {
setReferenceRowsMap({});
return;
}
const nextMap = {};
await Promise.all(
Array.from(references.values()).map(async (table) => {
const meta = byTable[table];
const endpoint = String(meta?.query_endpoint || ("/api/admin/crud/" + table + "/query"));
const sort = Array.isArray(meta?.default_sort) && meta.default_sort.length ? meta.default_sort : [{ field: "created_at", dir: "desc" }];
try {
const data = await api(
endpoint,
{
method: "POST",
body: buildUniversalQuery([], sort, 500, 0),
},
tokenOverride
);
nextMap[table] = Array.isArray(data?.rows) ? data.rows : [];
} catch (_) {
nextMap[table] = [];
}
})
);
setReferenceRowsMap(nextMap);
},
[api, buildUniversalQuery, setReferenceRowsMap]
);
return {
loadAvailableTables,
loadReferenceRows,
};
}
export default useAdminCatalogLoaders;