Skip to content

Commit

Permalink
UIIN-1902: Fetch parent and child sub instances in one query (#1621)
Browse files Browse the repository at this point in the history
* UIIN-1902: Fetch parent and child sub instances in one query
  • Loading branch information
mkuklis committed Mar 9, 2022
1 parent 6c1b77d commit 136d28a
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 21 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
## [9.1.0] IN PROGRESS
* The highlight of search results is not specific to the given search but now highlight all kinds of data in the record. Refs UIIN-1454.

* Fetch parent and child sub instances in one query. Fixes UIIN-1902.

## [9.0.0](https://github.com/folio-org/ui-inventory/tree/v9.0.0) (2022-03-03)
[Full Changelog](https://github.com/folio-org/ui-inventory/compare/v8.0.0...v9.0.0)

Expand Down
2 changes: 1 addition & 1 deletion src/Instance/InstanceEdit/InstanceEdit.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const InstanceEdit = ({
stripes,
mutator,
}) => {
const { identifierTypesById, identifierTypesByName } = referenceData;
const { identifierTypesById, identifierTypesByName } = referenceData ?? {};
const [httpError, setHttpError] = useState();
const [initialValues, setInitialValues] = useState();
const callout = useCallout();
Expand Down
12 changes: 6 additions & 6 deletions src/hooks/useInstancesQuery.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { useQueries } from 'react-query';
import { useQuery } from 'react-query';

import { useOkapiKy } from '@folio/stripes/core';
import { useOkapiKy, useNamespace } from '@folio/stripes/core';

// Fetches and returns multiple instances for given instance ids
const useInstancesQuery = (ids = []) => {
const ky = useOkapiKy();
const query = ids.map(id => `id==${id}`).join(' OR ');
const [queryKey] = useNamespace({ key: 'sub-instance' });
const queryFn = () => ky.get('inventory/instances', { searchParams: { query } }).json();

return useQueries(ids.map(id => ({
queryKey: ['ui-inventory', 'instances', id],
queryFn: () => ky.get(`inventory/instances/${id}`).json(),
})));
return useQuery([queryKey, query], queryFn, { enabled: query.length > 0 });
};

export default useInstancesQuery;
5 changes: 3 additions & 2 deletions src/hooks/useInstancesQuery.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ describe('useInstancesQuery', () => {

it('fetches instances', async () => {
const { result, waitFor } = renderHook(() => useInstancesQuery([instance.id]), { wrapper });
await waitFor(() => result.current[0].isSuccess);
expect(result.current[0].data.id).toEqual(instance.id);

await waitFor(() => result.isSuccess);
expect(result.current.data.id).toEqual(instance.id);
});
});
23 changes: 11 additions & 12 deletions src/hooks/useLoadSubInstances.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,16 @@ import useInstancesQuery from './useInstancesQuery';
const useLoadSubInstances = (instanceIds = [], subId) => {
const instanstcesById = keyBy(instanceIds, subId);
const [subInstances, setSubInstances] = useState([]);
const results = useInstancesQuery(instanceIds.map(inst => inst[subId]));
const allLoaded = results.reduce((acc, { isSuccess }) => (isSuccess && acc), true);
const { isSuccess, data: results } = useInstancesQuery(instanceIds.map(inst => inst[subId]));

const instances = flow(
items => filter(items, ({ data }) => data),
items => filter(items, instance => instance),
items => map(items, ({
data: {
id,
title,
hrid,
publication,
identifiers,
},
id,
title,
hrid,
publication,
identifiers,
}) => ({
...instanstcesById[id],
title,
Expand All @@ -38,8 +36,9 @@ const useLoadSubInstances = (instanceIds = [], subId) => {
identifiers,
})),
items => sortBy(items, 'title')
)(results);
const shouldUpdateSubInstances = allLoaded && !isEqual(subInstances, instances);
)(results?.instances);

const shouldUpdateSubInstances = isSuccess && !isEqual(subInstances, instances);

useEffect(() => {
if (shouldUpdateSubInstances) {
Expand Down

0 comments on commit 136d28a

Please sign in to comment.