Mobile support to come.
"use client";
import { useEffect, useActionState, useState, useRef } from "react";
import { signup } from "@/actions";
import { cn, validateEmail, validateUsername } from "@/util";
import { useIsTyping } from "@/hooks/use-is-typing";
export default function SignupForm({ redirect }: { redirect?: string }) {
const [state, formAction, isPending] = useActionState(signup, null);
const [username, setUsername] = useState("");
const [email, setEmail] = useState("");
const [canSubmit, setCanSubmit] = useState(false);
const isTyping = useIsTyping(username, email);
const usernameRef = useRef<HTMLInputElement>(null);
useEffect(() => {
if (!isTyping) {
setCanSubmit(
validateEmail(email) && validateUsername(username) && !isPending,
);
}
}, [email, username, isTyping, isPending]);
return (
<form action={formAction} className="flex flex-col text-sm w-sm" noValidate>
<p className="pb-2">Sign up.</p>
<input
type="email"
name="email"
placeholder="Email"
value={email}
onChange={(e) => setEmail(e.target.value)}
onKeyDown={(e) => {
if (e.key === 'Enter') {
e.preventDefault();
usernameRef.current?.focus();
}
}}
className="border-border border-b mb-2 ring-0 outline-0 focus:border-black transition-colors duration-150"
/>
<input
type="text"
name="username"
placeholder="Username"
value={username}
onChange={(e) => setUsername(e.target.value)}
className="border-border border-b mb-2 ring-0 outline-0 focus:border-black transition-colors duration-150"
/>
{redirect && <input type="hidden" name="redirect" value={redirect} /> }
<div className="flex flex-row w-full justify-between">
<div className="flex">
{state && "error" in state && (
<p className="text-red-500">{state.error}</p>
)}
</div>
<button
type="submit"
className={cn(
"cursor-pointer underline transition-all duration-300",
canSubmit ? "decoration-current" : "decoration-transparent",
isPending ? "cursor-default" : "",
)}
disabled={isPending}
>
{isPending ? "Submitting..." : "Submit."}
</button>
</div>
</form>
);
}
making signup form also work without js, minimal as is
baepaul•d3a1bea1d ago
refactoring validate user -> hasUser and wiring up signup form
baepaul•3fea7211d ago
updating sign up to use signin with otp instead
baepaul•7d504ea2d ago
for the subways
baepaul•96d95bd2d ago
created temporary signup page
mikkel•5a9138b3d ago
pulling in front-end code
baepaul•7c005641mo ago