Browse Source

ref(ts): Fix implicit any in PermissionSelection (#32519)

Evan Purkhiser 3 years ago
parent
commit
68dfcba789

+ 3 - 2
static/app/constants/index.tsx

@@ -1,7 +1,7 @@
 /* global process */
 
 import {t} from 'sentry/locale';
-import {DataCategory, Scope} from 'sentry/types';
+import {DataCategory, PermissionResource, Scope} from 'sentry/types';
 
 /**
  * Common constants here
@@ -83,6 +83,7 @@ export type PermissionChoice = {
   label: 'No Access' | 'Read' | 'Read & Write' | 'Admin';
   scopes: Scope[];
 };
+
 type PermissionObj = {
   choices: {
     admin: PermissionChoice;
@@ -91,7 +92,7 @@ type PermissionObj = {
     write?: PermissionChoice;
   };
   help: string;
-  resource: 'Project' | 'Team' | 'Release' | 'Event' | 'Organization' | 'Member';
+  resource: PermissionResource;
   label?: string;
 };
 

+ 2 - 0
static/app/types/integrations.tsx

@@ -23,6 +23,8 @@ export type Permissions = {
   Team: PermissionValue;
 };
 
+export type PermissionResource = keyof Permissions;
+
 export type ExternalActorMapping = {
   externalName: string;
   id: string;

+ 13 - 7
static/app/views/settings/organizationDeveloperSettings/permissionSelection.tsx

@@ -6,7 +6,7 @@ import FormContext from 'sentry/components/forms/formContext';
 import SelectField from 'sentry/components/forms/selectField';
 import {SENTRY_APP_PERMISSIONS} from 'sentry/constants';
 import {t} from 'sentry/locale';
-import {Permissions} from 'sentry/types/index';
+import {PermissionResource, Permissions, PermissionValue} from 'sentry/types/index';
 
 /**
  * Custom form element that presents API scopes in a resource-centric way. Meaning
@@ -88,6 +88,10 @@ type State = {
   permissions: Permissions;
 };
 
+function findResource(r: PermissionResource) {
+  return find(SENTRY_APP_PERMISSIONS, ['resource', r]);
+}
+
 export default class PermissionSelection extends Component<Props, State> {
   state: State = {
     permissions: this.props.permissions,
@@ -104,20 +108,19 @@ export default class PermissionSelection extends Component<Props, State> {
    */
   permissionStateToList() {
     const {permissions} = this.state;
-    const findResource = r => find(SENTRY_APP_PERMISSIONS, ['resource', r]);
     return flatMap(
       Object.entries(permissions),
-      ([r, p]) => findResource(r)?.choices?.[p]?.scopes
+      ([r, p]) => findResource(r as PermissionResource)?.choices?.[p]?.scopes
     );
   }
 
-  onChange = (resource, choice) => {
+  onChange = (resource: PermissionResource, choice: PermissionValue) => {
     const {permissions} = this.state;
     permissions[resource] = choice;
     this.save(permissions);
   };
 
-  save = permissions => {
+  save = (permissions: Permissions) => {
     this.setState({permissions});
     this.props.onChange(permissions);
     this.context.form.setValue('scopes', this.permissionStateToList());
@@ -129,8 +132,11 @@ export default class PermissionSelection extends Component<Props, State> {
     return (
       <Fragment>
         {SENTRY_APP_PERMISSIONS.map(config => {
-          const toOption = ([value, {label}]) => ({value, label});
-          const options = Object.entries(config.choices).map(toOption);
+          const options = Object.entries(config.choices).map(([value, {label}]) => ({
+            value,
+            label,
+          }));
+
           const value = permissions[config.resource];
 
           return (