import IconButton from '@mui/material/IconButton'; import Typography from '@mui/material/Typography'; import Visibility from '@mui/icons-material/Visibility'; import Copy from '@mui/icons-material/FileCopyOutlined'; import VisibilityOff from '@mui/icons-material/VisibilityOff'; import React, {Component, CSSProperties} from 'react'; import {Stores, inject} from '../inject'; interface IProps { value: string; style?: CSSProperties; } interface IState { visible: boolean; } class CopyableSecret extends Component, IState> { public state = {visible: false}; public render() { const {value, style} = this.props; const text = this.state.visible ? value : '•••••••••••••••'; return (
{this.state.visible ? : } {text}
); } 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 inject('snackManager')(CopyableSecret);