Skip to content

Commit 050ff7f

Browse files
authored
Merge pull request #607 from bcgsc/feature/DEVSU-2581-Update-template-page-to-use-react-query
DEVSU-2581 Update TemplateView to use react-query
2 parents 9abcbaa + 43c9f8f commit 050ff7f

File tree

4 files changed

+221
-50
lines changed

4 files changed

+221
-50
lines changed

app/App.tsx

+22-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/**
22
* @module /App
33
*/
4+
import { QueryClientProvider, QueryClient } from 'react-query';
45
import { SnackbarProvider } from 'notistack';
56
import CssBaseline from '@mui/material/CssBaseline';
67
import { ThemeProvider, StyledEngineProvider } from '@mui/material/styles';
@@ -23,6 +24,16 @@ import '@ag-grid-community/core/dist/styles/ag-theme-material.min.css';
2324
import '@fontsource/roboto';
2425
import './styles/ag-grid.scss';
2526

27+
const queryClient = new QueryClient({
28+
defaultOptions: {
29+
queries: {
30+
staleTime: 15 * 60 * 1000, // 15m
31+
refetchOnWindowFocus: false,
32+
refetchOnMount: false,
33+
},
34+
},
35+
});
36+
2637
ModuleRegistry.registerModules([
2738
ClientSideRowModelModule,
2839
CsvExportModule,
@@ -42,15 +53,17 @@ function App() {
4253
return (
4354
<StyledEngineProvider injectFirst>
4455
<ThemeProvider theme={theme}>
45-
<SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>
46-
<SnackbarUtilsConfigurator />
47-
<CssBaseline />
48-
<BrowserRouter basename={basename}>
49-
<CacheBuster>
50-
<MainView />
51-
</CacheBuster>
52-
</BrowserRouter>
53-
</SnackbarProvider>
56+
<QueryClientProvider client={queryClient}>
57+
<SnackbarProvider anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}>
58+
<SnackbarUtilsConfigurator />
59+
<CssBaseline />
60+
<BrowserRouter basename={basename}>
61+
<CacheBuster>
62+
<MainView />
63+
</CacheBuster>
64+
</BrowserRouter>
65+
</SnackbarProvider>
66+
</QueryClientProvider>
5467
</ThemeProvider>
5568
</StyledEngineProvider>
5669
);

app/views/TemplateView/index.tsx

+31-26
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,39 @@
1-
import React, { useState, useEffect, useCallback } from 'react';
2-
import { useSnackbar } from 'notistack';
1+
import React, { useState, useCallback } from 'react';
2+
import { useQuery, useMutation, useQueryClient } from 'react-query';
3+
import snackbar from '@/services/SnackbarUtils';
34

45
import DataTable from '@/components/DataTable';
56
import api from '@/services/api';
67
import AddEditTemplate from './components/AddEditTemplate';
78
import columnDefs from './columnDefs';
89

10+
const fetchTemplates = async () => api.get('/templates', {}).request();
11+
12+
const deleteTemplate = async (ident: string) => {
13+
await api.del(`/templates/${ident}/signature-types`, {}, {}).request();
14+
return api.del(`/templates/${ident}`, {}, {}).request();
15+
};
16+
917
const TemplateView = (): JSX.Element => {
1018
const [showDialog, setShowDialog] = useState(false);
11-
const [templates, setTemplates] = useState([]);
1219
const [selectedRow, setSelectedRow] = useState();
20+
const queryClient = useQueryClient();
1321

14-
const snackbar = useSnackbar();
22+
const { data: templates = [] } = useQuery({
23+
queryKey: ['templates'],
24+
queryFn: fetchTemplates,
25+
});
1526

16-
useEffect(() => {
17-
const getData = async () => {
18-
const templatesResp = await api.get('/templates', {}).request();
19-
setTemplates(templatesResp);
20-
};
21-
getData();
22-
}, []);
27+
const deleteMutation = useMutation({
28+
mutationFn: deleteTemplate,
29+
onSuccess: () => {
30+
queryClient.invalidateQueries({ queryKey: ['templates'] });
31+
snackbar.success('Template deleted');
32+
},
33+
onError: (err) => {
34+
snackbar.error(`Error deleting template: ${err}`);
35+
},
36+
});
2337

2438
const handleEditStart = (rowData) => {
2539
setShowDialog(true);
@@ -31,28 +45,19 @@ const TemplateView = (): JSX.Element => {
3145
const handleDialogClose = useCallback((newData) => {
3246
setShowDialog(false);
3347
if (newData) {
34-
const templateIndex = templates.findIndex((template) => template.ident === newData.ident);
35-
if (templateIndex !== -1) {
36-
const newTemplates = [...templates];
37-
newTemplates[templateIndex] = newData;
38-
setTemplates(newTemplates);
39-
} else {
40-
setTemplates((prevVal) => [...prevVal, newData]);
41-
}
48+
queryClient.invalidateQueries({ queryKey: ['templates'] });
4249
}
4350
setSelectedRow(null);
44-
}, [templates]);
51+
}, [queryClient]);
4552

4653
const handleDelete = useCallback(async (rowData) => {
4754
try {
48-
await api.del(`/templates/${rowData.ident}/signature-types`, {}, {}).request();
49-
await api.del(`/templates/${rowData.ident}`, {}, {}).request();
50-
setTemplates((prevVal) => prevVal.filter((template) => template.ident !== rowData.ident));
51-
snackbar.enqueueSnackbar('Template deleted');
55+
deleteMutation.mutate(rowData.ident);
56+
snackbar.success('Template deleted');
5257
} catch (err) {
53-
snackbar.enqueueSnackbar(`Error deleting template: ${err}`);
58+
snackbar.error(`Error deleting template: ${err}`);
5459
}
55-
}, [snackbar]);
60+
}, [deleteMutation]);
5661

5762
return (
5863
<div>

0 commit comments

Comments
 (0)