20085: Make the public/private/shared dropdown save on change
[arvados-workbench2.git] / src / views-components / sharing-dialog / sharing-public-access-form-component.tsx
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import React from 'react';
6 import { Grid, StyleRulesCallback, Divider, Typography } from '@material-ui/core';
7 import { Field, WrappedFieldProps } from 'redux-form';
8 import { WithStyles } from '@material-ui/core/styles';
9 import withStyles from '@material-ui/core/styles/withStyles';
10 import { VisibilityLevelSelect } from './visibility-level-select';
11 import { VisibilityLevel } from 'store/sharing-dialog/sharing-dialog-types';
12
13 const sharingPublicAccessStyles: StyleRulesCallback<'root'> = theme => ({
14     root: {
15         padding: `${theme.spacing.unit * 2}px 0`,
16     }
17 });
18
19 interface AccessProps {
20     visibility: VisibilityLevel;
21     onSave: () => void;
22 }
23
24 const SharingPublicAccessForm = withStyles(sharingPublicAccessStyles)(
25     ({ classes, visibility, onSave }: WithStyles<'root'> & AccessProps) =>
26         <>
27             <Divider />
28             <Grid container alignItems='center' spacing={8} className={classes.root}>
29                 <Grid item xs={8}>
30                     <Typography variant='subtitle1'>
31                         {renderVisibilityInfo(visibility)}
32                     </Typography>
33                 </Grid>
34                 <Grid item xs={4} container wrap='nowrap'>
35                     <Field name='visibility' component={VisibilityLevelSelectComponent} onChange={onSave} />
36                 </Grid>
37             </Grid>
38         </>
39 );
40
41 const renderVisibilityInfo = (visibility: VisibilityLevel) => {
42     switch (visibility) {
43         case VisibilityLevel.PUBLIC:
44             return 'Anyone can access';
45         case VisibilityLevel.SHARED:
46             return 'Specific people can access';
47         case VisibilityLevel.PRIVATE:
48             return 'Only you can access';
49         default:
50             return '';
51     }
52 };
53
54 const SharingPublicAccessFormComponent = ({ visibility, onSave }: AccessProps) =>
55     <SharingPublicAccessForm {...{ visibility, onSave }} />;
56
57 export default SharingPublicAccessFormComponent;
58
59 const VisibilityLevelSelectComponent = ({ input }: WrappedFieldProps) =>
60     <VisibilityLevelSelect fullWidth disableUnderline {...input} />;