import { useFormContext, useWatch } from "react-hook-form"; import { subject } from "@casl/ability"; import { faCircle, faCircleDot, faShuffle } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { ProjectPermissionCan } from "@app/components/permissions"; import { Button, Drawer, DrawerContent, FormControl, Input, Popover, PopoverContent, PopoverTrigger, Switch, TextArea } from "@app/components/v2"; import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { useToggle } from "@app/hooks"; import { FormData, SecretActionType } from "../../DashboardPage.utils"; import { GenRandomNumber } from "./GenRandomNumber"; type Props = { isDrawerOpen: boolean; environment: string; secretPath: string; onOpenChange: (isOpen: boolean) => void; index: number; isReadOnly?: boolean; onEnvCompare: (secretKey: string) => void; secretVersion?: Array<{ id: string; createdAt: string; value: string }>; // to record the ids of deleted ones onSecretDelete: (index: number, secretName: string, id?: string, overrideId?: string) => void; onSave: () => void; }; export const SecretDetailDrawer = ({ isDrawerOpen, onOpenChange, index, secretVersion = [], isReadOnly, onSecretDelete, onSave, onEnvCompare, environment, secretPath }: Props): JSX.Element => { const [canRevealSecVal, setCanRevealSecVal] = useToggle(); const [canRevealSecOverride, setCanRevealSecOverride] = useToggle(); const { register, setValue, control, getValues } = useFormContext(); const overrideAction = useWatch({ control, name: `secrets.${index}.overrideAction` }); const isOverridden = overrideAction === SecretActionType.Created || overrideAction === SecretActionType.Modified; const onSecretOverride = () => { const secret = getValues(`secrets.${index}`); if (isOverridden) { // when user created a new override but then removes if (SecretActionType.Created) { setValue(`secrets.${index}.valueOverride`, "", { shouldDirty: true }); } setValue(`secrets.${index}.overrideAction`, SecretActionType.Deleted, { shouldDirty: true }); } else { setValue( `secrets.${index}.overrideAction`, secret?.idOverride ? SecretActionType.Modified : SecretActionType.Created, { shouldDirty: true } ); } }; return (
{(isAllowed) => ( )} {(isAllowed) => ( )}
} >
} /> setValue(`secrets.${index}.value`, val, { shouldDirty: true }) } />
Override with a personal value
} /> setValue(`secrets.${index}.valueOverride`, val, { shouldDirty: true }) } />
Version History
{secretVersion?.map(({ createdAt, value, id }, i) => (
{new Date(createdAt).toLocaleDateString("en-US", { year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit" })}
Value:
{value}
))}