Browse Source

ref(js): Fix typing for OrganizationStore's onUpdate and onChangeSlug (#38780)

Evan Purkhiser 2 years ago
parent
commit
1dafc9fbf7

+ 1 - 1
static/app/actionCreators/organizations.tsx

@@ -145,7 +145,7 @@ export async function fetchOrganizationByMember(
 
   if (addOrg) {
     // add org to SwitchOrganization dropdown
-    OrganizationsStore.add(org);
+    OrganizationsStore.addOrReplace(org);
   }
 
   if (fetchOrgDetails) {

+ 1 - 1
static/app/components/organizations/pageFilters/pageFiltersContainer.spec.jsx

@@ -73,7 +73,7 @@ describe('GlobalSelectionHeader', function () {
     MockApiClient.clearMockResponses();
     ProjectsStore.loadInitialData(organization.projects);
     OrganizationActions.update(organization);
-    OrganizationsStore.add(organization);
+    OrganizationsStore.addOrReplace(organization);
 
     getItem.mockImplementation(() => null);
     MockApiClient.addMockResponse({

+ 1 - 2
static/app/stores/organizationStore.spec.jsx

@@ -1,4 +1,3 @@
-import {updateOrganization} from 'sentry/actionCreators/organizations';
 import OrganizationActions from 'sentry/actions/organizationActions';
 import OrganizationStore from 'sentry/stores/organizationStore';
 
@@ -44,7 +43,7 @@ describe('OrganizationStore', function () {
 
   it('updates correctly from setting changes', async function () {
     const organization = TestStubs.Organization();
-    updateOrganization(organization);
+    OrganizationStore.onUpdate(organization);
     await tick();
     expect(OrganizationStore.get()).toMatchObject({
       loading: false,

+ 19 - 8
static/app/stores/organizationsStore.tsx

@@ -5,16 +5,16 @@ import {Organization} from 'sentry/types';
 import {makeSafeRefluxStore} from 'sentry/utils/makeSafeRefluxStore';
 
 interface OrganizationsStoreDefinition extends StoreDefinition {
-  add(item: Organization): void;
+  addOrReplace(item: Organization): void;
   get(slug: string): Organization | undefined;
 
   getAll(): Organization[];
   getState(): Organization[];
   load(items: Organization[]): void;
   loaded: boolean;
-  onChangeSlug(prev: Organization, next: Organization): void;
+  onChangeSlug(prev: Organization, next: Partial<Organization>): void;
   onRemoveSuccess(slug: string): void;
-  onUpdate(org: Organization): void;
+  onUpdate(org: Partial<Organization>): void;
   remove(slug: string): void;
   state: Organization[];
 }
@@ -36,7 +36,19 @@ const storeConfig: OrganizationsStoreDefinition = {
   },
 
   onUpdate(org) {
-    this.add(org);
+    let match = false;
+    this.state.forEach((existing, idx) => {
+      if (existing.id === org.id) {
+        this.state[idx] = {...existing, ...org};
+        match = true;
+      }
+    });
+    if (!match) {
+      throw new Error(
+        'Cannot update an organization that is not in the OrganizationsStore'
+      );
+    }
+    this.trigger(this.state);
   },
 
   onChangeSlug(prev, next) {
@@ -45,7 +57,7 @@ const storeConfig: OrganizationsStoreDefinition = {
     }
 
     this.remove(prev.slug);
-    this.add(next);
+    this.addOrReplace({...prev, ...next});
   },
 
   onRemoveSuccess(slug) {
@@ -69,12 +81,11 @@ const storeConfig: OrganizationsStoreDefinition = {
     this.trigger(this.state);
   },
 
-  add(item) {
+  addOrReplace(item) {
     let match = false;
     this.state.forEach((existing, idx) => {
       if (existing.id === item.id) {
-        item = {...existing, ...item};
-        this.state[idx] = item;
+        this.state[idx] = {...existing, ...item};
         match = true;
       }
     });

+ 2 - 0
static/app/views/settings/organizationGeneralSettings/index.spec.jsx

@@ -5,6 +5,7 @@ import {initializeOrg} from 'sentry-test/initializeOrg';
 import {mountGlobalModal} from 'sentry-test/modal';
 import {act} from 'sentry-test/reactTestingLibrary';
 
+import OrganizationsStore from 'sentry/stores/organizationsStore';
 import ProjectsStore from 'sentry/stores/projectsStore';
 import OrganizationGeneralSettings from 'sentry/views/settings/organizationGeneralSettings';
 
@@ -17,6 +18,7 @@ describe('OrganizationGeneralSettings', function () {
 
   beforeEach(function () {
     ({organization, routerContext} = initializeOrg());
+    OrganizationsStore.addOrReplace(organization);
     MockApiClient.addMockResponse({
       url: `/organizations/${organization.slug}/auth-provider/`,
       method: 'GET',

+ 1 - 1
static/app/views/settings/organizationMembers/organizationMembersList.spec.jsx

@@ -205,7 +205,7 @@ describe('OrganizationMembersList', function () {
         id: 'active',
       },
     });
-    OrganizationsStore.add(secondOrg);
+    OrganizationsStore.addOrReplace(secondOrg);
 
     const wrapper = mountWithTheme(
       <OrganizationMembersList {...defaultProps} params={{orgId: 'org-id'}} />,