farmcontrol-ui/src/components/Dashboard/Management/AppPasswords/RegenerateAppPasswordSecret.jsx
Tom Butcher 1e2adb2b28
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
Implemented multiple app passwords.
2026-03-02 01:58:34 +00:00

78 lines
2.3 KiB
JavaScript

import PropTypes from 'prop-types'
import { useContext, useState } from 'react'
import { Result, Typography, Flex, Button } from 'antd'
import { ApiServerContext } from '../../context/ApiServerContext'
import CopyButton from '../../common/CopyButton'
import AppPasswordIcon from '../../../Icons/AppPasswordIcon.jsx'
import ReloadIcon from '../../../Icons/ReloadIcon'
const { Text } = Typography
const RegenerateAppPasswordSecret = ({ id }) => {
const { sendObjectFunction } = useContext(ApiServerContext)
const [appPassword, setAppPassword] = useState(null)
const [loading, setLoading] = useState(false)
const [passwordGenerated, setPasswordGenerated] = useState(false)
const handleRegenerate = async () => {
setLoading(true)
setAppPassword(null)
try {
const result = await sendObjectFunction(
id,
'appPassword',
'regenerateSecret',
{}
)
if (result?.appPassword) {
setAppPassword(result.appPassword)
setPasswordGenerated(true)
}
} finally {
setLoading(false)
}
}
return (
<Flex vertical align='center'>
<Result
title={
passwordGenerated ? 'Secret Regenerated' : 'Regenerate Secret'
}
disabled={passwordGenerated}
subTitle={
appPassword ? (
<Text>Copy this secret now. It will not be shown again.</Text>
) : (
<Text>Generate a new secret for this app password.</Text>
)
}
icon={<AppPasswordIcon />}
>
<Flex justify='center' style={{ minWidth: '395px' }}>
<Flex justify='center'>
<Flex gap='small' align='center' justify='center'>
<CopyButton size='default' text={appPassword} />
<Text code style={{ fontSize: '18px' }}>
{appPassword || '••••••••••••••••••••••••••••••••'}
</Text>
<Button
type='text'
loading={loading}
onClick={handleRegenerate}
icon={<ReloadIcon />}
/>
</Flex>
</Flex>
</Flex>
</Result>
</Flex>
)
}
RegenerateAppPasswordSecret.propTypes = {
id: PropTypes.string.isRequired
}
export default RegenerateAppPasswordSecret