From 05862533f83d8910a5b21488bbfb57b62d80cf20 Mon Sep 17 00:00:00 2001 From: filip mertens Date: Thu, 26 Aug 2021 09:35:07 +0200 Subject: [PATCH] fix permission state handling --- .../lib/components/permissionsSettings.tsx | 153 ++++++++---------- 1 file changed, 68 insertions(+), 85 deletions(-) diff --git a/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx b/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx index 1ed239c1d5..900d6806c1 100644 --- a/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx +++ b/libs/remix-ui/plugin-manager/src/lib/components/permissionsSettings.tsx @@ -1,32 +1,19 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import React, { Fragment, useEffect, useState } from 'react' +import React, { Fragment, useState } from 'react' /* eslint-disable-line */ import { ModalDialog } from '@remix-ui/modal-dialog' import useLocalStorage from '../custom-hooks/useLocalStorage' import { PluginPermissions } from '../../types' -// import { PluginManagerSettings, PluginPermissions } from '../../types' interface PermissionSettingsProps { pluginSettings: any } function PermisssionsSettings ({ pluginSettings }: PermissionSettingsProps) { - /** - * Declare component local state - */ + const [modalVisibility, setModalVisibility] = useState(true) const [permissions, setPermissions] = useLocalStorage('plugins/permissions', {} as PluginPermissions) - const [checkBoxState, setCheckBoxState] = useState(() => { - const newAllowValues = [] - Object.keys(permissions).map(topName => { - Object.keys(permissions[topName]).map(methodName => { - Object.keys(permissions[topName][methodName]).map(pluginName => { - newAllowValues.push(permissions[topName][methodName][pluginName].allow) - }) - }) - }) - return newAllowValues - }) + const closeModal = () => setModalVisibility(true) const openModal = () => { const currentValue = JSON.parse(window.localStorage.getItem('plugins/permissions') || '{}') @@ -34,29 +21,40 @@ function PermisssionsSettings ({ pluginSettings }: PermissionSettingsProps) { setModalVisibility(!modalVisibility) } - const handleCheckboxClick = (position: number) => { - const updatedCheckedState = checkBoxState.map((item, index) => - index === position ? !item : item - ) - setCheckBoxState(updatedCheckedState) - checkBoxState.map(value => { - Object.keys(permissions).map(topName => { - Object.keys(permissions[topName]).map(methodName => { - Object.keys(permissions[topName][methodName]).map(pluginName => { + const getState = (targetPlugin:string, funcName:string, pluginName :string) => { + return permissions[targetPlugin][funcName][pluginName].allow + } + + const handleCheckboxClick = (targetPlugin:string, funcName:string, pluginName :string) => { + setPermissions((permissions) => { + permissions[targetPlugin][funcName][pluginName].allow = !permissions[targetPlugin][funcName][pluginName].allow + return permissions + }) + } + + function clearFunctionPermission (targetPlugin:string, funcName:string, pluginName :string) { + setPermissions((permissions) => { + delete permissions[targetPlugin][funcName][pluginName] + if (Object.keys(permissions[targetPlugin][funcName]).length === 0) delete permissions[targetPlugin][funcName] + if (Object.keys(permissions[targetPlugin]).length === 0) delete permissions[targetPlugin] + return permissions + }) + } - }) - }) - }) + function clearTargetPermission (targetPlugin: string) { + setPermissions((permissions) => { + delete permissions[targetPlugin] + return permissions }) } - function ShowPluginHeading ({ headingName }) { + function RenderPluginHeader ({ headingName }) { return (

{headingName} permissions:

{ - clearPersmission(headingName) + clearTargetPermission(headingName) }} className="far fa-trash-alt" data-id={`pluginManagerSettingsClearAllPermission-${headingName}`}> @@ -66,26 +64,39 @@ function PermisssionsSettings ({ pluginSettings }: PermissionSettingsProps) { ) } - function clearAllPersmissions (pluginName: string, topLevelPluginName: string, funcName: string) { - const permissionsCopy = permissions // don't mutate state - if (permissionsCopy[topLevelPluginName] && permissionsCopy[topLevelPluginName][funcName]) { - delete permissionsCopy[topLevelPluginName][funcName][pluginName] - if (Object.keys(permissionsCopy[topLevelPluginName][funcName]).length === 0) { - delete permissionsCopy[topLevelPluginName][funcName] - } - if (Object.keys(permissionsCopy[topLevelPluginName]).length === 0) { - delete permissionsCopy[topLevelPluginName] - } - } - setPermissions(permissionsCopy) - } - - function clearPersmission (topLevelPluginName: string) { - const permissionsCopy = permissions - if (permissionsCopy[topLevelPluginName]) { - delete permissionsCopy[topLevelPluginName] - } - setPermissions({} as PluginPermissions) + function RenderPermissions ({ targetPlugin }) { + return <>{Object.keys(permissions[targetPlugin]).map(funcName => { + return Object.keys(permissions[targetPlugin][funcName]).map((pluginName, index) => ( +
+ { permissions && Object.keys(permissions).length > 0 + ? ( + <>
+ + handleCheckboxClick(targetPlugin, funcName, pluginName)} + checked={getState(targetPlugin, funcName, pluginName)} + id={`permission-checkbox-${targetPlugin}-${funcName}-${pluginName}`} + aria-describedby={`module ${pluginName} asks permission for ${funcName}`} /> + + +
{ + clearFunctionPermission(targetPlugin, funcName, pluginName) + } } + className="fa fa-trash-alt" + data-id={`pluginManagerSettingsRemovePermission-${targetPlugin}-${funcName}-${targetPlugin}`} /> + ) : null + } +
+ )) + })} } return ( @@ -104,44 +115,16 @@ function PermisssionsSettings ({ pluginSettings }: PermissionSettingsProps) {
{ - Object.keys(permissions).map(toplevelName => ( - + Object.keys(permissions).map(targetPlugin => ( + <> + + + )) } { - permissions && Object.keys(permissions).length > 0 ? Object.keys(permissions).map(topName => { - return Object.keys(permissions[topName]).map(funcName => { - return Object.keys(permissions[topName][funcName]).map((pluginName, index) => ( -
- { permissions && Object.keys(permissions).length > 0 - ? ( - <>
- - handleCheckboxClick(index)} - checked={checkBoxState[index]} - id={`permission-checkbox-${topName}-${funcName}-${pluginName}`} - aria-describedby={`module ${pluginName} asks permission for ${funcName}`} /> - - -
{ - clearAllPersmissions(pluginName, topName, funcName) - } } - className="fa fa-trash-alt" - data-id={`pluginManagerSettingsRemovePermission-${topName}-${funcName}-${topName}`} /> - ) : null - } -
- )) - }) + permissions && Object.keys(permissions).length > 0 ? Object.keys(permissions).map(targetPlugin => { + }) : null }