Files
2024-02-15 17:01:50 +00:00

81 lines
2.0 KiB
TypeScript

import type {Context} from 'sentry/components/deprecatedforms/form';
import InputField from 'sentry/components/deprecatedforms/inputField';
import FormState from 'sentry/components/forms/state';
type Props = InputField['props'] & {
prefix: string;
formState?: (typeof FormState)[keyof typeof FormState];
hasSavedValue?: boolean;
};
type State = InputField['state'] & {
editing: boolean;
};
// TODO(dcramer): im not entirely sure this is working correctly with
// value propagation in all scenarios
export default class PasswordField extends InputField<Props, State> {
static defaultProps = {
...InputField.defaultProps,
hasSavedValue: false,
prefix: '',
};
constructor(props: Props, context: Context) {
super(props, context);
this.state = {...this.state, editing: false};
}
componentDidUpdate(prevProps: Props) {
// close edit mode after successful save
// TODO(dcramer): this needs to work with this.context.form
if (
this.props.formState &&
prevProps.formState === FormState.SAVING &&
this.props.formState === FormState.READY
) {
this.setState({editing: false});
}
}
getType() {
return 'password';
}
cancelEdit = (e: React.MouseEvent<HTMLAnchorElement>) => {
e.preventDefault();
this.setState({editing: false}, () => this.setValue(''));
};
startEdit = (e: React.MouseEvent<HTMLAnchorElement>) => {
e.preventDefault();
this.setState({editing: true});
};
getField() {
if (!this.props.hasSavedValue) {
return super.getField();
}
if (this.state.editing) {
return (
<div className="form-password editing">
<div>{super.getField()}</div>
<div>
<a onClick={this.cancelEdit}>Cancel</a>
</div>
</div>
);
}
return (
<div className="form-password saved">
<span>
{this.props.prefix + new Array(21 - this.props.prefix.length).join('*')}
</span>
{!this.props.disabled && <a onClick={this.startEdit}>Edit</a>}
</div>
);
}
}