From e0606c5486e4e3f6fafc811e84802ee0b296f269 Mon Sep 17 00:00:00 2001 From: smanylov Date: Tue, 3 Feb 2026 17:31:27 +0700 Subject: [PATCH 1/2] add tarrifs --- src/app/actions/action.ts | 1 + src/app/actions/auth.ts | 16 -- src/app/actions/definitions.ts | 27 ++- src/app/lib/validation-config-parser.ts | 4 +- src/app/styles/payment-container.scss | 1 + src/app/ui/forms/register-form.tsx | 2 +- src/app/ui/header/userMenuButton.tsx | 3 +- src/app/ui/payment/payment-tab-tariffs.tsx | 168 ++++++------------ src/app/ui/payment/user-usage.tsx | 33 +++- .../ui/settings/personal-data-settings.tsx | 62 +++++-- 10 files changed, 161 insertions(+), 156 deletions(-) diff --git a/src/app/actions/action.ts b/src/app/actions/action.ts index 5074f5e..73898a3 100644 --- a/src/app/actions/action.ts +++ b/src/app/actions/action.ts @@ -1,4 +1,5 @@ 'use server' + import { getSessionData, deleteSession } from '@/app/actions/session'; import { testUserData, API_BASE_URL } from '@/app/actions/definitions'; import { redirect } from 'next/navigation'; diff --git a/src/app/actions/auth.ts b/src/app/actions/auth.ts index 7e1a595..fd1b6e4 100644 --- a/src/app/actions/auth.ts +++ b/src/app/actions/auth.ts @@ -170,8 +170,6 @@ export async function registration( const validatedFields = SignupFormSchema.safeParse(dataToValidate); - console.log(`account-type ${accountType}`) - if (!validatedFields.success) { const errors: Record = {} JSON.parse(validatedFields.error.message).forEach((obj: { @@ -199,19 +197,6 @@ export async function registration( }; } - /* - return { - previousState: { - fullName, - email, - password, - confirm_password, - phone, - agree, - ...(accountType === 'b2b' && { companyName }) - } - }; */ - try { const { fullName, email, password, phone } = validatedFields.data; const response = await fetch(`${API_BASE_URL}/api/v1/data`, { @@ -243,7 +228,6 @@ export async function registration( if (parsed.message_desc === 'Operation successful') { await createSession(parsed.message_body.token, email as string); - console.log('succes registration'); } else { throw parsed; } diff --git a/src/app/actions/definitions.ts b/src/app/actions/definitions.ts index 98bedeb..51e9662 100644 --- a/src/app/actions/definitions.ts +++ b/src/app/actions/definitions.ts @@ -35,6 +35,9 @@ interface ValidationConfig { const defaultConfig = validationConfig as ValidationConfig; +let cachedSignupSchema: any = null; +let schemaPromise: Promise | null = null; + async function loadConfigFromBackend(accountType?: 'b2b' | 'b2c'): Promise { try { const response = await fetch('/api/validation-config'); @@ -48,16 +51,22 @@ async function loadConfigFromBackend(accountType?: 'b2b' | 'b2c'): Promise } export async function getSignupFormSchema(schemaType?: 'b2b' | 'b2c' | 'resetPassword') { - let schemaPromise: Promise | null = null; + if (cachedSignupSchema) { + return cachedSignupSchema; + } - schemaPromise = (async () => { - const config = await loadConfigFromBackend(); - if (schemaType === 'resetPassword') { - return createValidationSchemaForPssword(config); - } else { - return createValidationSchema(config, schemaType); - } - })(); + if (!schemaPromise) { + schemaPromise = (async () => { + const config = await loadConfigFromBackend(); + if (schemaType === 'resetPassword') { + cachedSignupSchema = createValidationSchemaForPssword(config); + } else { + cachedSignupSchema = createValidationSchema(config, schemaType); + } + + return cachedSignupSchema; + })(); + } return await schemaPromise; } diff --git a/src/app/lib/validation-config-parser.ts b/src/app/lib/validation-config-parser.ts index 4e1eb44..d3a3825 100644 --- a/src/app/lib/validation-config-parser.ts +++ b/src/app/lib/validation-config-parser.ts @@ -38,8 +38,8 @@ export function createValidationSchema(config: ValidationConfig, accountType?: ' .trim(); } - // companyName - if (config.companyName && accountType === 'b2b') { + // fullName + if (config.companyName && accountType !== 'b2c') { schema.companyName = z .string() .trim() diff --git a/src/app/styles/payment-container.scss b/src/app/styles/payment-container.scss index ef88cb8..58e220c 100644 --- a/src/app/styles/payment-container.scss +++ b/src/app/styles/payment-container.scss @@ -214,6 +214,7 @@ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); cursor: pointer; overflow: visible; + max-width: 350px; .plan-header { text-align: center; diff --git a/src/app/ui/forms/register-form.tsx b/src/app/ui/forms/register-form.tsx index 67a0d31..b818b42 100644 --- a/src/app/ui/forms/register-form.tsx +++ b/src/app/ui/forms/register-form.tsx @@ -84,7 +84,7 @@ export default function RegisterForm() { if (fieldName === 'phone') { return schema.safeParse(value.replace(/[-\(\)\s]/g, '')); } - if (fieldName === 'companyName') { + if (fieldName === 'companyName' && accountType === 'b2c') { return { success: true, data: value }; } return schema.safeParse(value); diff --git a/src/app/ui/header/userMenuButton.tsx b/src/app/ui/header/userMenuButton.tsx index 7d2a03a..f813a44 100644 --- a/src/app/ui/header/userMenuButton.tsx +++ b/src/app/ui/header/userMenuButton.tsx @@ -22,7 +22,8 @@ export default function UserMenuButton() { queryFn: () => { return getUserData(); } - }); + }) + useClickOutside( menuRef, diff --git a/src/app/ui/payment/payment-tab-tariffs.tsx b/src/app/ui/payment/payment-tab-tariffs.tsx index 3f47487..b134d9c 100644 --- a/src/app/ui/payment/payment-tab-tariffs.tsx +++ b/src/app/ui/payment/payment-tab-tariffs.tsx @@ -1,8 +1,10 @@ +<<<<<<< HEAD 'use client' import { useEffect } from 'react'; import { getUserData } from '@/app/actions/action'; import { useQuery } from '@tanstack/react-query'; +import { convertBytes } from '@/app/lib/convertBytes'; export default function PaymentTabTariffs() { const { @@ -17,14 +19,12 @@ export default function PaymentTabTariffs() { } }); - useEffect(() => { - console.log('show => userData'); - console.log(userData); - }, []) - +======= +export default function PaymentTabTariffs() { +>>>>>>> parent of 1e199de (edit registration) return (
-
+
-
-
-
🚀
-

СТАРТ

-
900₽
-
в месяц
-
100 токенов включено
-
-
    -
  • - - 100 файлов в месяц -
  • -
  • - - 1 ГБ хранилища -
  • -
  • - - До 10 МБ на файл -
  • -
  • - - Базовые модули защиты -
  • -
  • - - Поддержка 24/7 -
  • -
  • - - API доступ -
  • -
-
-
-
-
🚀
-

ПРЕМИУМ

-
3500₽
-
в месяц
-
100 токенов включено
-
-
    -
  • - - 100 файлов в месяц -
  • -
  • - - 1 ГБ хранилища -
  • -
  • - - До 10 МБ на файл -
  • -
  • - - Базовые модули защиты -
  • -
  • - - Поддержка 24/7 -
  • -
  • - - API доступ -
  • -
-
-
-
-
🚀
-

ПРОФИ

-
9500₽
-
в месяц
-
100 токенов включено
-
-
    -
  • - - 100 файлов в месяц -
  • -
  • - - 1 ГБ хранилища -
  • -
  • - - До 10 МБ на файл -
  • -
  • - - Базовые модули защиты -
  • -
  • - - Поддержка 24/7 -
  • -
  • - - API доступ -
  • -
-
+ + {userData.tariffs?.map(((item: { + id: number, + name: string, + price: number, + tokens: number, + maxFilesCount: number, + diskSize: number + }) => { + return ( +
+
+
🚀
+

+ {item.name} +

+
+ {item.price} +
+
в месяц
+
+ {item.tokens} токенов включено
+
+
    +
  • + + {item.maxFilesCount} файлов в месяц +
  • +
  • + + {convertBytes(item.diskSize)} хранилища +
  • +
  • + + Базовые модули защиты +
  • +
  • + + Поддержка 24/7 +
  • +
  • + + API доступ +
  • +
+
+ ) + }))}
) diff --git a/src/app/ui/payment/user-usage.tsx b/src/app/ui/payment/user-usage.tsx index 0669b1c..4e22e38 100644 --- a/src/app/ui/payment/user-usage.tsx +++ b/src/app/ui/payment/user-usage.tsx @@ -1,28 +1,47 @@ +'use client' + +import { getUserData } from '@/app/actions/action'; +import { useQuery } from '@tanstack/react-query'; +import { useEffect } from 'react'; +import {convertBytes} from '@/app/lib/convertBytes'; + export default function UserUsage() { + const { + data: userData, + isLoading, + isError, + error + } = useQuery({ + queryKey: ['userData'], + queryFn: () => { + return getUserData(); + } + }); + return (

- 📊 Ваше использование + Ваше использование

-
0 / 2,000
+
0 / {userData?.tariffInfo?.tariff?.maxFilesCount}
Файлов в месяц
-
0 / 20 ГБ
+
0 / {convertBytes(userData?.tariffInfo?.tariff?.diskSize)}
Объём хранилища
@@ -32,7 +51,9 @@ export default function UserUsage() {
Токенов на балансе
-
ПРОФИ
+
+ {userData?.tariffInfo?.tariff?.name} +
Текущий план
diff --git a/src/app/ui/settings/personal-data-settings.tsx b/src/app/ui/settings/personal-data-settings.tsx index 02e6993..c8ed0ed 100644 --- a/src/app/ui/settings/personal-data-settings.tsx +++ b/src/app/ui/settings/personal-data-settings.tsx @@ -1,7 +1,9 @@ 'use client' import { useTranslations } from 'next-intl'; -import { useActionState, useState } from 'react' +import { useActionState, useState, useEffect } from 'react'; +import { getUserData } from '@/app/actions/action'; +import { useQuery } from '@tanstack/react-query'; export default function PersonalDataSettings() { const [errorMessage, formAction, isPending] = useActionState( @@ -11,6 +13,23 @@ export default function PersonalDataSettings() { undefined ); + const { + data: userData, + isLoading, + isError, + error + } = useQuery({ + queryKey: ['userData'], + queryFn: () => { + return getUserData(); + } + }); + + useEffect(() => { + console.log('show => userData'); + console.log(userData); + }, []) + const [selectedValue, setSelectedValue] = useState('male'); const t = useTranslations('Global'); @@ -26,19 +45,37 @@ export default function PersonalDataSettings() { - -
-
- - +
+ {userData.company && ( +
+ + +
+ )}
- + {t('email-cant-change')} @@ -47,7 +84,12 @@ export default function PersonalDataSettings() { - +