From 1ceda7c2916d9a5f683c53cc8c8780756f6d0205 Mon Sep 17 00:00:00 2001 From: Bivekich Date: Sun, 13 Jul 2025 19:29:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D1=8B=20ContactSection=20=D0=B8=20HouseCalculatorModal:?= =?UTF-8?q?=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B,=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B5=20=D1=81=D0=B2=D0=BE=D0=B9=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=BC=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D0=B0=D0=BB=D0=BE=D0=B2,=20=D0=B8=D0=B7=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D1=85=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BB=D1=83?= =?UTF-8?q?=D1=87=D1=88=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=87=D0=B8=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D1=80=D0=B0=D1=81=D1=87=D0=B5=D1=82=D0=B0?= =?UTF-8?q?=20=D1=81=D1=82=D0=BE=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC?= =?UTF-8?q?=20=D0=BE=D0=BA=D0=BD=D0=B5=20=D0=BA=D0=B0=D0=BB=D1=8C=D0=BA?= =?UTF-8?q?=D1=83=D0=BB=D1=8F=D1=82=D0=BE=D1=80=D0=B0.=20=D0=A3=D0=BB?= =?UTF-8?q?=D1=83=D1=87=D1=88=D0=B5=D0=BD=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=20=D0=B8=20=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D0=B5=20=D1=81=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BC=D0=B8.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ContactSection.tsx | 1 - src/components/HouseCalculatorModal.tsx | 166 ++++++++++++++++-------- 2 files changed, 110 insertions(+), 57 deletions(-) diff --git a/src/components/ContactSection.tsx b/src/components/ContactSection.tsx index cbad220..cca8c95 100644 --- a/src/components/ContactSection.tsx +++ b/src/components/ContactSection.tsx @@ -1,7 +1,6 @@ 'use client'; import { useState } from 'react'; -import { Phone, Mail, MapPin } from 'lucide-react'; import FadeInSection from './FadeInSection'; const ContactSection = () => { diff --git a/src/components/HouseCalculatorModal.tsx b/src/components/HouseCalculatorModal.tsx index d8c78f5..5a36d21 100644 --- a/src/components/HouseCalculatorModal.tsx +++ b/src/components/HouseCalculatorModal.tsx @@ -1,13 +1,33 @@ 'use client'; import { useState } from 'react'; -import { X, CheckCircle, AlertCircle } from 'lucide-react'; -import Image from 'next/image'; +import { X, ChevronLeft, ChevronRight, Check } from 'lucide-react'; const materials = [ - { label: 'Кирпич/керамический блок', value: 'Кирпич/керамический блок', img: '/images/keramic.jpg' }, - { label: 'Газобетон', value: 'Газобетон', img: '/images/gazobet.png' }, - { label: 'Керамзитобетон', value: 'Керамзитобетон', img: '/images/keramiz.jpg' }, + { + label: 'Кирпич/керамический блок', + value: 'Кирпич/керамический блок', + img: '/images/keramic.jpg', + icon: '🧱', + name: 'Кирпич', + description: 'Прочный и долговечный' + }, + { + label: 'Газобетон', + value: 'Газобетон', + img: '/images/gazobet.png', + icon: '🏗️', + name: 'Газобетон', + description: 'Легкий и теплый' + }, + { + label: 'Керамзитобетон', + value: 'Керамзитобетон', + img: '/images/keramiz.jpg', + icon: '🏠', + name: 'Керамзитобетон', + description: 'Экологичный материал' + }, ]; const areas = [ @@ -17,13 +37,13 @@ const areas = [ 'более 200 кв.м.', ]; -const finishes = [ +const finishOptions = [ 'Без отделки', 'Черновая отделка (стяжка, штукатурка и тд)', 'Чистовая отделка (обои, ламинат и тд)', ]; -const finances = [ +const financeOptions = [ 'Наличные', 'Сельская ипотека', 'Ипотека, кредит', @@ -43,39 +63,34 @@ const HouseCalculatorModal = ({ isOpen, onClose, userName = '', userPhone = '' } const [area, setArea] = useState(''); const [finish, setFinish] = useState(''); const [finance, setFinance] = useState(''); - const [error, setError] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); if (!isOpen) return null; + const canProceed = () => { + if (step === 1) return material !== ''; + if (step === 2) return area !== ''; + if (step === 3) return finish !== ''; + if (step === 4) return finance !== ''; + return true; + }; + const handleNext = () => { - setError(''); - if (step === 1 && !material) return setError('Выберите материал'); - if (step === 2 && !area) return setError('Выберите площадь'); - if (step === 3 && !finish) return setError('Выберите вариант отделки'); - if (step === 4 && !finance) { - setError('Выберите источник финансирования'); - return; - } if (step === 4) { - // После 4-го шага отправляем данные в Telegram и переходим к 5-му шагу handleSubmitCalculator(); return; } setStep((s) => s + 1); }; - const handlePrev = () => { - setError(''); + const handlePrevious = () => { setStep((s) => s - 1); }; const handleSubmitCalculator = async () => { - // Защита от двойной отправки if (isSubmitting) return; setIsSubmitting(true); - setError(''); try { const res = await fetch('/api/send-telegram', { @@ -92,12 +107,10 @@ const HouseCalculatorModal = ({ isOpen, onClose, userName = '', userPhone = '' } }); if (res.ok) { - setStep(5); // Переходим к 5-му шагу - } else { - setError('Ошибка отправки. Попробуйте позже.'); + setStep(5); } } catch { - setError('Ошибка отправки. Попробуйте позже.'); + // Обработка ошибок } finally { setIsSubmitting(false); } @@ -109,14 +122,27 @@ const HouseCalculatorModal = ({ isOpen, onClose, userName = '', userPhone = '' } setArea(''); setFinish(''); setFinance(''); - setError(''); setIsSubmitting(false); onClose(); }; + const calculatePrice = () => { + let basePrice = 1500000; // Базовая цена + + // Корректировка по площади + if (area === '100-150 кв.м.') basePrice *= 1.3; + else if (area === '150-200 кв.м.') basePrice *= 1.6; + else if (area === 'более 200 кв.м.') basePrice *= 2; + + // Корректировка по материалу + if (material === 'Кирпич/керамический блок') basePrice *= 1.2; + else if (material === 'Керамзитобетон') basePrice *= 1.1; + + return Math.round(basePrice); + }; + return (
- {/* Декоративный фон */}
@@ -157,7 +183,6 @@ const HouseCalculatorModal = ({ isOpen, onClose, userName = '', userPhone = '' } : 'border-white/20 hover:border-white/40' }`} > - {/* Фон при активном состоянии */}
@@ -208,30 +233,24 @@ const HouseCalculatorModal = ({ isOpen, onClose, userName = '', userPhone = '' } {step === 3 && (

- Дополнительные опции + Вариант отделки

- {options.map((option) => ( -
)}
- {step > 1 && ( + {step > 1 && step < 5 && ( + ) : step === 4 ? ( + ) : (