Skip to content

Commit aa8c36a

Browse files
committed
2024-11-20 - Feedback confirmation page
1 parent 1ee2918 commit aa8c36a

File tree

6 files changed

+186
-2
lines changed

6 files changed

+186
-2
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
.submit-confirmation {
2+
width: 100%;
3+
height: 100%;
4+
display: flex;
5+
flex-direction: column;
6+
justify-content: center;
7+
align-content: center;
8+
align-items: center;
9+
padding-top: 40px;
10+
overflow-x: hidden;
11+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import React, { useContext, useEffect, useRef, useState } from 'react';
2+
import { styled } from '@mui/material/styles';
3+
import Typography from '@mui/material/Typography';
4+
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
5+
import {
6+
selectCsrfToken,
7+
selectCurrentUser,
8+
selectProfile,
9+
selectHasCreateFeedbackPermission,
10+
noPermission,
11+
} from '../../context/selectors';
12+
import { AppContext } from '../../context/AppContext';
13+
import { useLocation } from 'react-router-dom';
14+
import queryString from 'query-string';
15+
import './FeedbackSubmitConfirmation.css';
16+
import { green } from '@mui/material/colors';
17+
import {getFeedbackRequestById, getRequesteeForFeedbackRequest} from '../../api/feedback';
18+
19+
const PREFIX = 'FeedbackSubmitConfirmation';
20+
const classes = {
21+
announcement: `${PREFIX}-announcement`
22+
};
23+
24+
const Root = styled('div')({
25+
[`& .${classes.announcement}`]: {
26+
textAlign: 'center',
27+
['@media (max-width:820px)']: {
28+
// eslint-disable-line no-useless-computed-key
29+
fontSize: 'x-large'
30+
}
31+
}
32+
});
33+
34+
const FeedbackSubmitConfirmation = props => {
35+
const { state } = useContext(AppContext);
36+
const location = useLocation();
37+
const query = queryString.parse(location?.search);
38+
const csrf = selectCsrfToken(state);
39+
const currentUserId = selectCurrentUser(state)?.id;
40+
const requestQuery = query.request?.toString();
41+
const [feedbackRequest, setFeedbackRequest] = useState(null);
42+
const feedbackRequestFetched = useRef(false);
43+
44+
const [requestee, setRequestee] = useState(null);
45+
46+
useEffect(() => {
47+
async function getFeedbackRequest(cookie) {
48+
if (!currentUserId || !cookie || feedbackRequestFetched.current) {
49+
return null;
50+
}
51+
52+
// make call to the API
53+
let res = await getFeedbackRequestById(requestQuery, cookie);
54+
return res.payload &&
55+
res.payload.data &&
56+
res.payload.status === 200 &&
57+
!res.error
58+
? res.payload.data
59+
: null;
60+
}
61+
62+
if (csrf && currentUserId && requestQuery && !feedbackRequestFetched.current) {
63+
getFeedbackRequest(csrf).then(request => {
64+
if (request) {
65+
setFeedbackRequest(request);
66+
}
67+
});
68+
}
69+
}, [csrf, currentUserId, requestQuery]);
70+
71+
useEffect(() => {
72+
console.log("FeedbackSubmitConfirmation, useEffect[feedbackRequest, state], feedbackRequest: ", feedbackRequest);
73+
74+
if (feedbackRequest) {
75+
feedbackRequestFetched.current = true;
76+
}
77+
78+
if (feedbackRequestFetched.current) {
79+
getRequesteeForFeedbackRequest(feedbackRequest?.requesteeId, csrf).then(response => {
80+
if (response.payload && response.payload.data && !response.error) {
81+
setRequestee(response.payload.data);
82+
}
83+
});
84+
}
85+
}, [feedbackRequest, state]);
86+
87+
return (
88+
<Root className="submit-confirmation">
89+
<CheckCircleIcon style={{ color: green[500], fontSize: '40vh' }}>
90+
checkmark-image
91+
</CheckCircleIcon>
92+
<Typography className={classes.announcement} variant="h3">
93+
Thank you for your feedback on <b>{requestee?.name}</b>
94+
</Typography>
95+
</Root>
96+
);
97+
};
98+
99+
export default FeedbackSubmitConfirmation;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import { BrowserRouter } from 'react-router-dom';
3+
import { AppContextProvider } from '../../context/AppContext';
4+
import FeedbackSubmitConfirmation from './FeedbackSubmitConfirmation';
5+
6+
const userStateWithPermission = {
7+
state: {
8+
userProfile: {
9+
name: 'john watson',
10+
role: ['MEMBER'],
11+
permissions: [{ permission: 'CAN_CREATE_FEEDBACK_REQUEST' }],
12+
}
13+
}
14+
};
15+
16+
it('renders the confirmation message', () => {
17+
snapshot(
18+
<BrowserRouter>
19+
<AppContextProvider value={userStateWithPermission}>
20+
<FeedbackSubmitConfirmation />
21+
</AppContextProvider>
22+
</BrowserRouter>
23+
);
24+
});
25+
26+
it('renders an error if user does not have appropriate permission', () => {
27+
snapshot(
28+
<BrowserRouter>
29+
<AppContextProvider>
30+
<FeedbackSubmitConfirmation />
31+
</AppContextProvider>
32+
</BrowserRouter>
33+
);
34+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2+
3+
exports[`renders an error if user does not have appropriate permission 1`] = `
4+
<div>
5+
<h3>
6+
You do not have permission to view this page.
7+
</h3>
8+
</div>
9+
`;
10+
11+
exports[`renders the confirmation message 1`] = `
12+
<div>
13+
<div
14+
class="submit-confirmation css-7zlo4e"
15+
>
16+
<svg
17+
aria-hidden="true"
18+
class="MuiSvgIcon-root MuiSvgIcon-fontSizeMedium css-i4bv87-MuiSvgIcon-root"
19+
data-testid="CheckCircleIcon"
20+
focusable="false"
21+
style="color: rgb(76, 175, 80); font-size: 40vh;"
22+
viewBox="0 0 24 24"
23+
>
24+
<path
25+
d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m-2 15-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8z"
26+
/>
27+
</svg>
28+
<h3
29+
class="MuiTypography-root MuiTypography-h3 FeedbackSubmitConfirmation-announcement css-gepadz-MuiTypography-root"
30+
>
31+
Thank you for your feedback on
32+
<b />
33+
</h3>
34+
</div>
35+
</div>
36+
`;

web-ui-external-feedback/src/components/feedback_submit_form/FeedbackSubmitForm.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ const FeedbackSubmitForm = ({
143143
updateRequestSubmit().then(res => {
144144
setIsSubmitting(false);
145145
if (res && res.payload && res.payload.data && !res.error) {
146-
history.push(`/feedback/submit/confirmation/?request=${requestId}`);
146+
history.push(`/externalFeedback/submit/confirmation/?request=${requestId}`);
147147
} else {
148148
dispatch({
149149
type: UPDATE_TOAST,

web-ui-external-feedback/src/components/routes/Routes.jsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@ import React, { useContext } from 'react';
22
import { Switch, Route } from 'react-router-dom';
33
import { AppContext } from '../../context/AppContext';
44
import FeedbackSubmitPage from "../../pages/FeedbackSubmitPage.jsx";
5+
import FeedbackSubmitConfirmation from "../feedback_submit_confirmation/FeedbackSubmitConfirmation.jsx";
56

67
export default function Routes() {
78
const { state } = useContext(AppContext);
89

910
return (
1011
<Switch>
11-
<Route path="/externalFeedback/">
12+
<Route path="/externalFeedback/submit">
1213
<FeedbackSubmitPage />
1314
</Route>
15+
<Route exact path="/externalFeedback/submit/confirmation">
16+
<FeedbackSubmitConfirmation />
17+
</Route>
1418
</Switch>
1519
);
1620
}

0 commit comments

Comments
 (0)