Skip to content

Commit

Permalink
Persist auth spinner (vercel#503)
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremyphilemon authored Nov 8, 2024
1 parent 729634e commit 58117f9
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 7 deletions.
4 changes: 3 additions & 1 deletion app/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default function Page() {
const router = useRouter();

const [email, setEmail] = useState('');
const [isSuccessful, setIsSuccessful] = useState(false);

const [state, formAction] = useActionState<LoginActionState, FormData>(
login,
Expand All @@ -28,6 +29,7 @@ export default function Page() {
} else if (state.status === 'invalid_data') {
toast.error('Failed validating your submission!');
} else if (state.status === 'success') {
setIsSuccessful(true);
router.refresh();
}
}, [state.status, router]);
Expand All @@ -47,7 +49,7 @@ export default function Page() {
</p>
</div>
<AuthForm action={handleSubmit} defaultEmail={email}>
<SubmitButton>Sign in</SubmitButton>
<SubmitButton isSuccessful={isSuccessful}>Sign in</SubmitButton>
<p className="text-center text-sm text-gray-600 mt-4 dark:text-zinc-400">
{"Don't have an account? "}
<Link
Expand Down
5 changes: 4 additions & 1 deletion app/(auth)/register/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ export default function Page() {
const router = useRouter();

const [email, setEmail] = useState('');
const [isSuccessful, setIsSuccessful] = useState(false);

const [state, formAction] = useActionState<RegisterActionState, FormData>(
register,
{
Expand All @@ -30,6 +32,7 @@ export default function Page() {
toast.error('Failed validating your submission!');
} else if (state.status === 'success') {
toast.success('Account created successfully');
setIsSuccessful(true);
router.refresh();
}
}, [state, router]);
Expand All @@ -49,7 +52,7 @@ export default function Page() {
</p>
</div>
<AuthForm action={handleSubmit} defaultEmail={email}>
<SubmitButton>Sign Up</SubmitButton>
<SubmitButton isSuccessful={isSuccessful}>Sign Up</SubmitButton>
<p className="text-center text-sm text-gray-600 mt-4 dark:text-zinc-400">
{'Already have an account? '}
<Link
Expand Down
18 changes: 13 additions & 5 deletions components/custom/submit-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,32 @@ import { LoaderIcon } from '@/components/custom/icons';

import { Button } from '../ui/button';

export function SubmitButton({ children }: { children: React.ReactNode }) {
export function SubmitButton({
children,
isSuccessful,
}: {
children: React.ReactNode;
isSuccessful: boolean;
}) {
const { pending } = useFormStatus();

return (
<Button
type={pending ? 'button' : 'submit'}
aria-disabled={pending}
disabled={pending}
aria-disabled={pending || isSuccessful}
disabled={pending || isSuccessful}
className="relative"
>
{children}
{pending && (

{(pending || isSuccessful) && (
<span className="animate-spin absolute right-4">
<LoaderIcon />
</span>
)}

<span aria-live="polite" className="sr-only" role="status">
{pending ? 'Loading' : 'Submit form'}
{pending || isSuccessful ? 'Loading' : 'Submit form'}
</span>
</Button>
);
Expand Down

0 comments on commit 58117f9

Please sign in to comment.