@coveord/plasma-mantine
Version:
A Plasma flavoured Mantine theme
34 lines (29 loc) • 1.06 kB
text/typescript
import {MouseEvent, MouseEventHandler, useState} from 'react';
/**
* A click handler that supports:
* - Standard MouseEventHandler (receives event, returns void)
* - Async handlers (receives event, returns Promise)
* - Parameterless handlers (no event parameter)
*/
export type ClickHandler<T = HTMLButtonElement> =
| MouseEventHandler<T>
| ((event: MouseEvent<T>) => Promise<void>)
| (() => void)
| (() => Promise<void>);
export const useClickWithLoading = (handler?: ClickHandler<HTMLButtonElement>) => {
const [isLoading, setIsLoading] = useState(false);
const handleClick = async (event: MouseEvent<HTMLButtonElement>) => {
const possiblePromise: unknown = handler?.(event);
try {
if (possiblePromise instanceof Promise) {
setIsLoading(true);
await possiblePromise;
setIsLoading(false);
}
} catch (err) {
setIsLoading(false);
console.error(err);
}
};
return {isLoading, handleClick};
};