diff --git a/src/StatefulButton/StatefulButtontest.test.jsx b/src/StatefulButton/StatefulButtontest.test.tsx
similarity index 93%
rename from src/StatefulButton/StatefulButtontest.test.jsx
rename to src/StatefulButton/StatefulButtontest.test.tsx
index c8e0dd8b77..dc298f716d 100644
--- a/src/StatefulButton/StatefulButtontest.test.jsx
+++ b/src/StatefulButton/StatefulButtontest.test.tsx
@@ -1,7 +1,7 @@
import React from 'react';
import renderer from 'react-test-renderer';
-import StatefulButton from './index';
+import StatefulButton from '.';
import Icon from '../Icon';
describe('StatefulButton', () => {
@@ -13,7 +13,7 @@ describe('StatefulButton', () => {
complete: 'Saved',
},
className: 'mr-2',
- variant: 'primary',
+ variant: 'primary' as const,
};
const tree = renderer.create((
@@ -39,7 +39,7 @@ describe('StatefulButton', () => {
},
disabledStates: ['pending'],
className: 'mr-2',
- variant: 'primary',
+ variant: 'primary' as const,
};
const tree = renderer.create((
<>
@@ -63,7 +63,7 @@ describe('StatefulButton', () => {
},
disabledStates: ['unedited'],
className: 'mr-2',
- variant: 'primary',
+ variant: 'primary' as const,
};
const tree = renderer.create((
<>
diff --git a/src/StatefulButton/__snapshots__/StatefulButtontest.test.jsx.snap b/src/StatefulButton/__snapshots__/StatefulButtontest.test.tsx.snap
similarity index 100%
rename from src/StatefulButton/__snapshots__/StatefulButtontest.test.jsx.snap
rename to src/StatefulButton/__snapshots__/StatefulButtontest.test.tsx.snap
diff --git a/src/StatefulButton/index.jsx b/src/StatefulButton/index.tsx
similarity index 76%
rename from src/StatefulButton/index.jsx
rename to src/StatefulButton/index.tsx
index 5d7da83a4f..1db46ff395 100644
--- a/src/StatefulButton/index.jsx
+++ b/src/StatefulButton/index.tsx
@@ -1,19 +1,61 @@
import React from 'react';
-import PropTypes from 'prop-types';
import classNames from 'classnames';
import { Cancel, CheckCircleOutline, SpinnerSimple } from '../../icons';
import Button from '../Button';
import Icon from '../Icon';
+export interface StatefulButtonProps extends React.ComponentPropsWithoutRef {
+ /** Optionally specify additional CSS classes to give this button. */
+ className?: string;
+ /**
+ * Each state has:
+ * - A label (required)
+ * - An icon
+ * - an option to be disabled
+ *
+ * Control the state with the `state` prop. Example usage:
+ *
+ * ```jsx
+ * ,
+ * pending: ,
+ * complete: ,
+ * }}
+ * disabledStates=['pending']
+ * className='btn-primary mr-2'
+ * />
+ * ```
+ */
+ state?: string;
+ /** Each state has a `label`. Required. */
+ labels: { [key: string]: React.ReactNode };
+ /** Each state has an `icon`. */
+ icons?: { [key: string]: React.ReactNode };
+ /** Each state has a `disabledState` */
+ disabledStates?: string[];
+}
+
function StatefulButton({
className,
- state,
+ state = 'default',
labels,
- icons,
- disabledStates,
+ icons = {
+ default: undefined,
+ pending: ,
+ complete: ,
+ error: ,
+ },
+ disabledStates = ['pending', 'complete'],
onClick,
...attributes
-}) {
+}: StatefulButtonProps) {
const isDisabled = disabledStates.indexOf(state) !== -1;
const icon = icons[state] !== undefined ? icons[state] : icons.default;
const label = labels[state] !== undefined ? labels[state] : labels.default;
@@ -51,56 +93,4 @@ function StatefulButton({
);
}
-StatefulButton.propTypes = {
- className: PropTypes.string,
- /**
- * Each state has:
- * - A label (required)
- * - An icon
- * - an option to be disabled
- *
- * Control the state with the `state` prop. Example usage:
- *
- * ```jsx
- * ,
- * pending: ,
- * complete: ,
- * }}
- * disabledStates=['pending']
- * className='btn-primary mr-2'
- * />
- * ```
- */
- state: PropTypes.string,
- /** Required. Each state has a `label`. */
- labels: PropTypes.objectOf(PropTypes.node).isRequired,
- /** Required. Each state has an `icon`. */
- icons: PropTypes.objectOf(PropTypes.node),
- /** Required. Each state has a `disabledState` */
- disabledStates: PropTypes.arrayOf(PropTypes.string),
- /** Specifies the callback function when the button is clicked */
- onClick: PropTypes.func,
-};
-
-StatefulButton.defaultProps = {
- className: undefined,
- state: 'default',
- icons: {
- default: undefined,
- pending: ,
- complete: ,
- error: ,
- },
- disabledStates: ['pending', 'complete'],
- onClick: undefined,
-};
-
export default StatefulButton;
diff --git a/src/index.ts b/src/index.ts
index 7e11e26a8c..57294c7c51 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -45,6 +45,7 @@ export { default as Overlay, OverlayTrigger } from './Overlay';
export { default as Portal } from './Modal/Portal';
export { default as Spinner } from './Spinner';
export { default as Stack } from './Stack';
+export { default as StatefulButton } from './StatefulButton';
export { default as Toast, TOAST_CLOSE_LABEL_TEXT, TOAST_DELAY } from './Toast';
export { default as Tooltip } from './Tooltip';
export { default as useWindowSize, type WindowSizeData } from './hooks/useWindowSizeHook';
@@ -165,8 +166,6 @@ export {
export { default as Sheet } from './Sheet';
// @ts-ignore: has yet to be converted to TypeScript
export { default as Stepper } from './Stepper';
-// @ts-ignore: has yet to be converted to TypeScript
-export { default as StatefulButton } from './StatefulButton';
export {
default as Tabs,
Tab,