1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { compose, Dispatch } from 'redux';
6 import { connect } from 'react-redux';
7 import { RootState } from 'store/store';
8 import { formValueSelector } from 'redux-form'
11 saveSharingDialogChanges,
12 connectSharingDialogProgress,
15 initializeManagementForm
16 } from 'store/sharing-dialog/sharing-dialog-actions';
17 import { WithDialogProps } from 'store/dialog/with-dialog';
18 import SharingDialogComponent, {
19 SharingDialogDataProps,
20 SharingDialogActionProps
21 } from './sharing-dialog-component';
23 getSharingPublicAccessFormData,
26 SHARING_MANAGEMENT_FORM_NAME,
28 } from 'store/sharing-dialog/sharing-dialog-types';
29 import { WithProgressStateProps } from 'store/progress-indicator/with-progress';
30 import { getDialog } from 'store/dialog/dialog-reducer';
31 import { filterResources } from 'store/resources/resources';
32 import { ApiClientAuthorization } from 'models/api-client-authorization';
33 import { ResourceKind } from 'models/resource';
35 type Props = WithDialogProps<string> & WithProgressStateProps;
37 const sharingManagementFormSelector = formValueSelector(SHARING_MANAGEMENT_FORM_NAME);
39 const mapStateToProps = (state: RootState, { working, ...props }: Props): SharingDialogDataProps => {
40 const dialog = getDialog<SharingDialogData>(state.dialog, SHARING_DIALOG_NAME);
41 const sharedResourceUuid = dialog?.data.resourceUuid || '';
42 const sharingURLsDisabled = state.auth.config.clusterConfig.Workbench.DisableSharingURLsUI;
45 permissions: sharingManagementFormSelector(state, 'permissions'),
46 saveEnabled: hasChanges(state),
50 sharingURLsNr: !sharingURLsDisabled
51 ? (filterResources( (resource: ApiClientAuthorization) =>
52 resource.kind === ResourceKind.API_CLIENT_AUTHORIZATION &&
53 resource.scopes.includes(`GET /arvados/v1/collections/${sharedResourceUuid}`) &&
54 resource.scopes.includes(`GET /arvados/v1/collections/${sharedResourceUuid}/`) &&
55 resource.scopes.includes('GET /arvados/v1/keep_services/accessible')
56 )(state.resources) as ApiClientAuthorization[]).length
58 privateAccess: getSharingPublicAccessFormData(state)?.visibility === VisibilityLevel.PRIVATE,
62 const mapDispatchToProps = (dispatch: Dispatch, { ...props }: Props): SharingDialogActionProps => ({
64 onClose: props.closeDialog,
66 dispatch<any>(saveSharingDialogChanges);
68 onCreateSharingToken: (d: Date) => () => {
69 dispatch<any>(createSharingToken(d));
71 refreshPermissions: () => {
72 dispatch<any>(initializeManagementForm);
76 export const SharingDialog = compose(
78 connectSharingDialogProgress,
79 connect(mapStateToProps, mapDispatchToProps)
80 )(SharingDialogComponent);