mirror of
https://github.com/AmruthPillai/Reactive-Resume.git
synced 2025-11-09 20:12:26 +10:00
- normalize username and email fields to lowercase, resolves #1740
- add autoComplete attributes to auth flow for easier sign in/sign up
This commit is contained in:
@ -77,6 +77,7 @@ export const BackupOtpPage = () => {
|
||||
<Input
|
||||
pattern="[a-z0-9]{10}"
|
||||
placeholder="a1b2c3d4e5"
|
||||
autoComplete="one-time-code"
|
||||
title={t`Backup Codes may contain only lowercase letters or numbers, and must be exactly 10 characters.`}
|
||||
{...field}
|
||||
/>
|
||||
|
||||
@ -81,7 +81,7 @@ export const ForgotPasswordPage = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Email`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input placeholder="john.doe@example.com" {...field} />
|
||||
<Input placeholder="john.doe@example.com" autoComplete="email" {...field} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
|
||||
@ -89,7 +89,12 @@ export const LoginPage = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Email`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input placeholder="john.doe@example.com" {...field} />
|
||||
<Input
|
||||
autoComplete="email"
|
||||
className="lowercase"
|
||||
placeholder="john.doe@example.com"
|
||||
{...field}
|
||||
/>
|
||||
</FormControl>
|
||||
<FormDescription>{t`You can also enter your username.`}</FormDescription>
|
||||
<FormMessage />
|
||||
@ -104,7 +109,7 @@ export const LoginPage = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Password`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="password" {...field} />
|
||||
<Input type="password" autoComplete="password" {...field} />
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
<Trans>
|
||||
|
||||
@ -119,6 +119,7 @@ export const RegisterPage = () => {
|
||||
<FormLabel>{t`Username`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input
|
||||
className="lowercase"
|
||||
placeholder={t({
|
||||
message: "john.doe",
|
||||
context:
|
||||
@ -140,6 +141,7 @@ export const RegisterPage = () => {
|
||||
<FormLabel>{t`Email`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input
|
||||
className="lowercase"
|
||||
placeholder={t({
|
||||
message: "john.doe@example.com",
|
||||
context:
|
||||
|
||||
@ -82,7 +82,7 @@ export const ResetPasswordPage = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Password`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="password" {...field} />
|
||||
<Input type="password" autoComplete="new-password" {...field} />
|
||||
</FormControl>
|
||||
<FormDescription>
|
||||
<Trans>
|
||||
|
||||
@ -81,7 +81,7 @@ export const VerifyOtpPage = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`One-Time Password`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input placeholder="123456" {...field} />
|
||||
<Input placeholder="123456" autoComplete="one-time-code" {...field} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
|
||||
@ -151,7 +151,7 @@ export const AccountSettings = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Name`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input {...field} />
|
||||
<Input autoComplete="name" {...field} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
@ -165,7 +165,7 @@ export const AccountSettings = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Username`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input {...field} />
|
||||
<Input autoComplete="username" className="lowercase" {...field} />
|
||||
</FormControl>
|
||||
<FormMessage />
|
||||
</FormItem>
|
||||
@ -179,7 +179,7 @@ export const AccountSettings = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Email`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="email" {...field} />
|
||||
<Input type="email" autoComplete="email" className="lowercase" {...field} />
|
||||
</FormControl>
|
||||
<FormDescription
|
||||
className={cn(
|
||||
|
||||
@ -84,7 +84,7 @@ export const SecuritySettings = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`New Password`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="password" {...field} />
|
||||
<Input type="password" autoComplete="new-password" {...field} />
|
||||
</FormControl>
|
||||
</FormItem>
|
||||
)}
|
||||
@ -97,7 +97,7 @@ export const SecuritySettings = () => {
|
||||
<FormItem>
|
||||
<FormLabel>{t`Confirm New Password`}</FormLabel>
|
||||
<FormControl>
|
||||
<Input type="password" {...field} />
|
||||
<Input type="password" autoComplete="new-password" {...field} />
|
||||
</FormControl>
|
||||
{fieldState.error && (
|
||||
<FormDescription className="text-error-foreground">
|
||||
|
||||
@ -9,9 +9,9 @@ type Statistic = {
|
||||
|
||||
export const StatisticsSection = () => {
|
||||
const stats: Statistic[] = [
|
||||
{ name: t`GitHub Stars`, value: 19_500 },
|
||||
{ name: t`Users Signed Up`, value: 500_000 },
|
||||
{ name: t`Resumes Generated`, value: 700_000 },
|
||||
{ name: t`GitHub Stars`, value: 27_000 },
|
||||
{ name: t`Users Signed Up`, value: 650_000 },
|
||||
{ name: t`Resumes Generated`, value: 840_000 },
|
||||
];
|
||||
|
||||
return (
|
||||
|
||||
@ -5,7 +5,7 @@ import { usernameSchema } from "../user";
|
||||
|
||||
export const loginSchema = z
|
||||
.object({
|
||||
identifier: z.string(),
|
||||
identifier: z.string().transform((value) => value.toLowerCase()),
|
||||
password: z.password().min(6),
|
||||
})
|
||||
.refine(
|
||||
|
||||
@ -8,17 +8,20 @@ export const usernameSchema = z
|
||||
.string()
|
||||
.min(3)
|
||||
.max(255)
|
||||
.regex(/^[\d._a-z-]+$/, {
|
||||
message:
|
||||
"Usernames can only contain lowercase letters, numbers, periods, hyphens, and underscores.",
|
||||
});
|
||||
.regex(/^[\w.-]+$/, {
|
||||
message: "Usernames can only contain letters, numbers, periods, hyphens, and underscores.",
|
||||
})
|
||||
.transform((value) => value.toLowerCase());
|
||||
|
||||
export const userSchema = z.object({
|
||||
id: idSchema,
|
||||
name: z.string().min(1).max(255),
|
||||
picture: z.literal("").or(z.null()).or(z.string().url()),
|
||||
username: usernameSchema,
|
||||
email: z.string().email(),
|
||||
email: z
|
||||
.string()
|
||||
.email()
|
||||
.transform((value) => value.toLowerCase()),
|
||||
locale: z.string().default("en-US"),
|
||||
emailVerified: z.boolean().default(false),
|
||||
twoFactorEnabled: z.boolean().default(false),
|
||||
|
||||
@ -0,0 +1,6 @@
|
||||
-- This migration normalizes the username and email fields for all users,
|
||||
-- ensuring that they are stored in lowercase.
|
||||
UPDATE "User"
|
||||
SET username = LOWER(username),
|
||||
email = LOWER(email);
|
||||
|
||||
Reference in New Issue
Block a user