import { useEffect, useMemo } from "react"; import { Control, Controller, UseFormSetValue, useWatch } from "react-hook-form"; import { faChevronDown, faChevronRight } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { createNotification } from "@app/components/notifications"; import { Checkbox, Select, SelectItem, Td, Tr } from "@app/components/v2"; import { OrgPermissionAppConnectionActions } from "@app/context/OrgPermissionContext/types"; import { useToggle } from "@app/hooks"; import { TFormSchema } from "../OrgRoleModifySection.utils"; type Props = { isEditable: boolean; setValue: UseFormSetValue; control: Control; }; enum Permission { NoAccess = "no-access", ReadOnly = "read-only", FullAccess = "full-access", Custom = "custom" } const PERMISSION_ACTIONS = [ { action: OrgPermissionAppConnectionActions.Read, label: "Read" }, { action: OrgPermissionAppConnectionActions.Create, label: "Create" }, { action: OrgPermissionAppConnectionActions.Edit, label: "Modify" }, { action: OrgPermissionAppConnectionActions.Delete, label: "Remove" }, { action: OrgPermissionAppConnectionActions.Connect, label: "Connect" } ] as const; export const OrgPermissionAppConnectionRow = ({ isEditable, control, setValue }: Props) => { const [isRowExpanded, setIsRowExpanded] = useToggle(); const [isCustom, setIsCustom] = useToggle(); const rule = useWatch({ control, name: "permissions.app-connections" }); const selectedPermissionCategory = useMemo(() => { const actions = Object.keys(rule || {}) as Array; const totalActions = PERMISSION_ACTIONS.length; const score = actions.map((key) => (rule?.[key] ? 1 : 0)).reduce((a, b) => a + b, 0 as number); if (isCustom) return Permission.Custom; if (score === 0) return Permission.NoAccess; if (score === totalActions) return Permission.FullAccess; if (score === 1 && rule?.[OrgPermissionAppConnectionActions.Read]) return Permission.ReadOnly; return Permission.Custom; }, [rule, isCustom]); useEffect(() => { if (selectedPermissionCategory === Permission.Custom) setIsCustom.on(); else setIsCustom.off(); }, [selectedPermissionCategory]); useEffect(() => { const isRowCustom = selectedPermissionCategory === Permission.Custom; if (isRowCustom) { setIsRowExpanded.on(); } }, []); const handlePermissionChange = (val: Permission) => { if (!val) return; if (val === Permission.Custom) { setIsRowExpanded.on(); setIsCustom.on(); return; } setIsCustom.off(); switch (val) { case Permission.FullAccess: setValue( "permissions.app-connections", { [OrgPermissionAppConnectionActions.Read]: true, [OrgPermissionAppConnectionActions.Edit]: true, [OrgPermissionAppConnectionActions.Create]: true, [OrgPermissionAppConnectionActions.Delete]: true, [OrgPermissionAppConnectionActions.Connect]: true }, { shouldDirty: true } ); break; case Permission.ReadOnly: setValue( "permissions.app-connections", { [OrgPermissionAppConnectionActions.Read]: true, [OrgPermissionAppConnectionActions.Edit]: false, [OrgPermissionAppConnectionActions.Create]: false, [OrgPermissionAppConnectionActions.Delete]: false, [OrgPermissionAppConnectionActions.Connect]: false }, { shouldDirty: true } ); break; case Permission.NoAccess: default: setValue( "permissions.app-connections", { [OrgPermissionAppConnectionActions.Read]: false, [OrgPermissionAppConnectionActions.Edit]: false, [OrgPermissionAppConnectionActions.Create]: false, [OrgPermissionAppConnectionActions.Delete]: false, [OrgPermissionAppConnectionActions.Connect]: false }, { shouldDirty: true } ); } }; return ( <> setIsRowExpanded.toggle()} > App Connections {isRowExpanded && (
{PERMISSION_ACTIONS.map(({ action, label }) => { return ( ( { if (!isEditable) { createNotification({ type: "error", text: "Failed to update default role" }); return; } field.onChange(e); }} id={`permissions.app-connections.${action}`} > {label} )} /> ); })}
)} ); };