disable button when wating for response

This commit is contained in:
Sebastian 2022-08-18 12:48:05 -03:00
parent 62713c7e71
commit 23bb82f00c
No known key found for this signature in database
GPG Key ID: BE4FF68352439FC1
2 changed files with 42 additions and 2 deletions

View File

@ -39,6 +39,33 @@ const Stack = styled.div`
background-color: white;
`;
export const WithDelay = (): VNode => (
<Stack>
<Button
size="small"
variant="contained"
onClick={() =>
new Promise((resolve) => {
setTimeout(resolve, 2000);
})
}
>
Returns after 2 seconds
</Button>
<Button
size="small"
variant="contained"
onClick={() =>
new Promise((_, reject) => {
setTimeout(reject, 2000);
})
}
>
Fails after 2 seconds
</Button>
</Stack>
);
export const BasicExample = (): VNode => (
<Fragment>
<Stack>

View File

@ -19,6 +19,7 @@ import { css } from "@linaria/core";
import { theme, Colors, rippleEnabled, rippleEnabledOutlined } from "./style";
// eslint-disable-next-line import/extensions
import { alpha } from "./colors/manipulation";
import { useState } from "preact/hooks";
export const buttonBaseStyle = css`
display: inline-flex;
@ -219,7 +220,7 @@ export function Button({
size = "medium",
style: parentStyle,
color = "primary",
onClick,
onClick: doClick,
}: Props): VNode {
const style = css`
user-select: none;
@ -275,9 +276,21 @@ export function Button({
}}
/>
);
const [running, setRunning] = useState(false);
async function onClick(): Promise<void> {
if (!doClick || disabled || running) return;
setRunning(true);
try {
await doClick();
} finally {
setRunning(false);
}
}
return (
<ButtonBase
disabled={disabled}
disabled={disabled || running}
class={[
theme.typography.button,
theme.shape.roundBorder,