Skip to content

Commit f05c530

Browse files
Show refresh warning when user switch team project in another tab (#1665)
* add team project change warning and trigger * fix: close popup on submit and always show warning modal in other tab --------- Co-authored-by: pieterlukasse <pieterlukasse@gmail.com>
1 parent 1f5336f commit f05c530

File tree

3 files changed

+109
-1
lines changed

3 files changed

+109
-1
lines changed

src/Analysis/SharedUtils/TeamProject/TeamProjectHeader/TeamProjectHeader.jsx

+36
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react';
22
import PropTypes from 'prop-types';
33
import { useHistory } from 'react-router-dom';
44
import { useQuery } from 'react-query';
5+
import { BroadcastChannel } from 'broadcast-channel';
56
import EditIcon from './Icons/EditIcon';
67
import isEnterOrSpace from '../../AccessibilityUtils/IsEnterOrSpace';
78
import TeamProjectModal from '../TeamProjectModal/TeamProjectModal';
@@ -28,6 +29,26 @@ const TeamProjectHeader = ({ isEditable }) => {
2829
}
2930
};
3031

32+
const channel = new BroadcastChannel('teamProjectChannel');
33+
34+
const [isWarningModalOpen, setIsWarningModalOpen] = useState(false);
35+
const showWarningModal = () => {
36+
setIsWarningModalOpen(true);
37+
};
38+
39+
useEffect(() => {
40+
const handleMessage = () => {
41+
showWarningModal();
42+
};
43+
44+
channel.onmessage = handleMessage;
45+
46+
// Clean up the channel when the component unmounts
47+
return () => {
48+
channel.close();
49+
};
50+
}, [channel, showWarningModal]);
51+
3152
const { data, status } = useQuery(
3253
'teamprojects',
3354
fetchArboristTeamProjectRoles,
@@ -76,11 +97,26 @@ const TeamProjectHeader = ({ isEditable }) => {
7697
</button>
7798
)}
7899
</div>
100+
{isWarningModalOpen && (
101+
<TeamProjectModal
102+
isModalOpen={isModalOpen}
103+
setIsModalOpen={setIsModalOpen}
104+
setBannerText={setBannerText}
105+
isWarningModalOpen={isWarningModalOpen}
106+
setIsWarningModalOpen={setIsWarningModalOpen}
107+
data={data}
108+
status={status}
109+
selectedTeamProject={selectedTeamProject}
110+
setSelectedTeamProject={setSelectedTeamProject}
111+
/>
112+
)}
79113
{isEditable && (
80114
<TeamProjectModal
81115
isModalOpen={isModalOpen}
82116
setIsModalOpen={setIsModalOpen}
83117
setBannerText={setBannerText}
118+
isWarningModalOpen={isWarningModalOpen}
119+
setIsWarningModalOpen={setIsWarningModalOpen}
84120
data={data}
85121
status={status}
86122
selectedTeamProject={selectedTeamProject}

src/Analysis/SharedUtils/TeamProject/TeamProjectModal/TeamProjectModal.jsx

+45
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,42 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import { useHistory } from 'react-router-dom';
44
import { Button, Modal, Spin } from 'antd';
5+
import { BroadcastChannel } from 'broadcast-channel';
56
import LoadingErrorMessage from '../../LoadingErrorMessage/LoadingErrorMessage';
67
import TeamsDropdown from './TeamsDropdown/TeamsDropdown';
78
import './TeamProjectModal.css';
89

10+
911
const TeamProjectModal = ({
1012
isModalOpen,
1113
setIsModalOpen,
14+
isWarningModalOpen,
15+
setIsWarningModalOpen,
1216
setBannerText,
1317
data,
1418
status,
1519
selectedTeamProject,
1620
setSelectedTeamProject,
1721
}) => {
1822
const history = useHistory();
23+
24+
const channel = new BroadcastChannel('teamProjectChannel');
25+
const sendMessage = (msg) => {
26+
channel.postMessage(msg);
27+
};
28+
1929
const closeAndUpdateTeamProject = () => {
2030
setIsModalOpen(false);
31+
sendMessage('Team Project Changed!');
2132
setBannerText(selectedTeamProject);
2233
localStorage.setItem('teamProject', selectedTeamProject);
2334
};
35+
36+
const closeWarningAndRefreshPage = () => {
37+
setIsWarningModalOpen(false);
38+
window.location.reload();
39+
};
40+
2441
const redirectToHomepage = () => {
2542
history.push('/');
2643
};
@@ -42,6 +59,32 @@ const TeamProjectModal = ({
4259
</Modal>
4360
);
4461
}
62+
if (isWarningModalOpen === true) {
63+
return (
64+
<Modal
65+
open={isWarningModalOpen}
66+
className='team-project-modal'
67+
title='Team Projects'
68+
closable
69+
maskClosable={false}
70+
keyboard={false}
71+
footer={[
72+
<Button
73+
key='submit'
74+
type='primary'
75+
disabled={!selectedTeamProject}
76+
onClick={() => closeWarningAndRefreshPage()}
77+
>
78+
Refresh Page
79+
</Button>,
80+
]}
81+
>
82+
<div className='team-project-modal_modal-description'>
83+
Team Project has been updated in another tab. Please click refresh page to prevent errors.
84+
</div>
85+
</Modal>
86+
);
87+
}
4588
if (data) {
4689
if (data.teams.length > 0) {
4790
return (
@@ -119,6 +162,8 @@ const TeamProjectModal = ({
119162
TeamProjectModal.propTypes = {
120163
isModalOpen: PropTypes.bool.isRequired,
121164
setIsModalOpen: PropTypes.func.isRequired,
165+
isWarningModalOpen: PropTypes.bool.isRequired,
166+
setIsWarningModalOpen: PropTypes.func.isRequired,
122167
setBannerText: PropTypes.func.isRequired,
123168
data: PropTypes.object,
124169
status: PropTypes.string.isRequired,

src/Analysis/SharedUtils/TeamProject/TeamProjectModal/TeamProjectModal.test.jsx

+28-1
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,16 @@ const testTeamName = TeamProjectTestData.data.teams[0].teamName;
1313
const setIsModalOpen = jest.fn();
1414
const setBannerText = jest.fn();
1515
const setSelectedTeamProject = jest.fn();
16+
const setIsWarningModalOpen = jest.fn();
1617

1718
describe('TeamProjectModal', () => {
1819
test('renders with loading text initially', async () => {
1920
render(
2021
<TeamProjectModal
2122
isModalOpen
2223
setIsModalOpen={setIsModalOpen}
24+
isWarningModalOpen={false}
25+
setIsWarningModalOpen={setIsWarningModalOpen}
2326
setBannerText={setBannerText}
2427
data={undefined}
2528
status='loading'
@@ -40,6 +43,8 @@ describe('TeamProjectModal', () => {
4043
<TeamProjectModal
4144
isModalOpen
4245
setIsModalOpen={setIsModalOpen}
46+
isWarningModalOpen={false}
47+
setIsWarningModalOpen={setIsWarningModalOpen}
4348
setBannerText={setBannerText}
4449
data={TeamProjectTestData.data}
4550
status='success'
@@ -67,6 +72,8 @@ describe('TeamProjectModal', () => {
6772
<TeamProjectModal
6873
isModalOpen
6974
setIsModalOpen={setIsModalOpen}
75+
isWarningModalOpen={false}
76+
setIsWarningModalOpen={setIsWarningModalOpen}
7077
setBannerText={setBannerText}
7178
data={TeamProjectTestData.data}
7279
status='success'
@@ -93,6 +100,8 @@ describe('TeamProjectModal', () => {
93100
isModalOpen
94101
setIsModalOpen={setIsModalOpen}
95102
setBannerText={setBannerText}
103+
isWarningModalOpen={false}
104+
setIsWarningModalOpen={setIsWarningModalOpen}
96105
data={TeamProjectTestData.data}
97106
status='success'
98107
selectedTeamProject={testTeamName}
@@ -106,7 +115,25 @@ describe('TeamProjectModal', () => {
106115
fireEvent.click(submitButton);
107116

108117
// Assert that the modal closes and sets banner text
109-
expect(setIsModalOpen).toHaveBeenCalledWith(false);
110118
expect(setBannerText).toHaveBeenCalledWith(testTeamName);
111119
});
120+
121+
test('Render warning modal based ', async () => {
122+
render(
123+
<TeamProjectModal
124+
isModalOpen
125+
setIsModalOpen={setIsModalOpen}
126+
setBannerText={setBannerText}
127+
isWarningModalOpen
128+
setIsWarningModalOpen={setIsWarningModalOpen}
129+
data={TeamProjectTestData.data}
130+
status='success'
131+
selectedTeamProject={testTeamName}
132+
setSelectedTeamProject={setSelectedTeamProject}
133+
/>,
134+
);
135+
136+
// Assert that the modal closes and sets banner text
137+
expect(screen.getByText('Refresh Page')).toBeInTheDocument();
138+
});
112139
});

0 commit comments

Comments
 (0)