Skip to content

Commit

Permalink
Adjust api call to handle optional cancelToken
Browse files Browse the repository at this point in the history
  • Loading branch information
Ubuntu committed Jan 9, 2025
1 parent 426b582 commit 4732443
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 72 deletions.
22 changes: 15 additions & 7 deletions packages/circus-web-ui/src/pages/Preferences.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -232,19 +232,27 @@ const Preferences: React.FC<{}> = props => {
const showMessage = useShowMessage();
const [preferences, updatePreferences] = useUserPreferences();
const [settings, setSettings] = useState<UserPreferences | null>(preferences);
const loadSettings = useCallback(async () => {
const settings = await api('preferences');
setSettings(settings);
}, [api]);
const loadSettings = useCallback(
async (isMounted: boolean) => {
const settings = await api('preferences');
if (!isMounted) return;
setSettings(settings);
},
[api]
);

useEffect(() => {
loadSettings();
let isMounted = true;
loadSettings(isMounted);
return () => {
isMounted = false;
};
}, [loadSettings]);

const saveClick = async () => {
await updatePreferences(settings!);
showMessage('Your preference was saved.', 'success', { short: true });
loadSettings();
loadSettings(true);
};

if (settings === null) return <div />;
Expand Down Expand Up @@ -294,7 +302,7 @@ const Preferences: React.FC<{}> = props => {
<Button bsStyle="primary" onClick={saveClick}>
Save
</Button>
<Button bsStyle="link" onClick={loadSettings}>
<Button bsStyle="link" onClick={() => loadSettings(true)}>
Reset
</Button>
</p>
Expand Down
7 changes: 6 additions & 1 deletion packages/circus-web-ui/src/pages/admin/GroupAdmin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ const GroupAdmin: React.FC<any> = props => {
const api = useApi();

useEffect(() => {
let isMounted = true;
const didMount = async () => {
const domains = await api('admin/server-params/domains');
const privList = await api('admin/global-privileges');
Expand Down Expand Up @@ -97,7 +98,7 @@ const GroupAdmin: React.FC<any> = props => {
const pluginSelect: React.FC<any> = props => (
<PluginSelectorMultiple plugins={pluginOptions} {...props} />
);

if (!isMounted) return;
setEditorProperties([
[
{ key: 'groupName', caption: 'Group Name', editor: et.text() }, // 0
Expand Down Expand Up @@ -179,6 +180,10 @@ const GroupAdmin: React.FC<any> = props => {
]);
};
didMount();

return () => {
isMounted = false;
};
}, [api]);

if (!editorProperties) return <LoadingIndicator />;
Expand Down
26 changes: 17 additions & 9 deletions packages/circus-web-ui/src/pages/admin/PluginJobManagerAdmin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,23 @@ const PluginJobManagerAdmin: React.FC<{}> = props => {
const [status, setStatus] = useState<any>(null);
const api = useApi();

const refresh = useCallback(async () => {
setBusy(true);
const result = await api('admin/plugin-job-manager');
setBusy(false);
setStatus(result.status);
}, [api]);
const refresh = useCallback(
async (isMounted: boolean) => {
setBusy(true);
const result = await api('admin/plugin-job-manager');
if (!isMounted) return;
setBusy(false);
setStatus(result.status);
},
[api]
);

useEffect(() => {
refresh();
let isMounted = true;
refresh(isMounted);
return () => {
isMounted = false;
};
}, [refresh]);

const postSwitch = async (mode: string) => {
Expand All @@ -28,7 +36,7 @@ const PluginJobManagerAdmin: React.FC<{}> = props => {
method: 'put',
data: { status: mode }
});
await refresh();
await refresh(true);
} catch (e) {
setBusy(false);
}
Expand Down Expand Up @@ -66,7 +74,7 @@ const PluginJobManagerAdmin: React.FC<{}> = props => {
icon="refresh"
bsSize="large"
bsStyle="link"
onClick={refresh}
onClick={() => refresh(true)}
>
Refresh Status
</IconButton>
Expand Down
5 changes: 5 additions & 0 deletions packages/circus-web-ui/src/pages/admin/UserAdmin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ const UserAdmin: React.FC<any> = props => {
const api = useApi();

useEffect(() => {
let isMounted = true;
const load = async () => {
const groups = (await api('admin/groups?unlimited=1')).items as {
groupId: string;
Expand All @@ -75,6 +76,7 @@ const UserAdmin: React.FC<any> = props => {
}[];
const groupIdMap: any = {};
groups.forEach(g => (groupIdMap[g.groupId] = g.groupName));
if (!isMounted) return;
setEditorProperties([
{ caption: 'User Email', key: 'userEmail', editor: et.text() },
{ caption: 'Login Name', key: 'loginId', editor: et.text() },
Expand Down Expand Up @@ -124,6 +126,9 @@ const UserAdmin: React.FC<any> = props => {
]);
};
load();
return () => {
isMounted = false;
};
}, [api]);

if (!editorProperties || !listColumns) return <LoadingIndicator />;
Expand Down
5 changes: 5 additions & 0 deletions packages/circus-web-ui/src/pages/case-detail/CaseDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,13 @@ const CaseDetail: React.FC<{}> = () => {
}, [isUpdated]);

useEffect(() => {
let isMounted = true;
if (!caseId) {
throw new Error('caseId is missing.');
}
const loadCase = async () => {
const caseData = await api('cases/' + caseId);
if (!isMounted) return;
setTags(caseData.tags ?? []);
const project = accessibleProjects.find(
(p: { projectId: string }) => p.projectId === caseData.projectId
Expand Down Expand Up @@ -139,6 +141,9 @@ const CaseDetail: React.FC<{}> = () => {
);
};
loadCase();
return () => {
isMounted = false;
};
}, [accessibleProjects, api, caseId]); // should not re-render after mount

const [f, forceLoadRevision] = useReducer(x => x + 1, 0);
Expand Down
118 changes: 63 additions & 55 deletions packages/circus-web-ui/src/pages/plugin-job-detail/PluginJobDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { Link, useParams } from 'react-router-dom';
import { newSearch } from 'store/searches';
import styled from 'styled-components';
import { useApi } from 'utils/api';
import { CancelToken } from 'utils/cancelToken';
import useLoadData from 'utils/useLoadData';
import useLoginUser from 'utils/useLoginUser';
import useQuery from 'utils/useQuery';
Expand Down Expand Up @@ -169,65 +170,72 @@ const PluginJobDetail: React.FC<{}> = props => {
);
const dispatchForJobSearch = useDispatch();

const loadJob = useCallback(async () => {
setBusy(true);
try {
const job = (await api(`plugin-jobs/${jobId}`)) as Job;
const pluginData = (await api(`plugins/${job.pluginId}`)) as Plugin;
const seriesData: { [seriesUid: string]: any } = {};
const viewPersonalInfoFlag = memoizedAccessiblePlugins
.filter(p => p.roles.includes('viewPersonalInfo'))
.some(p => p.pluginId === job.pluginId);
for (const s of job.series) {
const seriesUid = s.seriesUid;
if (seriesUid in seriesData) continue;
seriesData[seriesUid] = await api(`series/${seriesUid}`);
if (!viewPersonalInfoFlag) {
delete seriesData[seriesUid].patientInfo;
const loadJob = useCallback(
async (token: CancelToken) => {
setBusy(true);
try {
const job = (await api(`plugin-jobs/${jobId}`, {}, token)) as Job;
const pluginData = (await api(
`plugins/${job.pluginId}`,
{},
token
)) as Plugin;
const seriesData: { [seriesUid: string]: any } = {};
const viewPersonalInfoFlag = memoizedAccessiblePlugins
.filter(p => p.roles.includes('viewPersonalInfo'))
.some(p => p.pluginId === job.pluginId);
for (const s of job.series) {
const seriesUid = s.seriesUid;
if (seriesUid in seriesData) continue;
seriesData[seriesUid] = await api(`series/${seriesUid}`, {}, token);
if (!viewPersonalInfoFlag) {
delete seriesData[seriesUid].patientInfo;
}
}
}
dispatch(
actions.reset({
feedbacks: job.feedbacks,
myUserEmail: user.userEmail,
preferMode: ['consensual', 'personal'].includes(initialMode)
? (initialMode as 'personal' | 'consensual')
: null
})
);

if (
job.series[0].seriesUid &&
seriesData[job.series[0].seriesUid].patientInfo
) {
const filter = {
'patientInfo.patientId':
seriesData[job.series[0].seriesUid].patientInfo.patientId
};

dispatchForJobSearch(
newSearch(api, 'relevantJobs', {
resource: { endPoint: 'plugin-jobs', primaryKey: 'jobId' },
filter,
condition: {},
sort: '{"createdAt":-1}'
dispatch(
actions.reset({
feedbacks: job.feedbacks,
myUserEmail: user.userEmail,
preferMode: ['consensual', 'personal'].includes(initialMode)
? (initialMode as 'personal' | 'consensual')
: null
})
);
}

return { job, pluginData, seriesData };
} finally {
setBusy(false);
}
}, [
api,
initialMode,
dispatch,
jobId,
user.userEmail,
memoizedAccessiblePlugins,
dispatchForJobSearch
]);
if (
job.series[0].seriesUid &&
seriesData[job.series[0].seriesUid].patientInfo
) {
const filter = {
'patientInfo.patientId':
seriesData[job.series[0].seriesUid].patientInfo.patientId
};

dispatchForJobSearch(
newSearch(api, 'relevantJobs', {
resource: { endPoint: 'plugin-jobs', primaryKey: 'jobId' },
filter,
condition: {},
sort: '{"createdAt":-1}'
})
);
}

return { job, pluginData, seriesData };
} finally {
if (!token.cancelled) setBusy(false);
}
},
[
api,
initialMode,
dispatch,
jobId,
user.userEmail,
memoizedAccessiblePlugins,
dispatchForJobSearch
]
);

const [jobData, , reloadJob] = useLoadData(loadJob);

Expand Down

0 comments on commit 4732443

Please sign in to comment.