|
5 | 5 | import { ReimbursementRequestDataSubmission } from '../ReimbursementRequestForm/ReimbursementRequestForm'; |
6 | 6 | import { |
7 | 7 | useEditReimbursementRequest, |
| 8 | + useLeadershipApproveReimbursementRequest, |
| 9 | + useMarkPendingFinance, |
8 | 10 | useSingleReimbursementRequest, |
9 | 11 | useUploadManyReceipts |
10 | 12 | } from '../../../hooks/finance.hooks'; |
11 | | -import { useParams } from 'react-router-dom'; |
| 13 | +import { useHistory, useParams } from 'react-router-dom'; |
12 | 14 | import LoadingIndicator from '../../../components/LoadingIndicator'; |
13 | 15 | import ErrorPage from '../../ErrorPage'; |
14 | 16 | import EditReimbursementRequestRenderedDefaultValues from './EditReimbursementRequestRenderedDefaultValues'; |
| 17 | +import { useToast } from '../../../hooks/toasts.hooks'; |
| 18 | +import { isHead } from 'shared'; |
| 19 | +import { useCurrentUser } from '../../../hooks/users.hooks'; |
| 20 | +import { isReimbursementRequestLeadershipApproved } from '../../../utils/reimbursement-request.utils'; |
15 | 21 |
|
16 | | -const EditReimbursementRequestPage: React.FC<{ |
17 | | - onSubmitEditData: (data: ReimbursementRequestDataSubmission) => Promise<string>; |
18 | | - onExitEditPage: () => void; |
19 | | - onSubmitToFinance?: (data: ReimbursementRequestDataSubmission) => Promise<void>; |
20 | | -}> = ({ onSubmitEditData, onExitEditPage, onSubmitToFinance }) => { |
| 22 | +const EditReimbursementRequestPage: React.FC<{}> = () => { |
21 | 23 | const { id } = useParams<{ id: string }>(); |
| 24 | + const history = useHistory(); |
22 | 25 |
|
23 | | - const { isLoading: editReimbursementRequestIsLoading } = useEditReimbursementRequest(id); |
24 | | - const { isLoading: uploadReceiptsIsLoading } = useUploadManyReceipts(); |
| 26 | + const { isLoading: editReimbursementRequestIsLoading, mutateAsync: editReimbursementRequest } = |
| 27 | + useEditReimbursementRequest(id); |
| 28 | + const { isLoading: uploadReceiptsIsLoading, mutateAsync: uploadReceipts } = useUploadManyReceipts(); |
25 | 29 | const { isLoading: getIsLoading, isError, error, data: reimbursementRequest } = useSingleReimbursementRequest(id); |
| 30 | + const { mutateAsync: markPendingFinance } = useMarkPendingFinance(id); |
| 31 | + const { mutateAsync: leadershipApproveReimbursementRequest } = useLeadershipApproveReimbursementRequest(id); |
| 32 | + const user = useCurrentUser(); |
| 33 | + const toast = useToast(); |
26 | 34 |
|
27 | 35 | if (isError) return <ErrorPage error={error} />; |
28 | 36 |
|
29 | | - if (getIsLoading || editReimbursementRequestIsLoading || uploadReceiptsIsLoading || !reimbursementRequest) |
30 | | - return <LoadingIndicator />; |
| 37 | + if (getIsLoading || !reimbursementRequest) return <LoadingIndicator />; |
| 38 | + |
| 39 | + const isSubmitting = editReimbursementRequestIsLoading || uploadReceiptsIsLoading; |
| 40 | + |
| 41 | + const onCancel = () => { |
| 42 | + history.goBack(); |
| 43 | + }; |
| 44 | + |
| 45 | + const onSubmitEditData = async (data: ReimbursementRequestDataSubmission): Promise<string> => { |
| 46 | + const filesToKeep = data.receiptFiles.filter((file) => file.googleFileId !== ''); |
| 47 | + try { |
| 48 | + await editReimbursementRequest({ ...data, receiptPictures: filesToKeep, indexCodeId: data.indexCodeId! }); |
| 49 | + await uploadReceipts({ |
| 50 | + id: reimbursementRequest.reimbursementRequestId, |
| 51 | + files: data.receiptFiles.filter((receipt) => receipt.googleFileId === '').map((file) => file.file!) |
| 52 | + }); |
| 53 | + toast.success('Reimbursement request updated successfully.'); |
| 54 | + history.goBack(); |
| 55 | + } catch (error) { |
| 56 | + if (error instanceof Error) { |
| 57 | + toast.error(`Failed to update reimbursement request: ${error.message}`); |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + return reimbursementRequest.reimbursementRequestId; |
| 62 | + }; |
| 63 | + |
| 64 | + const onSubmitToFinance = async (data: ReimbursementRequestDataSubmission) => { |
| 65 | + const filesToKeep = data.receiptFiles.filter((file) => file.googleFileId !== ''); |
| 66 | + try { |
| 67 | + await editReimbursementRequest({ ...data, receiptPictures: filesToKeep, indexCodeId: data.indexCodeId! }); |
| 68 | + await uploadReceipts({ |
| 69 | + id: reimbursementRequest.reimbursementRequestId, |
| 70 | + files: data.receiptFiles.filter((receipt) => receipt.googleFileId === '').map((file) => file.file!) |
| 71 | + }); |
| 72 | + |
| 73 | + if (isHead(user.role) && !isReimbursementRequestLeadershipApproved(reimbursementRequest)) { |
| 74 | + await leadershipApproveReimbursementRequest(); |
| 75 | + } |
| 76 | + |
| 77 | + await markPendingFinance(); |
| 78 | + toast.success('Reimbursement request submitted to Finance.'); |
| 79 | + history.goBack(); |
| 80 | + } catch (error) { |
| 81 | + if (error instanceof Error) { |
| 82 | + toast.error(`Failed to submit reimbursement request to Finance: ${error.message}`); |
| 83 | + } |
| 84 | + } |
| 85 | + }; |
31 | 86 |
|
32 | 87 | return ( |
33 | 88 | <EditReimbursementRequestRenderedDefaultValues |
34 | 89 | reimbursementRequest={reimbursementRequest} |
35 | 90 | onSubmitData={onSubmitEditData} |
36 | | - onExitEditPage={onExitEditPage} |
| 91 | + onExitEditPage={onCancel} |
37 | 92 | onSubmitToFinance={onSubmitToFinance} |
| 93 | + isSubmitting={isSubmitting} |
38 | 94 | /> |
39 | 95 | ); |
40 | 96 | }; |
|
0 commit comments