Merge branch 'feat/inda-383-daily-stat' into 'main'
[ProtonMail-WebClient.git] / applications / drive / src / app / containers / VolumeLinkContainer.tsx
blobcc10add35e3f8b0f5316e6c3c5afa0a3a3b79a59
1 import type { FC } from 'react';
2 import { useEffect } from 'react';
3 import type { RouteComponentProps } from 'react-router-dom';
4 import { useLocation } from 'react-router-dom';
6 import { Loader } from '@proton/components';
7 import { isProtonDocument } from '@proton/shared/lib/helpers/mimetype';
9 import useNavigate from '../hooks/drive/useNavigate';
10 import { useDocumentActions } from '../store/_documents';
11 import { useVolumeLinkView } from '../store/_views/useVolumeLinkView';
13 export const VolumeLinkContainer: FC<RouteComponentProps<{ volumeId: string; linkId: string }>> = ({ match }) => {
14     const { search } = useLocation();
15     const searchParams = new URLSearchParams(search);
16     const invitationId = searchParams.get('invitation');
17     const externalInvitationId = searchParams.get('externalInvitationID');
18     const { volumeId, linkId } = match.params;
19     const { handleRedirectOrAcceptInvitation, handleConvertExternalInvitation } = useVolumeLinkView();
20     const { navigateToSharedWithMe, navigateToSharedByMe, navigateToLink, navigateToNoAccess } = useNavigate();
21     const { openDocument } = useDocumentActions();
23     useEffect(() => {
24         if (!invitationId) {
25             return;
26         }
27         const abortController = new AbortController();
28         void handleRedirectOrAcceptInvitation(abortController.signal, {
29             invitationId,
30             volumeId,
31             linkId,
32         })
33             .then((linkInfo) => {
34                 if (linkInfo && isProtonDocument(linkInfo?.mimeType)) {
35                     return openDocument({
36                         shareId: linkInfo.shareId,
37                         linkId: linkInfo.linkId,
38                         openBehavior: 'redirect',
39                     });
40                 } else if (linkInfo?.shareId) {
41                     navigateToLink(linkInfo.shareId, linkInfo.linkId, linkInfo.isFile, '/shared-with-me');
42                 } else {
43                     navigateToNoAccess();
44                 }
45             })
46             .catch(() => {
47                 navigateToSharedWithMe();
48             });
49         // No cleanup/abort function, allowing the action to continue in the background
50     }, [invitationId, volumeId, linkId]);
52     useEffect(() => {
53         if (!externalInvitationId) {
54             return;
55         }
56         const abortController = new AbortController();
57         void handleConvertExternalInvitation(abortController.signal, {
58             externalInvitationId,
59             linkId,
60         }).finally(() => {
61             navigateToSharedByMe();
62         });
63         // No cleanup/abort function, allowing the action to continue in the background
64     }, [externalInvitationId]);
65     // This is a temporary solution until we have proper view to accept/decline screens
66     return <Loader size="medium" className="absolute inset-center" />;