16115: Adds warning notice for private visibility with active sharing urls.
[arvados-workbench2.git] / src / views-components / sharing-dialog / sharing-dialog.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { compose, Dispatch } from 'redux';
6 import { connect } from 'react-redux';
7 import { RootState } from 'store/store';
8 import {
9     connectSharingDialog,
10     saveSharingDialogChanges,
11     connectSharingDialogProgress,
12     SharingDialogData,
13     createSharingToken,
14     initializeManagementForm
15 } from 'store/sharing-dialog/sharing-dialog-actions';
16 import { WithDialogProps } from 'store/dialog/with-dialog';
17 import SharingDialogComponent, {
18     SharingDialogDataProps,
19     SharingDialogActionProps
20 } from './sharing-dialog-component';
21 import {
22     getSharingPublicAccessFormData,
23     hasChanges,
24     SHARING_DIALOG_NAME,
25     VisibilityLevel
26 } from 'store/sharing-dialog/sharing-dialog-types';
27 import { WithProgressStateProps } from 'store/progress-indicator/with-progress';
28 import { getDialog } from 'store/dialog/dialog-reducer';
29 import { filterResources } from 'store/resources/resources';
30 import { ApiClientAuthorization } from 'models/api-client-authorization';
31 import { ResourceKind } from 'models/resource';
32
33 type Props = WithDialogProps<string> & WithProgressStateProps;
34
35 const mapStateToProps = (state: RootState, { working, ...props }: Props): SharingDialogDataProps => {
36     const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
37     const sharedResourceUuid = dialog?.data.resourceUuid || '';
38     return ({
39     ...props,
40     saveEnabled: hasChanges(state),
41     loading: working,
42     sharedResourceUuid,
43     sharingURLsNr: (filterResources(
44         (resource: ApiClientAuthorization) =>
45             resource.kind === ResourceKind.API_CLIENT_AUTHORIZATION  &&
46             resource.scopes.includes(`GET /arvados/v1/collections/${sharedResourceUuid}`) &&
47             resource.scopes.includes(`GET /arvados/v1/collections/${sharedResourceUuid}/`) &&
48             resource.scopes.includes('GET /arvados/v1/keep_services/accessible')
49         )(state.resources) as ApiClientAuthorization[]).length,
50     privateAccess: getSharingPublicAccessFormData(state)?.visibility === VisibilityLevel.PRIVATE,
51     })
52 };
53
54 const mapDispatchToProps = (dispatch: Dispatch, { ...props }: Props): SharingDialogActionProps => ({
55     ...props,
56     onClose: props.closeDialog,
57     onSave: () => {
58         dispatch<any>(saveSharingDialogChanges);
59     },
60     onCreateSharingToken: (d: Date) => () => {
61         dispatch<any>(createSharingToken(d));
62     },
63     refreshPermissions: () => {
64         dispatch<any>(initializeManagementForm);
65     }
66 });
67
68 export const SharingDialog = compose(
69     connectSharingDialog,
70     connectSharingDialogProgress,
71     connect(mapStateToProps, mapDispatchToProps)
72 )(SharingDialogComponent);
73