Компетенции аватар и заглушка рейтинга

This commit is contained in:
Халимов Рустам
2026-02-13 22:37:41 +03:00
parent 65cb4ab8d7
commit e9f0a6066e
147 changed files with 4674 additions and 5879 deletions
+122 -1
View File
@@ -9,6 +9,7 @@ import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Checkbox } from "@/components/ui/checkbox"
import {
Form,
FormControl,
@@ -22,11 +23,26 @@ import { useSessionStore } from "@/entities/session/store"
const registerSchema = z.object({
phone: z.string().min(10, "Номер телефона должен содержать минимум 10 цифр"),
firstName: z.string()
.min(2, "Имя должно содержать минимум 2 символа")
.regex(/^[^0-9]*$/, "Имя не должно содержать цифры"),
lastName: z.string()
.min(2, "Фамилия должна содержать минимум 2 символа")
.regex(/^[^0-9]*$/, "Фамилия не должна содержать цифры"),
isCompany: z.boolean(),
companyName: z.string().optional(),
inn: z.string().optional(),
password: z.string().min(6, "Пароль должен быть не менее 6 символов"),
confirmPassword: z.string().min(6),
}).refine((data) => data.password === data.confirmPassword, {
message: "Пароли не совпадают",
path: ["confirmPassword"],
}).refine((data) => !data.isCompany || (data.companyName && data.companyName.length >= 2), {
message: "Название компании обязательно",
path: ["companyName"],
}).refine((data) => !data.isCompany || (data.inn && data.inn.length === 10), {
message: "ИНН должен содержать 10 цифр",
path: ["inn"],
})
type RegisterValues = z.infer<typeof registerSchema>
@@ -39,14 +55,40 @@ export function RegisterForm() {
resolver: zodResolver(registerSchema),
defaultValues: {
phone: "",
firstName: "",
lastName: "",
isCompany: false,
companyName: "",
inn: "",
password: "",
confirmPassword: "",
},
})
const isCompany = form.watch("isCompany")
async function onSubmit(values: RegisterValues) {
try {
await register(values)
const submitData: any = {
phone: values.phone,
firstName: values.firstName,
lastName: values.lastName,
password: values.password,
confirmPassword: values.confirmPassword,
role: values.isCompany ? "Company" : "User"
};
// Добавляем данные компании только если регистрируемся как компания
if (values.isCompany) {
if (values.companyName) {
submitData.companyName = values.companyName;
}
if (values.inn) {
submitData.inn = values.inn;
}
}
await register(submitData)
router.push("/auth/login")
} catch (error) {
console.error(error)
@@ -65,6 +107,35 @@ export function RegisterForm() {
<CardContent>
<Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<div className="grid grid-cols-2 gap-4">
<FormField
control={form.control}
name="firstName"
render={({ field }) => (
<FormItem>
<FormLabel>Имя</FormLabel>
<FormControl>
<Input placeholder="Иван" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="lastName"
render={({ field }) => (
<FormItem>
<FormLabel>Фамилия</FormLabel>
<FormControl>
<Input placeholder="Иванов" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</div>
<FormField
control={form.control}
name="phone"
@@ -78,6 +149,56 @@ export function RegisterForm() {
</FormItem>
)}
/>
<FormField
control={form.control}
name="isCompany"
render={({ field }) => (
<FormItem className="flex flex-row items-center gap-4 space-y-0 rounded-md border p-4">
<FormControl>
<Checkbox
checked={field.value}
onCheckedChange={field.onChange}
/>
</FormControl>
<FormLabel className="text-sm font-medium cursor-pointer peer-disabled:cursor-not-allowed peer-disabled:opacity-70">
Я представитель компании
</FormLabel>
</FormItem>
)}
/>
{isCompany && (
<>
<FormField
control={form.control}
name="companyName"
render={({ field }) => (
<FormItem>
<FormLabel>Название компании</FormLabel>
<FormControl>
<Input placeholder="ООО 'Ромашка'" {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
<FormField
control={form.control}
name="inn"
render={({ field }) => (
<FormItem>
<FormLabel>ИНН</FormLabel>
<FormControl>
<Input placeholder="1234567890" maxLength={10} {...field} />
</FormControl>
<FormMessage />
</FormItem>
)}
/>
</>
)}
<FormField
control={form.control}
name="password"