client/app/pages/users/components/ApiKeyForm.jsx (57 lines of code) (raw):

import React, { useState, useCallback } from "react"; import PropTypes from "prop-types"; import Button from "antd/lib/button"; import Form from "antd/lib/form"; import Modal from "antd/lib/modal"; import DynamicComponent from "@/components/DynamicComponent"; import InputWithCopy from "@/components/InputWithCopy"; import { UserProfile } from "@/components/proptypes"; import User from "@/services/user"; import useImmutableCallback from "@/lib/hooks/useImmutableCallback"; export default function ApiKeyForm(props) { const { user, onChange } = props; const [loading, setLoading] = useState(false); const handleChange = useImmutableCallback(onChange); const regenerateApiKey = useCallback(() => { const doRegenerate = () => { setLoading(true); User.regenerateApiKey(user) .then(apiKey => { if (apiKey) { handleChange({ ...user, apiKey }); } }) .finally(() => { setLoading(false); }); }; Modal.confirm({ title: "Regenerate API Key", content: "Are you sure you want to regenerate?", okText: "Regenerate", onOk: doRegenerate, maskClosable: true, autoFocusButton: null, }); }, [user, handleChange]); return ( <DynamicComponent name="UserProfile.ApiKeyForm" {...props}> <Form layout="vertical"> <hr /> <Form.Item label="API Key" className="m-b-10"> <InputWithCopy id="apiKey" className="hide-in-percy" value={user.apiKey} data-test="ApiKey" readOnly /> </Form.Item> <Button className="w-100" onClick={regenerateApiKey} loading={loading} data-test="RegenerateApiKey"> Regenerate </Button> </Form> </DynamicComponent> ); } ApiKeyForm.propTypes = { user: UserProfile.isRequired, onChange: PropTypes.func, }; ApiKeyForm.defaultProps = { onChange: () => {}, };