From 1db8eee8ea5d9e60a19df25a0f1a8c0f7a32f5b8 Mon Sep 17 00:00:00 2001 From: seriouselly Date: Tue, 16 Jun 2026 22:46:06 +0700 Subject: [PATCH] feat(auth): add placeholders and helper text to improve form UX - Add descriptive placeholders to name, email, and password input fields. - Display a helper text in register mode to guide users on password length requirements. - Adjust password `minLength` validation in the frontend. --- apps/web/src/components/auth-form.tsx | 149 +++++++++++++++++++------- 1 file changed, 109 insertions(+), 40 deletions(-) diff --git a/apps/web/src/components/auth-form.tsx b/apps/web/src/components/auth-form.tsx index 31c1324..c219812 100644 --- a/apps/web/src/components/auth-form.tsx +++ b/apps/web/src/components/auth-form.tsx @@ -1,25 +1,42 @@ -import { FormEvent, useState, useCallback } from 'react'; -import { Eye, EyeOff } from 'lucide-react'; -import { Button } from '@/components/ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import { apiBaseUrl } from '@/lib/api-client'; -import { isTauri, openUrl } from '@/lib/tauri'; +import { FormEvent, useState, useCallback } from "react"; +import { Eye, EyeOff } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { apiBaseUrl } from "@/lib/api-client"; +import { isTauri, openUrl } from "@/lib/tauri"; type AuthFormProps = { - mode: 'login' | 'register'; + mode: "login" | "register"; isSubmitting: boolean; error: string | null; googleOAuthEnabled: boolean; - onSubmit: (payload: { name?: string; email: string; password: string }) => Promise; + onSubmit: (payload: { + name?: string; + email: string; + password: string; + }) => Promise; onFieldChange?: () => void; }; -export function AuthForm({ mode, isSubmitting, error, googleOAuthEnabled, onSubmit, onFieldChange }: AuthFormProps) { - const [name, setName] = useState(''); - const [email, setEmail] = useState(''); - const [password, setPassword] = useState(''); +export function AuthForm({ + mode, + isSubmitting, + error, + googleOAuthEnabled, + onSubmit, + onFieldChange, +}: AuthFormProps) { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); const [showPassword, setShowPassword] = useState(false); async function handleSubmit(event: FormEvent) { @@ -29,7 +46,7 @@ export function AuthForm({ mode, isSubmitting, error, googleOAuthEnabled, onSubm const handleGoogleLogin = useCallback(async (e: React.MouseEvent) => { e.preventDefault(); - const platform = isTauri() ? 'tauri' : 'web'; + const platform = isTauri() ? "tauri" : "web"; const googleUrl = `${apiBaseUrl}/api/v1/auth/google?platform=${platform}`; await openUrl(googleUrl); }, []); @@ -37,59 +54,111 @@ export function AuthForm({ mode, isSubmitting, error, googleOAuthEnabled, onSubm return ( - {mode === 'login' ? 'Masuk Akun ZeaVis Edu' : 'Buat akun ZeaVis Edu'} + + {mode === "login" ? "Masuk Akun ZeaVis Edu" : "Buat akun ZeaVis Edu"} + - {mode === 'login' - ? 'Masuk untuk menyimpan diagnosis dan mengikuti review pakar.' - : 'Daftar untuk menyimpan diagnosis dan mengikuti review pakar.'} + {mode === "login" + ? "Masuk untuk menyimpan diagnosis dan mengikuti review pakar." + : "Daftar untuk menyimpan diagnosis dan mengikuti review pakar."}
- {mode === 'register' && ( + {mode === "register" && (
- { - setName(event.target.value); - onFieldChange?.(); - }} required /> + { + setName(event.target.value); + onFieldChange?.(); + }} + required + />
)}
- { - setEmail(event.target.value); - onFieldChange?.(); - }} required /> + { + setEmail(event.target.value); + onFieldChange?.(); + }} + required + />
- { - setPassword(event.target.value); - onFieldChange?.(); - }} required /> + { + setPassword(event.target.value); + onFieldChange?.(); + }} + required + />
- {error &&

{error}

} + {error && ( +

+ {error} +

+ )}
{googleOAuthEnabled && ( -