diff options
| author | MohamedBassem <me@mbassem.com> | 2024-02-16 21:26:24 +0000 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-02-17 11:49:39 +0000 |
| commit | 9235e9a6fbb364713105137b6bf5bba9d81ecd4c (patch) | |
| tree | 80bc7871ca2b043c110c61b796c46af91cb26e2f /packages/web/components | |
| parent | 6febe13b3f4ad4eff3f205ece445b3577255bf41 (diff) | |
| download | karakeep-9235e9a6fbb364713105137b6bf5bba9d81ecd4c.tar.zst | |
ui: Change action buttons to show a spinner when the request is loading
Diffstat (limited to 'packages/web/components')
| -rw-r--r-- | packages/web/components/ui/action-button.tsx | 25 | ||||
| -rw-r--r-- | packages/web/components/ui/spinner.tsx | 20 |
2 files changed, 45 insertions, 0 deletions
diff --git a/packages/web/components/ui/action-button.tsx b/packages/web/components/ui/action-button.tsx new file mode 100644 index 00000000..42e16f65 --- /dev/null +++ b/packages/web/components/ui/action-button.tsx @@ -0,0 +1,25 @@ +import { Button, ButtonProps } from "./button"; +import LoadingSpinner from "./spinner"; + +export function ActionButton({ + children, + loading, + spinner, + disabled, + ...props +}: ButtonProps & { + loading: boolean; + spinner?: React.ReactNode; +}) { + spinner ||= <LoadingSpinner />; + if (disabled !== undefined) { + disabled ||= loading; + } else if (loading) { + disabled = true; + } + return ( + <Button {...props} disabled={disabled}> + {loading ? spinner : children} + </Button> + ); +} diff --git a/packages/web/components/ui/spinner.tsx b/packages/web/components/ui/spinner.tsx new file mode 100644 index 00000000..adcd2807 --- /dev/null +++ b/packages/web/components/ui/spinner.tsx @@ -0,0 +1,20 @@ +import { cn } from "@/lib/utils"; + +export default function LoadingSpinner({ className }: { className?: string }) { + return ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + fill="none" + stroke="currentColor" + strokeWidth="2" + strokeLinecap="round" + strokeLinejoin="round" + className={cn("animate-spin", className)} + > + <path d="M21 12a9 9 0 1 1-6.219-8.56" /> + </svg> + ); +} |
