import { useEffect, useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { faCheck, faCopy } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { createNotification } from "@app/components/notifications"; import { Button, FormControl, IconButton, Input, Modal, ModalContent, Tooltip } from "@app/components/v2"; import { useTimedReset } from "@app/hooks"; import { useCreateTokenIdentityTokenAuth, useUpdateIdentityTokenAuthToken } from "@app/hooks/api"; import { UsePopUpState } from "@app/hooks/usePopUp"; const schema = z .object({ name: z.string() }) .required(); export type FormData = z.infer; type Props = { popUp: UsePopUpState<["token"]>; handlePopUpToggle: (popUpName: keyof UsePopUpState<["token"]>, state?: boolean) => void; }; export const IdentityTokenModal = ({ popUp, handlePopUpToggle }: Props) => { const { mutateAsync: createToken } = useCreateTokenIdentityTokenAuth(); const { mutateAsync: updateToken } = useUpdateIdentityTokenAuthToken(); const [token, setToken] = useState(""); const [copyTextToken, isCopyingToken, setCopyTextToken] = useTimedReset({ initialState: "Copy to clipboard" }); const hasToken = Boolean(token); const { control, handleSubmit, reset, formState: { isSubmitting } } = useForm({ resolver: zodResolver(schema), defaultValues: { name: "" } }); const tokenData = popUp?.token?.data as { identityId: string; tokenId?: string; name?: string; }; useEffect(() => { if (tokenData?.tokenId && tokenData?.name) { reset({ name: tokenData.name }); } else { reset({ name: "" }); } }, [popUp?.token?.data]); const onFormSubmit = async ({ name }: FormData) => { try { if (tokenData?.tokenId) { // update await updateToken({ identityId: tokenData.identityId, tokenId: tokenData.tokenId, name }); handlePopUpToggle("token", false); } else { // create const newTokenData = await createToken({ identityId: tokenData.identityId, name }); setToken(newTokenData.accessToken); } createNotification({ text: `Successfully ${popUp?.token?.data ? "updated" : "created"} token`, type: "success" }); reset(); } catch (err) { console.error(err); const error = err as any; const text = error?.response?.data?.message ?? `Failed to ${popUp?.token?.data ? "update" : "create"} token`; createNotification({ text, type: "error" }); } }; return ( { handlePopUpToggle("token", isOpen); reset(); setToken(""); }} > {!hasToken ? (
( )} />
) : (

{token}

{ navigator.clipboard.writeText(token); setCopyTextToken("Copied"); }} >
)}
); };