import * as React from 'react'; import { Spinner, Box, Text, Heading } from '@gluestack-ui/themed'; import { PermissionType, Visibility, IConfigurationsFlattenedKeys } from 'common'; import { IPreDefinedPermissions } from '@adminide-stack/core'; import { useSetting, usePermissionAutoFetch } from '@adminide-stack/platform-client'; import { get } from 'lodash-es'; import { URI } from '@vscode-alt/monaco-editor/esm/vs/base/common/uri'; export interface IWithConfigurationProps { children?: React.ReactElement; configKey: IConfigurationsFlattenedKeys; permissionKeys?: IPreDefinedPermissions[]; permissionTypes?: PermissionType[]; resourceName?: string; settingsUri?: URI; } export const WithConfiguration = (props: IWithConfigurationProps) => { const { configKey, children, permissionKeys, resourceName, permissionTypes } = props; const { data, loading: settingsLoading, updateConfiguration: _, } = useSetting({ configKey, overrides: { resource: props.settingsUri }, }); // const { data: permissions, loading: permissionLoading } = usePermissionAutoFetch(); const { permissions, loading: permissionLoading } = usePermissionAutoFetch(); const isPrivate = React.useMemo(() => Visibility.Private === data, [data]); const hasPermission = React.useMemo(() => { if (isPrivate && permissions && Array.isArray(permissionKeys)) { return permissionKeys.some((key) => permissionTypes.includes(get(permissions?.resolveConfiguration, key))); } return false; }, [isPrivate, permissions]); const isLoading = React.useMemo(() => permissionLoading || settingsLoading, [permissionLoading, settingsLoading]); if (isLoading) { return ; } // if public or has permission if (!isPrivate || hasPermission) { return children; } if (!hasPermission) { return ( Missing Permission {`You don't have the required permission to access ${resourceName || 'this resource'} `} ); } return ( {`Private ${resourceName || 'Resource'}`} {`You are trying to access private ${resourceName || 'resource'}.`} ); }; WithConfiguration.defaultProps = { permissionTypes: [PermissionType.Allow], }; export const WithConfigurationContainer = (props: IWithConfigurationProps) => ;