Skip to content

Commit fbac668

Browse files
feat: success message toast
1 parent dba5c7b commit fbac668

File tree

4 files changed

+51
-12
lines changed

4 files changed

+51
-12
lines changed

src/data/apiHook.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useQuery, useMutation } from '@tanstack/react-query';
1+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
22
import { getCourseInfo, getDateExtensions, resetDateExtension, PaginationQueryKeys } from './api';
33
import { appId } from '../constants';
44

@@ -25,8 +25,12 @@ export const useDateExtensions = (courseId: string, pagination: PaginationQueryK
2525
);
2626

2727
export const useResetDateExtensionMutation = () => {
28+
const queryClient = useQueryClient();
2829
return useMutation({
2930
mutationFn: ({ courseId, userId }: { courseId: string, userId: number }) =>
3031
resetDateExtension(courseId, userId),
32+
onSettled: () => {
33+
queryClient.invalidateQueries({ queryKey: dateExtensionsQueryKeys.all });
34+
},
3135
});
3236
};

src/dateExtensions/DateExtensionsPage.tsx

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,54 @@
11
import { useState } from 'react';
2+
import { useParams } from 'react-router-dom';
23
import { useIntl } from '@openedx/frontend-base';
3-
import { Button, Container } from '@openedx/paragon';
4+
import { AlertModal, Button, Container, Toast } from '@openedx/paragon';
45
import messages from './messages';
56
import DateExtensionsList from './components/DateExtensionsList';
67
import ResetExtensionsModal from './components/ResetExtensionsModal';
78
import { LearnerDateExtension } from './types';
9+
import { useResetDateExtensionMutation } from '../data/apiHook';
810

911
// const successMessage = 'Successfully reset due date for student Phu Nguyen for A subsection with two units (block-v1:SchemaAximWGU+WGU101+1+type@sequential+block@3984030755104708a86592cf23fb1ae4) to 2025-08-21 00:00';
1012

1113
const DateExtensionsPage = () => {
1214
const intl = useIntl();
15+
const { courseId } = useParams<{ courseId: string }>();
16+
const { mutate: resetMutation } = useResetDateExtensionMutation();
1317
const [isModalOpen, setIsModalOpen] = useState(false);
1418
const [selectedUser, setSelectedUser] = useState<LearnerDateExtension | null>(null);
19+
const [successMessage, setSuccessMessage] = useState<string>('');
20+
const [errorMessage, setErrorMessage] = useState<string>('');
1521

1622
const handleResetExtensions = (user: LearnerDateExtension) => {
1723
setIsModalOpen(true);
1824
setSelectedUser(user);
1925
};
2026

21-
const handleConfirmReset = () => {
22-
if (selectedUser) {
23-
// Call the API to reset the extensions for the selected user
24-
console.log(`Resetting extensions for user: ${selectedUser.username}`);
25-
}
27+
const handleCloseModal = () => {
2628
setIsModalOpen(false);
2729
setSelectedUser(null);
2830
};
2931

30-
const handleCancelReset = () => {
31-
setIsModalOpen(false);
32-
setSelectedUser(null);
32+
const handleErrorOnReset = (error: any) => {
33+
setErrorMessage(error.message);
34+
};
35+
36+
const handleSuccessOnReset = (response: any) => {
37+
const { message } = response;
38+
setSuccessMessage(message);
39+
handleCloseModal();
40+
};
41+
42+
const handleConfirmReset = async () => {
43+
if (selectedUser && courseId) {
44+
resetMutation({
45+
courseId,
46+
userId: selectedUser.id
47+
}, {
48+
onError: handleErrorOnReset,
49+
onSuccess: handleSuccessOnReset
50+
});
51+
}
3352
};
3453

3554
return (
@@ -44,10 +63,16 @@ const DateExtensionsPage = () => {
4463
isOpen={isModalOpen}
4564
message={intl.formatMessage(messages.resetConfirmationMessage)}
4665
title={intl.formatMessage(messages.resetConfirmationHeader, { username: selectedUser?.username })}
47-
onCancelReset={handleCancelReset}
48-
onClose={handleCancelReset}
66+
onCancelReset={handleCloseModal}
67+
onClose={handleCloseModal}
4968
onConfirmReset={handleConfirmReset}
5069
/>
70+
<Toast show={!!successMessage} onClose={() => {}} className="text-break">
71+
{successMessage}
72+
</Toast>
73+
<AlertModal isOpen={!!errorMessage} footerNode={<Button onClick={() => setErrorMessage('')}>{intl.formatMessage(messages.close)}</Button>}>
74+
{errorMessage}
75+
</AlertModal>
5176
</Container>
5277
);
5378
};

src/dateExtensions/messages.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ const messages = defineMessages({
6161
defaultMessage: 'Reset Due Date for Student',
6262
description: 'Label for the confirm button in the reset modal',
6363
},
64+
close: {
65+
id: 'instruct.dateExtensions.page.resetModal.close',
66+
defaultMessage: 'Close',
67+
description: 'Label for the close button in the reset modal',
68+
},
6469
});
6570

6671
export default messages;

src/main.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@
22
@import "@edx/brand/paragon/variables";
33
@import "@openedx/paragon/scss/core/core";
44
@import "@edx/brand/paragon/overrides";
5+
6+
.toast-container {
7+
left: unset;
8+
right: 1.25rem;
9+
}

0 commit comments

Comments
 (0)