import Icon from "Icons/Icon"; import Spinner from "Icons/Spinner"; import { HTMLProps, useState } from "react"; export interface AsyncIconProps extends HTMLProps { iconName: string; iconSize?: number; loading?: boolean; onClick?: (e: React.MouseEvent) => Promise; } export function AsyncIcon(props: AsyncIconProps) { const [loading, setLoading] = useState(props.loading ?? false); async function handleClick(e: React.MouseEvent) { setLoading(true); try { if (props.onClick) { await props.onClick(e); } } catch (ex) { console.error(ex); } setLoading(false); } const mergedProps = { ...props } as Record; delete mergedProps["iconName"]; delete mergedProps["iconSize"]; delete mergedProps["loading"]; return (
handleClick(e)}> {loading ? : } {props.children}
); }