From 011845571f88b7e6f7dac22a220d1ee81a63bd58 Mon Sep 17 00:00:00 2001 From: "nabijonovdavronbek619@gmail.com" Date: Wed, 1 Apr 2026 12:12:35 +0500 Subject: [PATCH] modal location updated --- src/features/auth/login/ui/form.tsx | 19 ++++++++----- src/features/auth/register/ui/form.tsx | 29 ++++++++++++++++++++ src/shared/config/i18n/messages/en.json | 3 +- src/shared/config/i18n/messages/ru.json | 3 +- src/shared/config/i18n/messages/uz.d.json.ts | 1 + src/shared/config/i18n/messages/uz.json | 3 +- src/widgets/home/components/Hero.tsx | 22 +++++++++------ src/widgets/home/components/StepsSection.tsx | 15 +++++----- src/widgets/home/index.tsx | 17 ++---------- 9 files changed, 71 insertions(+), 41 deletions(-) diff --git a/src/features/auth/login/ui/form.tsx b/src/features/auth/login/ui/form.tsx index 67d567a..c7becde 100644 --- a/src/features/auth/login/ui/form.tsx +++ b/src/features/auth/login/ui/form.tsx @@ -9,8 +9,7 @@ import { import PhonePrefix from '../../../../shared/ui/phonePrefix'; import { MotionWrapper } from '../../../../shared/ui/motion'; import { useLoginForm } from '../lib/useLoginForm'; -import { useLoginModal } from '@/shared/zustand/auth'; -import Link from 'next/link'; +import { useLoginModal, useRegisterModal } from '@/shared/zustand/auth'; import { useTranslations } from 'next-intl'; export function LoginForm() { @@ -20,6 +19,9 @@ export function LoginForm() { const { phone, setPhone, submit, error, loading } = useLoginForm(); const toggleLoginModal = useLoginModal((state) => state.toggleLoginModal); + const toggleRegisterModal = useRegisterModal( + (state) => state.toggleRegisterModal, + ); const handlePhoneChange = useCallback( (e: React.ChangeEvent) => { @@ -149,14 +151,17 @@ export function LoginForm() { {/* Register hint */} -

+

{t('registerPrompt')} - { + toggleLoginModal(); + toggleRegisterModal(); + }} + className="text-stone-800 hover:cursor-pointer underline underline-offset-2 hover:text-stone-600 transition-colors" > {t('registerLink')} - +

diff --git a/src/features/auth/register/ui/form.tsx b/src/features/auth/register/ui/form.tsx index 61a3b7d..6e6f89c 100644 --- a/src/features/auth/register/ui/form.tsx +++ b/src/features/auth/register/ui/form.tsx @@ -5,6 +5,7 @@ import { useRegisterForm } from '../lib/useRegisterForm'; import { formatPhone, normalizeDigits } from '@/shared/lib/formatPhone'; import PhonePrefix from '@/shared/ui/phonePrefix'; import { useTranslations } from 'next-intl'; +import { useLoginModal, useRegisterModal } from '@/shared/zustand/auth'; function Field({ id, @@ -66,6 +67,7 @@ function Field({ export function RegisterFormUI() { const [phone, setPhone] = React.useState(''); const t = useTranslations('Auth.Register'); + const t_login = useTranslations('Auth.Login'); const tCommon = useTranslations('Common'); const { registerData, @@ -77,6 +79,10 @@ export function RegisterFormUI() { handleSubmit, setItem, } = useRegisterForm(); + const toggleLoginModal = useLoginModal((state) => state.toggleLoginModal); + const toggleRegisterModal = useRegisterModal( + (state) => state.toggleRegisterModal, + ); const [isFocused, setIsFocused] = React.useState(false); const handlePhoneChange = useCallback( (e: React.ChangeEvent) => { @@ -233,6 +239,29 @@ export function RegisterFormUI() { )} + + {/* Divider */} +
+ + + {tCommon('or')} + + +
+ + {/* Register hint */} +

+ {t('loginPrompt')} +

{ + toggleLoginModal(); + toggleRegisterModal(); + }} + className="text-stone-800 hover:cursor-pointer underline underline-offset-2 hover:text-stone-600 transition-colors" + > + {t_login('title')} +

+

); } diff --git a/src/shared/config/i18n/messages/en.json b/src/shared/config/i18n/messages/en.json index 86f1d54..3ed7a48 100644 --- a/src/shared/config/i18n/messages/en.json +++ b/src/shared/config/i18n/messages/en.json @@ -188,7 +188,8 @@ "namePlaceholder": "Ali", "surnamePlaceholder": "Karimov", "terms": "I agree to the Terms of Service and Privacy Policy", - "submitButton": "Create account" + "submitButton": "Create account", + "loginPrompt": "Already have an account?" } }, "Payment": { diff --git a/src/shared/config/i18n/messages/ru.json b/src/shared/config/i18n/messages/ru.json index ee3c5ce..5073b39 100644 --- a/src/shared/config/i18n/messages/ru.json +++ b/src/shared/config/i18n/messages/ru.json @@ -188,7 +188,8 @@ "namePlaceholder": "Али", "surnamePlaceholder": "Каримов", "terms": "Я согласен с Условиями обслуживания и Политикой конфиденциальности", - "submitButton": "Создать аккаунт" + "submitButton": "Создать аккаунт", + "loginPrompt": "Уже есть аккаунт?" } }, "Payment": { diff --git a/src/shared/config/i18n/messages/uz.d.json.ts b/src/shared/config/i18n/messages/uz.d.json.ts index 709d3f1..95a0d10 100644 --- a/src/shared/config/i18n/messages/uz.d.json.ts +++ b/src/shared/config/i18n/messages/uz.d.json.ts @@ -192,6 +192,7 @@ declare const messages: { surnamePlaceholder: 'Karimov'; terms: "Men Xizmat ko'rsatish shartlari va Maxfiylik siyosatiga roziman"; submitButton: 'Hisob yaratish'; + loginPrompt: 'Hisobingiz bormi?'; }; }; Payment: { diff --git a/src/shared/config/i18n/messages/uz.json b/src/shared/config/i18n/messages/uz.json index bf1078e..7b2462d 100644 --- a/src/shared/config/i18n/messages/uz.json +++ b/src/shared/config/i18n/messages/uz.json @@ -188,7 +188,8 @@ "namePlaceholder": "Ali", "surnamePlaceholder": "Karimov", "terms": "Men Xizmat ko'rsatish shartlari va Maxfiylik siyosatiga roziman", - "submitButton": "Hisob yaratish" + "submitButton": "Hisob yaratish", + "loginPrompt": "Hisobingiz bormi?" } }, "Payment": { diff --git a/src/widgets/home/components/Hero.tsx b/src/widgets/home/components/Hero.tsx index 612be62..31ad2d1 100644 --- a/src/widgets/home/components/Hero.tsx +++ b/src/widgets/home/components/Hero.tsx @@ -1,5 +1,10 @@ -import type { FC } from 'react'; -import { motion, type MotionStyle, type MotionValue } from 'framer-motion'; +'use client'; +import { + motion, + useScroll, + useTransform, + type MotionStyle, +} from 'framer-motion'; import { fadeUp, stagger } from '../animations'; import { C } from '../tokens'; import { STATS } from '../constants'; @@ -10,16 +15,15 @@ import Section from './Section'; import Stat from './Stat'; import StartButton from './StartButton'; import { useTranslations } from 'next-intl'; +import { useLoginModal } from '@/shared/zustand/auth'; -interface HeroProps { - onStart: () => void; - blobY: MotionValue; -} - -const Hero: FC = ({ onStart, blobY }) => { +const Hero = () => { const isMobile = useIsMobile(); const t = useTranslations('Hero'); const tStats = useTranslations('Stats'); + const { scrollY } = useScroll(); + const blobY = useTransform(scrollY, [0, 600], [0, 80]); + const toggleLoginModal = useLoginModal((state) => state.toggleLoginModal); const getTranslatedLabel = (label: string) => { switch (label) { @@ -149,7 +153,7 @@ const Hero: FC = ({ onStart, blobY }) => { flexWrap: 'wrap', }} > - + toggleLoginModal()} /> ; - onScrollTop: () => void; -} - -const StepsSection: FC = ({ stepsRef, onScrollTop }) => { +const StepsSection = () => { const isMobile = useIsMobile(); const t = useTranslations('StepsSection'); + const stepsRef = useRef(null); + const toggleLoginModal = useLoginModal((state) => state.toggleLoginModal); return (
= ({ stepsRef, onScrollTop }) => { {t('ctaDescription')}

- + toggleLoginModal()} /> diff --git a/src/widgets/home/index.tsx b/src/widgets/home/index.tsx index 51c310a..dc2bc1a 100644 --- a/src/widgets/home/index.tsx +++ b/src/widgets/home/index.tsx @@ -1,27 +1,16 @@ 'use client'; -import { useRef, type FC } from 'react'; -import { useScroll, useTransform } from 'framer-motion'; import Hero from './components/Hero'; import InfoSection from './components/InfoSection'; import StepsSection from './components/StepsSection'; import Ticker from './components/Ticker'; -const PlagiarismLanding: FC = () => { - const stepsRef = useRef(null); - const { scrollY } = useScroll(); - const blobY = useTransform(scrollY, [0, 600], [0, 80]); - - const scrollToSteps = () => - stepsRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - - const scrollToTop = () => window.scrollTo({ top: 0, behavior: 'smooth' }); - +const PlagiarismLanding = () => { return ( <> - + - + ); };