Skip to content

Commit

Permalink
refactor/move process hook
Browse files Browse the repository at this point in the history
  • Loading branch information
dauglyon committed Apr 15, 2024
1 parent 5b7b020 commit 7a6f89c
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 50 deletions.
37 changes: 0 additions & 37 deletions src/common/hooks.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { QueryDefinition } from '@reduxjs/toolkit/dist/query';
import { UseQueryHookResult } from '@reduxjs/toolkit/dist/query/react/buildHooks';
import { useCallback, useEffect, useRef, useState } from 'react';
import { toast } from 'react-hot-toast';
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';
import { useLocation, useNavigate } from 'react-router-dom';
import type { RootState, AppDispatch } from '../app/store';
Expand All @@ -11,7 +10,6 @@ import {
isValidParam,
setParams,
} from '../features/params/paramsSlice';
import { ProcessState } from './api/collectionsApi';

declare global {
interface Window {
Expand Down Expand Up @@ -63,41 +61,6 @@ export const useBackoffPolling = <
return result;
};

export const useProcessStatePolling = <
StateKey extends string,
Result extends { [processStateKey in StateKey]: ProcessState },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
R extends UseQueryHookResult<QueryDefinition<unknown, any, any, Result>>
>(
result: R,
processStateKeys: StateKey[],
options?: { baseInterval?: number; rate?: number; skipPoll?: boolean }
) => {
useBackoffPolling<R>(
result,
(result) => {
for (let i = 0; i < processStateKeys.length; i++) {
const processStateKey = processStateKeys[i];
if (result.error || !result.data?.[processStateKey]) return false;
if (result.data[processStateKey] === 'processing') {
continue;
} else if (result.data[processStateKey] === 'complete') {
return false;
} else if (result.data[processStateKey] === 'failed') {
toast('ProcessState Polling Failed, see console for more info');
// eslint-disable-next-line no-console
console.error('ProcessState Polling Failed', { result });
return false;
} else {
return false;
}
}
return true;
},
options
);
};

export const ignoredParameterWarning = (ignored: string[]) =>
`Ignored parameters: ${ignored.join(', ')}`;

Expand Down
4 changes: 2 additions & 2 deletions src/features/collections/MatchModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,14 @@ import { listObjects } from '../../common/api/workspaceApi';
import { getNarratives } from '../../common/api/searchApi';
import { parseError } from '../../common/api/utils/parseError';
import { useUpdateAppParams } from '../params/hooks';
import { useAppDispatch, useProcessStatePolling } from '../../common/hooks';
import { useAppDispatch } from '../../common/hooks';
import {
setLocalSelection,
useCurrentSelection,
useMatchId,
} from './collectionsSlice';
import { store } from '../../app/store';
import { useParamsForNarrativeDropdown } from './hooks';
import { useParamsForNarrativeDropdown, useProcessStatePolling } from './hooks';
import { MatcherUserParams } from './MatcherUserParams';
import Ajv from 'ajv';
import { Modal, useModalControls } from '../layout/Modal';
Expand Down
7 changes: 2 additions & 5 deletions src/features/collections/collectionsSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,9 @@ import {
getSelection,
} from '../../common/api/collectionsApi';
import { parseError } from '../../common/api/utils/parseError';
import {
useAppDispatch,
useAppSelector,
useProcessStatePolling,
} from '../../common/hooks';
import { useAppDispatch, useAppSelector } from '../../common/hooks';
import { useAppParam } from '../params/hooks';
import { useProcessStatePolling } from './hooks';

interface SelectionState {
current: string[];
Expand Down
3 changes: 2 additions & 1 deletion src/features/collections/data_products/Biolog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,12 @@ import {
import { parseError } from '../../../common/api/utils/parseError';
import { DataViewLink } from '../../../common/components';
import { Pagination, usePageBounds } from '../../../common/components/Table';
import { useAppDispatch, useProcessStatePolling } from '../../../common/hooks';
import { useAppDispatch } from '../../../common/hooks';
import { formatNumber } from '../../../common/utils/stringUtils';
import { useAppParam } from '../../params/hooks';
import classes from '../Collections.module.scss';
import { useGenerateSelectionId } from '../collectionsSlice';
import { useProcessStatePolling } from '../hooks';
import { HeatMap, HeatMapCallback, MAX_HEATMAP_PAGE } from './HeatMap';

export const Biolog: FC<{
Expand Down
3 changes: 2 additions & 1 deletion src/features/collections/data_products/Microtrait.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ import {
import { parseError } from '../../../common/api/utils/parseError';
import { DataViewLink } from '../../../common/components';
import { Pagination, usePageBounds } from '../../../common/components/Table';
import { useAppDispatch, useProcessStatePolling } from '../../../common/hooks';
import { useAppDispatch } from '../../../common/hooks';
import { formatNumber } from '../../../common/utils/stringUtils';
import classes from '../Collections.module.scss';
import { useMatchId, useGenerateSelectionId } from '../collectionsSlice';
import { useProcessStatePolling } from '../hooks';
import { HeatMap, HeatMapCallback, MAX_HEATMAP_PAGE } from './HeatMap';

const getUPAFromEncoded = (encoded: string) => encoded.replaceAll('_', '/');
Expand Down
4 changes: 2 additions & 2 deletions src/features/collections/data_products/SampleAttribs.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
usePageBounds,
useTableColumns,
} from '../../../common/components/Table';
import { useAppDispatch, useProcessStatePolling } from '../../../common/hooks';
import { useAppDispatch } from '../../../common/hooks';
import {
clearAllFilters,
setFilter,
Expand All @@ -31,7 +31,7 @@ import classes from './../Collections.module.scss';
import { Alert, Grid, Paper, PaperProps, Stack, Link } from '@mui/material';
import { formatNumber } from '../../../common/utils/stringUtils';
import { filterContextMode, useFilterContexts } from '../Filters';
import { useTableViewParams } from '../hooks';
import { useProcessStatePolling, useTableViewParams } from '../hooks';

export const SampleAttribs: FC<{
collection_id: string;
Expand Down
2 changes: 1 addition & 1 deletion src/features/collections/data_products/TaxaCount.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import {
} from '../../../common/api/collectionsApi';
import { Loader } from '../../../common/components/Loader';
import { Select, SelectOption } from '../../../common/components/Select';
import { useProcessStatePolling } from '../../../common/hooks';
import { snakeCaseToHumanReadable } from '../../../common/utils/stringUtils';
import { useMatchId, useSelectionId } from '../collectionsSlice';
import classes from './TaxaCount.module.scss';
import { Paper, PaperProps, Stack } from '@mui/material';
import { useFilterContexts } from '../Filters';
import { useProcessStatePolling } from '../hooks';

export const TaxaCount: FC<{
collection_id: string;
Expand Down
41 changes: 40 additions & 1 deletion src/features/collections/hooks.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { QueryDefinition } from '@reduxjs/toolkit/dist/query';
import { UseQueryHookResult } from '@reduxjs/toolkit/dist/query/react/buildHooks';
import { useMemo } from 'react';
import { toast } from 'react-hot-toast';
import { ProcessState } from '../../common/api/collectionsApi';
import { getNarratives } from '../../common/api/searchApi';
import { useAppSelector } from '../../common/hooks';
import { useAppSelector, useBackoffPolling } from '../../common/hooks';
import {
FilterContext,
useFilters,
Expand Down Expand Up @@ -90,3 +94,38 @@ export const useTableViewParams = (
]
);
};

export const useProcessStatePolling = <
StateKey extends string,
Result extends { [processStateKey in StateKey]: ProcessState },
// eslint-disable-next-line @typescript-eslint/no-explicit-any
R extends UseQueryHookResult<QueryDefinition<unknown, any, any, Result>>
>(
result: R,
processStateKeys: StateKey[],
options?: { baseInterval?: number; rate?: number; skipPoll?: boolean }
) => {
useBackoffPolling<R>(
result,
(result) => {
for (let i = 0; i < processStateKeys.length; i++) {
const processStateKey = processStateKeys[i];
if (result.error || !result.data?.[processStateKey]) return false;
if (result.data[processStateKey] === 'processing') {
continue;
} else if (result.data[processStateKey] === 'complete') {
return false;
} else if (result.data[processStateKey] === 'failed') {
toast('ProcessState Polling Failed, see console for more info');
// eslint-disable-next-line no-console
console.error('ProcessState Polling Failed', { result });
return false;
} else {
return false;
}
}
return true;
},
options
);
};

0 comments on commit 7a6f89c

Please sign in to comment.