@digital-ai/plugin-dai-release
Version:
Frontend functionalities for the dai-release backstage plugin
113 lines (110 loc) • 3.28 kB
JavaScript
import { useState, useRef } from 'react';
import { daiReleaseApiRef } from '../api/DaiReleaseApi.esm.js';
import '@backstage/errors';
import 'moment';
import { useApi } from '@backstage/core-plugin-api';
import useAsyncRetryWithSelectiveDeps from './stateSelectiveDeps.esm.js';
import { useDebouncedValue } from '../utils/helpers.esm.js';
function useWorkflowCatalog() {
const [page, setPage] = useState(0);
const [rowsPerPage, setRowsPerPage] = useState(15);
const [instance, setInstance] = useState("");
const [instanceList, setInstanceList] = useState([]);
const [data, setData] = useState([]);
const [hasMore, setHasMore] = useState(true);
const [loading, setLoading] = useState(false);
const [workflowSearch, setWorkflowSearch] = useState({
categories: [],
author: ""
});
const [searchInput, setSearchInput] = useState("");
const api = useApi(daiReleaseApiRef);
const debouncedInstance = useDebouncedValue(instance, 800);
const debouncedSearchAuthor = useDebouncedValue(workflowSearch.author, 800);
const debouncedSearchCategories = useDebouncedValue(
workflowSearch.categories,
800
);
const debouncedSearchInput = useDebouncedValue(searchInput, 500);
const abortControllerRef = useRef(null);
const { error } = useAsyncRetryWithSelectiveDeps(
// eslint-disable-next-line consistent-return
async () => {
try {
setLoading(true);
if (abortControllerRef.current) {
abortControllerRef.current.abort();
}
const abortController = new AbortController();
abortControllerRef.current = abortController;
if (debouncedInstance.trim() === "") {
return api.getInstanceList().then((dataVal) => {
setInstance(dataVal[0].name);
setInstanceList(dataVal);
setData([]);
setLoading(false);
});
}
const result = await api.getWorkflowCatalog(
page,
rowsPerPage,
debouncedSearchInput,
debouncedSearchCategories,
debouncedSearchAuthor,
debouncedInstance,
{ signal: abortController.signal }
);
if (!abortController.signal.aborted) {
if (result?.workflows?.length < rowsPerPage) {
setHasMore(false);
}
setData((prevData) => [
...prevData,
...result?.workflows.filter(
(wf) => !prevData.some((p) => p.id === wf.id)
)
]);
return result;
}
} catch (err) {
const abortError = err;
if (abortError.name !== "AbortError") {
setData([]);
throw err;
}
} finally {
setLoading(false);
}
},
page,
setPage,
[
api,
rowsPerPage,
debouncedInstance,
debouncedSearchCategories,
debouncedSearchAuthor,
debouncedSearchInput
]
);
return {
loading,
hasMore,
setLoading,
data,
error,
instance,
instanceList,
searchInput,
setSearchInput,
workflowSearch,
setWorkflowSearch,
setPage,
setRowsPerPage,
setInstance,
setHasMore,
setData
};
}
export { useWorkflowCatalog };
//# sourceMappingURL=useWorkflowCatalog.esm.js.map