import { css, cx } from '@emotion/css'; import { useEffect, useRef, useState } from 'react'; import * as React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { ConfirmButton, Input, Label, LegacyInputStatus, useStyles2 } from '@grafana/ui'; interface Props { label: string; value?: string; inputType?: string; disabled?: boolean; onChange?: (value: string) => void; } export const ServiceAccountProfileRow = ({ label, value, inputType, disabled, onChange }: Props): JSX.Element => { const inputElem = useRef(null); const [inputValue, setInputValue] = useState(value); const [isEditing, setIsEditing] = useState(false); const styles = useStyles2(getStyles); const inputId = `${label}-input`; useEffect(() => { if (isEditing) { focusInput(); } }, [isEditing]); const onEditClick = () => { setIsEditing(true); }; const onCancelClick = () => { setIsEditing(false); setInputValue(value || ''); }; const onInputChange = (event: React.ChangeEvent, status?: LegacyInputStatus) => { if (status === LegacyInputStatus.Invalid) { return; } setInputValue(event.target.value); }; const onInputBlur = (event: React.FocusEvent, status?: LegacyInputStatus) => { if (status === LegacyInputStatus.Invalid) { return; } setInputValue(event.target.value); }; const focusInput = () => { inputElem?.current?.focus(); }; const onSave = () => { setIsEditing(false); if (onChange) { onChange(inputValue!); } }; return ( {!disabled && isEditing ? ( ) : ( {value} )} {onChange && ( Edit )} ); }; const getStyles = (theme: GrafanaTheme2) => { return { disabled: css` color: ${theme.colors.text.secondary}; `, }; };