diff --git a/packages/app/src/Element/AsyncButton.css b/packages/app/src/Element/AsyncButton.css new file mode 100644 index 0000000..6e544a2 --- /dev/null +++ b/packages/app/src/Element/AsyncButton.css @@ -0,0 +1,14 @@ +button { + position: relative; +} + +.spinner-wrapper { + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + display: flex; + justify-content: center; + align-items: center; +} diff --git a/packages/app/src/Element/AsyncButton.tsx b/packages/app/src/Element/AsyncButton.tsx index 59bdaf8..808b655 100644 --- a/packages/app/src/Element/AsyncButton.tsx +++ b/packages/app/src/Element/AsyncButton.tsx @@ -1,6 +1,9 @@ +import "./AsyncButton.css"; import { useState } from "react"; +import Spinner from "../Icons/Spinner"; interface AsyncButtonProps extends React.ButtonHTMLAttributes { + disabled?: boolean; onClick(e: React.MouseEvent): Promise | void; children?: React.ReactNode; } @@ -9,7 +12,7 @@ export default function AsyncButton(props: AsyncButtonProps) { const [loading, setLoading] = useState(false); async function handle(e: React.MouseEvent) { - if (loading) return; + if (loading || props.disabled) return; setLoading(true); try { if (typeof props.onClick === "function") { @@ -24,8 +27,13 @@ export default function AsyncButton(props: AsyncButtonProps) { } return ( - ); } diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx index 728487d..6fda55b 100644 --- a/packages/app/src/Pages/settings/Profile.tsx +++ b/packages/app/src/Pages/settings/Profile.tsx @@ -16,6 +16,7 @@ import { HexKey } from "@snort/nostr"; import useFileUpload from "Upload"; import messages from "./messages"; +import AsyncButton from "../../Element/AsyncButton"; export interface ProfileSettingsProps { avatar?: boolean; @@ -166,9 +167,9 @@ export default function ProfileSettings(props: ProfileSettingsProps) {
- +