Add copy secret button

This commit is contained in:
Zlendy 2023-04-26 23:01:35 +02:00 committed by Jannis Mattheis
parent a18970ea19
commit 8cfd827814
4 changed files with 23 additions and 8 deletions

View File

@ -13,7 +13,7 @@ import React, {ChangeEvent, Component, SFC} from 'react';
import ConfirmDialog from '../common/ConfirmDialog'; import ConfirmDialog from '../common/ConfirmDialog';
import DefaultPage from '../common/DefaultPage'; import DefaultPage from '../common/DefaultPage';
import Button from '@material-ui/core/Button'; import Button from '@material-ui/core/Button';
import ToggleVisibility from '../common/ToggleVisibility'; import CopyableSecret from '../common/CopyableSecret';
import AddApplicationDialog from './AddApplicationDialog'; import AddApplicationDialog from './AddApplicationDialog';
import {observer} from 'mobx-react'; import {observer} from 'mobx-react';
import {observable} from 'mobx'; import {observable} from 'mobx';
@ -166,7 +166,7 @@ const Row: SFC<IRowProps> = observer(
</TableCell> </TableCell>
<TableCell>{name}</TableCell> <TableCell>{name}</TableCell>
<TableCell> <TableCell>
<ToggleVisibility value={value} style={{display: 'flex', alignItems: 'center'}} /> <CopyableSecret value={value} style={{display: 'flex', alignItems: 'center'}} />
</TableCell> </TableCell>
<TableCell>{description}</TableCell> <TableCell>{description}</TableCell>
<TableCell align="right" padding="none"> <TableCell align="right" padding="none">

View File

@ -12,13 +12,13 @@ import React, {Component, SFC} from 'react';
import ConfirmDialog from '../common/ConfirmDialog'; import ConfirmDialog from '../common/ConfirmDialog';
import DefaultPage from '../common/DefaultPage'; import DefaultPage from '../common/DefaultPage';
import Button from '@material-ui/core/Button'; import Button from '@material-ui/core/Button';
import ToggleVisibility from '../common/ToggleVisibility';
import AddClientDialog from './AddClientDialog'; import AddClientDialog from './AddClientDialog';
import UpdateDialog from './UpdateClientDialog'; import UpdateDialog from './UpdateClientDialog';
import {observer} from 'mobx-react'; import {observer} from 'mobx-react';
import {observable} from 'mobx'; import {observable} from 'mobx';
import {inject, Stores} from '../inject'; import {inject, Stores} from '../inject';
import {IClient} from '../types'; import {IClient} from '../types';
import CopyableSecret from '../common/CopyableSecret';
@observer @observer
class Clients extends Component<Stores<'clientStore'>> { class Clients extends Component<Stores<'clientStore'>> {
@ -114,7 +114,7 @@ const Row: SFC<IRowProps> = ({name, value, fEdit, fDelete}) => (
<TableRow> <TableRow>
<TableCell>{name}</TableCell> <TableCell>{name}</TableCell>
<TableCell> <TableCell>
<ToggleVisibility <CopyableSecret
value={value} value={value}
style={{display: 'flex', alignItems: 'center', width: 200}} style={{display: 'flex', alignItems: 'center', width: 200}}
/> />

View File

@ -1,8 +1,10 @@
import IconButton from '@material-ui/core/IconButton'; import IconButton from '@material-ui/core/IconButton';
import Typography from '@material-ui/core/Typography'; import Typography from '@material-ui/core/Typography';
import Visibility from '@material-ui/icons/Visibility'; import Visibility from '@material-ui/icons/Visibility';
import Copy from '@material-ui/icons/FileCopyOutlined';
import VisibilityOff from '@material-ui/icons/VisibilityOff'; import VisibilityOff from '@material-ui/icons/VisibilityOff';
import React, {Component, CSSProperties} from 'react'; import React, {Component, CSSProperties} from 'react';
import {Stores, inject} from '../inject';
interface IProps { interface IProps {
value: string; value: string;
@ -13,7 +15,7 @@ interface IState {
visible: boolean; visible: boolean;
} }
class ToggleVisibility extends Component<IProps, IState> { class CopyableSecret extends Component<IProps & Stores<'snackManager'>, IState> {
public state = {visible: false}; public state = {visible: false};
public render() { public render() {
@ -21,6 +23,9 @@ class ToggleVisibility extends Component<IProps, IState> {
const text = this.state.visible ? value : '•••••••••••••••'; const text = this.state.visible ? value : '•••••••••••••••';
return ( return (
<div style={style}> <div style={style}>
<IconButton onClick={this.copyToClipboard} title="Copy to clipboard">
<Copy />
</IconButton>
<IconButton onClick={this.toggleVisibility} className="toggle-visibility"> <IconButton onClick={this.toggleVisibility} className="toggle-visibility">
{this.state.visible ? <VisibilityOff /> : <Visibility />} {this.state.visible ? <VisibilityOff /> : <Visibility />}
</IconButton> </IconButton>
@ -30,6 +35,16 @@ class ToggleVisibility extends Component<IProps, IState> {
} }
private toggleVisibility = () => this.setState({visible: !this.state.visible}); private toggleVisibility = () => this.setState({visible: !this.state.visible});
private copyToClipboard = async () => {
const {snackManager, value} = this.props;
try {
await navigator.clipboard.writeText(value);
snackManager.snack('Copied to clipboard');
} catch (error) {
console.error('Failed to copy to clipboard:', error);
snackManager.snack('Failed to copy to clipboard');
}
};
} }
export default ToggleVisibility; export default inject('snackManager')(CopyableSecret);

View File

@ -10,7 +10,7 @@ import TableRow from '@material-ui/core/TableRow';
import Settings from '@material-ui/icons/Settings'; import Settings from '@material-ui/icons/Settings';
import {Switch, Button} from '@material-ui/core'; import {Switch, Button} from '@material-ui/core';
import DefaultPage from '../common/DefaultPage'; import DefaultPage from '../common/DefaultPage';
import ToggleVisibility from '../common/ToggleVisibility'; import CopyableSecret from '../common/CopyableSecret';
import {observer} from 'mobx-react'; import {observer} from 'mobx-react';
import {inject, Stores} from '../inject'; import {inject, Stores} from '../inject';
import {IPlugin} from '../types'; import {IPlugin} from '../types';
@ -84,7 +84,7 @@ const Row: SFC<IRowProps> = observer(({name, id, token, enabled, fToggleStatus})
</TableCell> </TableCell>
<TableCell>{name}</TableCell> <TableCell>{name}</TableCell>
<TableCell> <TableCell>
<ToggleVisibility value={token} style={{display: 'flex', alignItems: 'center'}} /> <CopyableSecret value={token} style={{display: 'flex', alignItems: 'center'}} />
</TableCell> </TableCell>
<TableCell align="right" padding="none"> <TableCell align="right" padding="none">
<Link to={'/plugins/' + id}> <Link to={'/plugins/' + id}>