diff --git a/webapp/channels/src/components/apps_form/__snapshots__/apps_form_component.test.tsx.snap b/webapp/channels/src/components/apps_form/__snapshots__/apps_form_component.test.tsx.snap
index 0806e07026..75de35fe3b 100644
--- a/webapp/channels/src/components/apps_form/__snapshots__/apps_form_component.test.tsx.snap
+++ b/webapp/channels/src/components/apps_form/__snapshots__/apps_form_component.test.tsx.snap
@@ -202,7 +202,7 @@ exports[`AppsFormComponent should set match snapshot 1`] = `
id="interactive_dialog.cancel"
/>
-
-
+
diff --git a/webapp/channels/src/components/emoji/add_emoji/__snapshots__/add_emoji.test.tsx.snap b/webapp/channels/src/components/emoji/add_emoji/__snapshots__/add_emoji.test.tsx.snap
index adc2248895..8afd84738a 100644
--- a/webapp/channels/src/components/emoji/add_emoji/__snapshots__/add_emoji.test.tsx.snap
+++ b/webapp/channels/src/components/emoji/add_emoji/__snapshots__/add_emoji.test.tsx.snap
@@ -121,8 +121,9 @@ exports[`components/emoji/components/AddEmoji should match snapshot 1`] = `
id="add_emoji.cancel"
/>
-
-
+
@@ -296,8 +297,9 @@ exports[`components/emoji/components/AddEmoji should select a file and match sna
id="add_emoji.cancel"
/>
-
-
+
@@ -435,8 +437,9 @@ exports[`components/emoji/components/AddEmoji should update emoji name and match
id="add_emoji.cancel"
/>
-
-
+
diff --git a/webapp/channels/src/components/emoji/add_emoji/add_emoji.test.tsx b/webapp/channels/src/components/emoji/add_emoji/add_emoji.test.tsx
index 0922c5bd16..6041ad98c7 100644
--- a/webapp/channels/src/components/emoji/add_emoji/add_emoji.test.tsx
+++ b/webapp/channels/src/components/emoji/add_emoji/add_emoji.test.tsx
@@ -202,7 +202,7 @@ describe('components/emoji/components/AddEmoji', () => {
const file = new Blob([image], {type: 'image/png'});
wrapper.setState({image: file as File, imageUrl: image});
- const saveButton = wrapper.find('SpinnerButton').first();
+ const saveButton = wrapper.find({'data-testid': 'save-button'}).first();
const nameInput = wrapper.find('#name');
nameInput.simulate('change', {target: {name: 'name', value: emojiName}});
diff --git a/webapp/channels/src/components/emoji/add_emoji/add_emoji.tsx b/webapp/channels/src/components/emoji/add_emoji/add_emoji.tsx
index 034c2e92cb..9a3af6a9aa 100644
--- a/webapp/channels/src/components/emoji/add_emoji/add_emoji.tsx
+++ b/webapp/channels/src/components/emoji/add_emoji/add_emoji.tsx
@@ -385,6 +385,7 @@ export default class AddEmoji extends React.PureComponent
-
-
+
renderExtra
@@ -859,7 +859,7 @@ exports[`components/integrations/AbstractCommand should match snapshot when head
id="add_command.cancel"
/>
-
Footer as string
-
+
renderExtra
@@ -1302,7 +1302,7 @@ exports[`components/integrations/AbstractCommand should match snapshot, displays
id="add_command.cancel"
/>
-
-
+
renderExtra
diff --git a/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap b/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap
index 9f7731e767..9a1bf54117 100644
--- a/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap
+++ b/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap
@@ -242,7 +242,7 @@ exports[`components/integrations/AbstractIncomingWebhook should call action func
id="add_incoming_webhook.cancel"
/>
-
-
+
@@ -503,7 +503,7 @@ exports[`components/integrations/AbstractIncomingWebhook should match snapshot 1
id="add_incoming_webhook.cancel"
/>
-
-
+
@@ -767,7 +767,7 @@ exports[`components/integrations/AbstractIncomingWebhook should match snapshot,
id="add_incoming_webhook.cancel"
/>
-
-
+
@@ -995,7 +995,7 @@ exports[`components/integrations/AbstractIncomingWebhook should match snapshot,
id="add_incoming_webhook.cancel"
/>
-
-
+
@@ -1223,7 +1223,7 @@ exports[`components/integrations/AbstractIncomingWebhook should match snapshot,
id="add_incoming_webhook.cancel"
/>
-
-
+
@@ -1484,7 +1484,7 @@ exports[`components/integrations/AbstractIncomingWebhook should match snapshot,
id="add_incoming_webhook.cancel"
/>
-
-
+
diff --git a/webapp/channels/src/components/integrations/__snapshots__/abstract_oauth_app.test.tsx.snap b/webapp/channels/src/components/integrations/__snapshots__/abstract_oauth_app.test.tsx.snap
index a52c83bc56..bf9598aec8 100644
--- a/webapp/channels/src/components/integrations/__snapshots__/abstract_oauth_app.test.tsx.snap
+++ b/webapp/channels/src/components/integrations/__snapshots__/abstract_oauth_app.test.tsx.snap
@@ -283,7 +283,7 @@ https://test.com/callback2"
id="installed_oauth_apps.cancel"
/>
-
-
+
renderExtra
@@ -590,7 +590,7 @@ exports[`components/integrations/AbstractOAuthApp should match snapshot, display
id="installed_oauth_apps.cancel"
/>
-
-
+
renderExtra
diff --git a/webapp/channels/src/components/integrations/__snapshots__/abstract_outgoing_webhook.test.tsx.snap b/webapp/channels/src/components/integrations/__snapshots__/abstract_outgoing_webhook.test.tsx.snap
index b16dea427b..5f0dc450ef 100644
--- a/webapp/channels/src/components/integrations/__snapshots__/abstract_outgoing_webhook.test.tsx.snap
+++ b/webapp/channels/src/components/integrations/__snapshots__/abstract_outgoing_webhook.test.tsx.snap
@@ -328,7 +328,7 @@ callbackUrl2.com
id="add_outgoing_webhook.cancel"
/>
-
-
+
diff --git a/webapp/channels/src/components/integrations/bots/add_bot/__snapshots__/add_bot.test.tsx.snap b/webapp/channels/src/components/integrations/bots/add_bot/__snapshots__/add_bot.test.tsx.snap
index db0f8518e7..b012fbe637 100644
--- a/webapp/channels/src/components/integrations/bots/add_bot/__snapshots__/add_bot.test.tsx.snap
+++ b/webapp/channels/src/components/integrations/bots/add_bot/__snapshots__/add_bot.test.tsx.snap
@@ -337,7 +337,7 @@ exports[`components/integrations/bots/AddBot blank 1`] = `
id="bots.manage.add.cancel"
/>
-
-
+
diff --git a/webapp/channels/src/components/spinner_button.test.tsx b/webapp/channels/src/components/spinner_button.test.tsx
index 24106ab470..186adaae5a 100644
--- a/webapp/channels/src/components/spinner_button.test.tsx
+++ b/webapp/channels/src/components/spinner_button.test.tsx
@@ -61,6 +61,7 @@ describe('components/SpinnerButton', () => {
id='my-button-id'
className='btn btn-success'
spinningText='Test'
+ spinning={false}
/>,
);
diff --git a/webapp/channels/src/components/spinner_button.tsx b/webapp/channels/src/components/spinner_button.tsx
index 408194eceb..b8daa88069 100644
--- a/webapp/channels/src/components/spinner_button.tsx
+++ b/webapp/channels/src/components/spinner_button.tsx
@@ -1,37 +1,35 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
-import React, {PureComponent} from 'react';
-import type {ButtonHTMLAttributes, ReactNode} from 'react';
+import React from 'react';
+import type {ReactNode} from 'react';
import LoadingWrapper from 'components/widgets/loading/loading_wrapper';
-type Props = {
+type Props = React.ButtonHTMLAttributes & {
children?: ReactNode;
spinning: boolean;
spinningText: ReactNode;
}
-export default class SpinnerButton extends PureComponent> {
- public static defaultProps: Partial = {
- spinning: false,
- };
-
- public render(): JSX.Element {
- const {spinning, spinningText, children, ...props} = this.props;
-
- return (
-
+ );
+};
+export default React.memo(SpinnerButton);