Skip to content

Commit ecf0040

Browse files
Add OwnershipActionsAlert
1 parent 080761d commit ecf0040

File tree

2 files changed

+93
-57
lines changed

2 files changed

+93
-57
lines changed

src/hooks/ownerships/useOwnershipActions.tsx

Lines changed: 89 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { useEffect, useState } from 'react';
2-
import { Alert } from 'react-bootstrap';
1+
import { useCallback, useEffect, useMemo, useState } from 'react';
32
import { Trans, useTranslation } from 'react-i18next';
43
import { useQueryClient } from 'react-query';
54

@@ -12,7 +11,9 @@ import {
1211
} from '@/hooks/api/ownerships';
1312
import { Organizer } from '@/types/Organizer';
1413
import { Values } from '@/types/Values';
14+
import { Alert, AlertVariants } from '@/ui/Alert';
1515
import { Box } from '@/ui/Box';
16+
import { getInlineProps, InlineProps } from '@/ui/Inline';
1617
import { Modal, ModalSizes, ModalVariants } from '@/ui/Modal';
1718

1819
export const ActionType = {
@@ -24,6 +25,49 @@ export const ActionType = {
2425

2526
type ActionType = Values<typeof ActionType>;
2627

28+
const OwnershipActionsAlert = ({
29+
request,
30+
actionType,
31+
onClose,
32+
...props
33+
}: {
34+
request?: OwnershipRequest;
35+
actionType: ActionType;
36+
onClose: () => void;
37+
} & InlineProps) => {
38+
const { i18n } = useTranslation();
39+
const translationsPath = `organizers.ownerships.${actionType}_modal`;
40+
41+
const getOrganizerByIdQuery = useGetOrganizerByIdQuery({
42+
id: request?.itemId,
43+
});
44+
45+
// @ts-expect-error
46+
const organizer: Organizer = getOrganizerByIdQuery?.data;
47+
const organizerName =
48+
organizer?.name?.[i18n.language] ??
49+
organizer?.name?.[organizer.mainLanguage] ??
50+
organizer?.name;
51+
52+
return (
53+
<Alert
54+
variant={AlertVariants.SUCCESS}
55+
fullWidth
56+
closable
57+
onClose={onClose}
58+
{...getInlineProps(props)}
59+
>
60+
<Trans
61+
i18nKey={`${translationsPath}.success`}
62+
values={{
63+
ownerEmail: request?.ownerEmail,
64+
organizerName,
65+
}}
66+
/>
67+
</Alert>
68+
);
69+
};
70+
2771
const OwnershipActionModal = ({
2872
request,
2973
actionType,
@@ -40,9 +84,16 @@ const OwnershipActionModal = ({
4084
const { t, i18n } = useTranslation();
4185
const translationsPath = `organizers.ownerships.${actionType}_modal`;
4286

43-
const getOrganizerByIdQuery = useGetOrganizerByIdQuery({
44-
id: request?.itemId,
45-
});
87+
const getOrganizerByIdQuery = useGetOrganizerByIdQuery(
88+
{
89+
id: request?.itemId,
90+
},
91+
{
92+
// This is needed if the filtered organizer is the same as the one from the action
93+
// otherwise the query in the action will trigger the query on the page continuously
94+
queryKey: ['organizers', 'action-modal'],
95+
},
96+
);
4697

4798
// @ts-expect-error
4899
const organizer: Organizer = getOrganizerByIdQuery?.data;
@@ -78,13 +129,13 @@ const OwnershipActionModal = ({
78129
export const useOwnershipActions = () => {
79130
const queryClient = useQueryClient();
80131

81-
const [isSuccessAlertVisible, setIsSuccessAlertVisible] = useState(false);
132+
const [successfulAction, setSuccessfulAction] = useState<ActionType>();
82133
const [selectedRequest, setSelectedRequest] = useState<OwnershipRequest>();
83134
const [actionType, setActionType] = useState<ActionType>();
84135

85136
const approveOwnershipRequestMutation = useApproveOwnershipRequestMutation({
86137
onSuccess: async () => {
87-
setIsSuccessAlertVisible(true);
138+
setSuccessfulAction(ActionType.APPROVE);
88139
setActionType(undefined);
89140
setSelectedRequest(undefined);
90141
await queryClient.invalidateQueries('ownership-requests');
@@ -93,7 +144,7 @@ export const useOwnershipActions = () => {
93144

94145
const rejectOwnershipRequestMutation = useRejectOwnershipRequestMutation({
95146
onSuccess: async () => {
96-
setIsSuccessAlertVisible(true);
147+
setSuccessfulAction(ActionType.REJECT);
97148
setActionType(undefined);
98149
setSelectedRequest(undefined);
99150
await queryClient.invalidateQueries('ownership-requests');
@@ -102,6 +153,7 @@ export const useOwnershipActions = () => {
102153

103154
const deleteOwnershipRequestMutation = useDeleteOwnershipRequestMutation({
104155
onSuccess: async () => {
156+
setSuccessfulAction(ActionType.DELETE);
105157
setActionType(undefined);
106158
setSelectedRequest(undefined);
107159
await queryClient.invalidateQueries('ownership-requests');
@@ -133,22 +185,36 @@ export const useOwnershipActions = () => {
133185
}
134186
};
135187

136-
return {
137-
deleteOwnership: (request: OwnershipRequest) => {
138-
setActionType(ActionType.DELETE);
188+
const triggerAction =
189+
(actionType: ActionType) => (request: OwnershipRequest) => {
190+
setActionType(actionType);
139191
setSelectedRequest(request);
140-
},
141-
Modal: () => {
142-
return (
143-
<OwnershipActionModal
144-
request={selectedRequest}
145-
actionType={actionType}
146-
isLoading={isLoading}
147-
onClose={() => setSelectedRequest(undefined)}
148-
onConfirm={handleConfirm}
192+
};
193+
194+
return {
195+
deleteOwnership: triggerAction(ActionType.DELETE),
196+
approveOwnership: triggerAction(ActionType.APPROVE),
197+
rejectOwnership: triggerAction(ActionType.REJECT),
198+
Modal: () => (
199+
<OwnershipActionModal
200+
request={selectedRequest}
201+
actionType={actionType}
202+
isLoading={isLoading}
203+
onClose={() => setSelectedRequest(undefined)}
204+
onConfirm={handleConfirm}
205+
/>
206+
),
207+
Alert: (props: InlineProps) =>
208+
successfulAction ? (
209+
<OwnershipActionsAlert
210+
actionType={successfulAction}
211+
onClose={() => {
212+
setSuccessfulAction(undefined);
213+
setSelectedRequest(undefined);
214+
setActionType(undefined);
215+
}}
216+
{...getInlineProps(props)}
149217
/>
150-
);
151-
},
152-
Alert: () => (isSuccessAlertVisible ? <Alert>test</Alert> : null),
218+
) : null,
153219
};
154220
};

src/pages/manage/ownerships/index.page.tsx

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -119,38 +119,8 @@ const OwnershipsOverviewPage = () => {
119119
await shallowRouter.pushSearchParams({ page: `${page}` });
120120
};
121121

122-
const queryClient = useQueryClient();
123-
// const onSuccess = () => queryClient.invalidateQueries('ownership-requests');
124-
//
125-
// const approveOwnershipRequestMutation = useApproveOwnershipRequestMutation({
126-
// onSuccess,
127-
// });
128-
// const rejectOwnershipRequestMutation = useRejectOwnershipRequestMutation({
129-
// onSuccess,
130-
// });
131-
// const deleteOwnershipRequestMutation = useDeleteOwnershipRequestMutation({
132-
// onSuccess,
133-
// });
134-
//
135-
// const handleApprove = (request: OwnershipRequest) => {
136-
// approveOwnershipRequestMutation.mutate({
137-
// ownershipId: request.id,
138-
// });
139-
// };
140-
//
141-
// const handleReject = (request: OwnershipRequest) => {
142-
// rejectOwnershipRequestMutation.mutate({
143-
// ownershipId: request.id,
144-
// });
145-
// };
146-
//
147-
// const handleDelete = (request: OwnershipRequest) => {
148-
// deleteOwnershipRequestMutation.mutate({
149-
// ownershipId: request.id,
150-
// });
151-
// };
152-
153-
const { deleteOwnership, Modal, Alert } = useOwnershipActions();
122+
const { deleteOwnership, approveOwnership, rejectOwnership, Modal, Alert } =
123+
useOwnershipActions();
154124

155125
return (
156126
<Page>
@@ -198,8 +168,8 @@ const OwnershipsOverviewPage = () => {
198168
requests={requests}
199169
shouldShowItemId
200170
shouldShowOwnerId
201-
//onApprove={handleApprove}
202-
//onReject={handleReject}
171+
onApprove={approveOwnership}
172+
onReject={rejectOwnership}
203173
onDelete={deleteOwnership}
204174
/>
205175
)}

0 commit comments

Comments
 (0)