diff --git a/frontend/src/components/home/Reviews.astro b/frontend/src/components/home/Reviews.astro index d83e56a..14fc746 100644 --- a/frontend/src/components/home/Reviews.astro +++ b/frontend/src/components/home/Reviews.astro @@ -1,31 +1,14 @@ --- -// Данные отзывов -const reviews = [ - { - name: "Алексей М.", - car: "Toyota Camry", - text: "Помогли вернуть права после того, как инспектор незаконно составил протокол за встречку. Юрист нашел кучу ошибок в схеме ДТП. Огромное спасибо!", - initial: "А", - color: "bg-blue-100 text-blue-600" - }, - { - name: "Екатерина П.", - car: "Hyundai Solaris", - text: "Страховая выплатила копейки по ОСАГО. Обратилась сюда, сделали независимую экспертизу и через суд взыскали еще 120 тысяч. Профессионалы!", - initial: "Е", - color: "bg-teal-100 text-teal-600" - }, - { - name: "Игорь С.", - car: "Lexus RX", - text: "Грамотно разобрали сложное ДТП на перекрестке. Доказали, что я не виноват, хотя ГИБДД изначально решило иначе. Лучшие в Сургуте.", - initial: "И", - color: "bg-orange-100 text-orange-600" - } -]; +import { reviewsData } from '@data/reviewsData'; +import ReviewCard from '@components/reviews/ReviewCard.astro'; + +// Берём 6 последних отзывов (сортируем по дате, берём последние) +const latestReviews = [...reviewsData] + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) + .slice(0, 6); // Для эффекта бесконечности клонируем элементы (один набор в начало, один в конец) -const displayReviews = [...reviews, ...reviews, ...reviews]; +const displayReviews = [...latestReviews, ...latestReviews, ...latestReviews]; ---
@@ -45,29 +28,24 @@ const displayReviews = [...reviews, ...reviews, ...reviews];
-
+
{displayReviews.map((review, index) => ( -
-
-
- {[...Array(5)].map(() => ( - - ))} -
-

- "{review.text}" -

-
- -
-
- {review.initial} -
-
-

{review.name}

-

{review.car}

-
-
+
+
))}
@@ -82,7 +60,7 @@ const displayReviews = [...reviews, ...reviews, ...reviews];
+ \ No newline at end of file diff --git a/frontend/src/components/reviews/RatingStars.astro b/frontend/src/components/reviews/RatingStars.astro new file mode 100644 index 0000000..6e95184 --- /dev/null +++ b/frontend/src/components/reviews/RatingStars.astro @@ -0,0 +1,207 @@ +--- +export interface Props { + rating?: number; + interactive?: boolean; + size?: 'sm' | 'md' | 'lg'; + onRate?: (rating: number) => void; +} + +const { rating = 0, interactive = false, size = 'md' } = Astro.props; + +const sizeClasses = { + sm: 'w-4 h-4', + md: 'w-5 h-5', + lg: 'w-7 h-7' +}; + +const starSize = sizeClasses[size]; +const uniqueId = `rating-${Math.random().toString(36).substring(2, 9)}`; +--- + +
+ {[1, 2, 3, 4, 5].map((star) => ( + + ))} +
+ + + + diff --git a/frontend/src/components/reviews/ReviewCard.astro b/frontend/src/components/reviews/ReviewCard.astro new file mode 100644 index 0000000..bd372a7 --- /dev/null +++ b/frontend/src/components/reviews/ReviewCard.astro @@ -0,0 +1,266 @@ +--- +import RatingStars from './RatingStars.astro'; + +export interface Props { + name: string; + car: string; + text: string; + rating: number; + initial: string; + color: string; + date: string; + votesCount?: number; + isHelpful?: boolean; +} + +const { + name, + car, + text, + rating, + initial, + color, + date, + votesCount = 0, + isHelpful = false +} = Astro.props; + +// Форматируем дату +const formatDate = (dateStr: string) => { + const date = new Date(dateStr); + return date.toLocaleDateString('ru-RU', { + day: 'numeric', + month: 'long', + year: 'numeric' + }); +}; +--- + +
+ +
+
+
+ {initial} +
+
+

{name}

+

{car}

+
+
+ +
+ + +
+ +
+ + +
+

{text}

+
+ + +
+

Полезен ли этот отзыв?

+
+ +
+
+ + + + + {votesCount} + + {isHelpful && ( + + + + + Полезно + + )} +
+
+
+ + diff --git a/frontend/src/components/reviews/SliderReviewCard.astro b/frontend/src/components/reviews/SliderReviewCard.astro new file mode 100644 index 0000000..0243b67 --- /dev/null +++ b/frontend/src/components/reviews/SliderReviewCard.astro @@ -0,0 +1,135 @@ +--- +export interface Props { + name: string; + car: string; + text: string; + rating: number; + initial: string; + color: string; +} + +const { name, car, text, rating, initial, color } = Astro.props; +--- + +
+
+ +
+ {[1, 2, 3, 4, 5].map((star) => ( + + + + ))} +
+ + +

"{text}"

+
+ + +
+
+ {initial} +
+
+

{name}

+

{car}

+
+
+
+ + diff --git a/frontend/src/components/reviews/VotingSummary.astro b/frontend/src/components/reviews/VotingSummary.astro new file mode 100644 index 0000000..8e4c31f --- /dev/null +++ b/frontend/src/components/reviews/VotingSummary.astro @@ -0,0 +1,241 @@ +--- +export interface Props { + averageRating: number; + totalVotes: number; + totalReviews: number; + ratingDistribution: { + 5: number; + 4: number; + 3: number; + 2: number; + 1: number; + }; +} + +const { averageRating, totalVotes, totalReviews, ratingDistribution } = Astro.props; + +// Расчёт процентов для каждого рейтинга +const getPercentage = (count: number) => { + if (totalVotes === 0) return 0; + return Math.round((count / totalVotes) * 100); +}; +--- + +
+
+

Общая статистика отзывов

+ +
+ +
+
+ {averageRating.toFixed(1)} +
+ {[1, 2, 3, 4, 5].map((star) => ( + + + + ))} +
+
+

+ На основе {totalVotes} голосов +

+

+ {totalReviews} отзывов оставлено +

+
+ + +
+ {[5, 4, 3, 2, 1].map((rating) => ( +
+ {rating} ★ +
+
+
+ {ratingDistribution[rating as keyof typeof ratingDistribution]} +
+ ))} +
+
+
+
+ + diff --git a/frontend/src/components/services/ServiceCategories.astro b/frontend/src/components/services/ServiceCategories.astro index 94ce03f..2a64deb 100644 --- a/frontend/src/components/services/ServiceCategories.astro +++ b/frontend/src/components/services/ServiceCategories.astro @@ -11,7 +11,7 @@ interface ServiceItem { title: string; description: string; price: string; - icon: string; // Now stores emoji (e.g., "🚗", "📄") + icon: string; href: string; features: string[]; } diff --git a/frontend/src/constants.ts b/frontend/src/constants.ts index 7f067cc..11678b7 100644 --- a/frontend/src/constants.ts +++ b/frontend/src/constants.ts @@ -11,7 +11,7 @@ export const COMPANY = { fullName: 'Центр защиты прав водителей "Автоюрист 086"', phone: '+7 (922) 253-83-75', email: 'redibedi2019@gmail.com', - address: 'г. Сургут, ул. Примерная, д. 1', + address: 'г. Сургут, пр. Комсомольский, д. 19', workHours: 'Пн-Пт: 9:00 - 18:00', } as const; diff --git a/frontend/src/data/reviewsData.ts b/frontend/src/data/reviewsData.ts new file mode 100644 index 0000000..1085f36 --- /dev/null +++ b/frontend/src/data/reviewsData.ts @@ -0,0 +1,127 @@ +export interface Review { + name: string; + car: string; + text: string; + rating: number; + initial: string; + color: string; + date: string; + votesCount: number; + isHelpful: boolean; +} + +export const reviewsData: Review[] = [ + { + name: "Алексей М.", + car: "Toyota Camry", + text: "Помогли вернуть права после того, как инспектор незаконно составил протокол за встречку. Юрист нашел кучу ошибок в схеме ДТП. Огромное спасибо!", + rating: 5, + initial: "А", + color: "bg-blue-100 text-blue-600", + date: "2024-03-15", + votesCount: 24, + isHelpful: true + }, + { + name: "Екатерина П.", + car: "Hyundai Solaris", + text: "Страховая выплатила копейки по ОСАГО. Обратилась сюда, сделали независимую экспертизу и через суд взыскали еще 120 тысяч. Профессионалы!", + rating: 5, + initial: "Е", + color: "bg-teal-100 text-teal-600", + date: "2024-03-10", + votesCount: 18, + isHelpful: true + }, + { + name: "Игорь С.", + car: "Lexus RX", + text: "Грамотно разобрали сложное ДТП на перекрестке. Доказали, что я не виноват, хотя ГИБДД изначально решило иначе. Лучшие в Сургуте.", + rating: 5, + initial: "И", + color: "bg-orange-100 text-orange-600", + date: "2024-03-05", + votesCount: 31, + isHelpful: true + }, + { + name: "Марина К.", + car: "Kia Rio", + text: "Обратилась по вопросу возврата прав после лишения. Всё сделали быстро и профессионально. Через 2 месяца права уже были у меня. Рекомендую!", + rating: 4, + initial: "М", + color: "bg-pink-100 text-pink-600", + date: "2024-02-28", + votesCount: 15, + isHelpful: true + }, + { + name: "Дмитрий В.", + car: "Volkswagen Tiguan", + text: "Были проблемы со страховой после ДТП. Юристы помогли составить претензию, потом представляли интересы в суде. Выиграли дело полностью.", + rating: 5, + initial: "Д", + color: "bg-purple-100 text-purple-600", + date: "2024-02-20", + votesCount: 22, + isHelpful: true + }, + { + name: "Ольга Н.", + car: "Mazda CX-5", + text: "Купила б/у авто с проблемами, которые не были указаны при продаже. Юристы помогли вернуть деньги через суд. Очень благодарна за помощь!", + rating: 5, + initial: "О", + color: "bg-indigo-100 text-indigo-600", + date: "2024-02-15", + votesCount: 27, + isHelpful: true + }, + { + name: "Сергей Т.", + car: "Nissan Qashqai", + text: "Спор со страховой длился полгода. Сам не мог ничего добиться. Обратился сюда - ребята за 2 месяца решили вопрос в мою пользу. Супер!", + rating: 4, + initial: "С", + color: "bg-green-100 text-green-600", + date: "2024-02-08", + votesCount: 19, + isHelpful: true + }, + { + name: "Анна Р.", + car: "Skoda Octavia", + text: "Помогли оспорить штраф с камеры, который пришел ошибочно. Юрист быстро разобрался в ситуации и подготовил все документы. Спасибо!", + rating: 5, + initial: "А", + color: "bg-yellow-100 text-yellow-600", + date: "2024-02-01", + votesCount: 12, + isHelpful: false + }, + { + name: "Виктор Л.", + car: "Honda CR-V", + text: "Обратился по вопросу компенсации после ДТП. Страховая занижала выплату в 3 раза. Сделали экспертизу и через суд добились справедливой суммы.", + rating: 5, + initial: "В", + color: "bg-red-100 text-red-600", + date: "2024-01-25", + votesCount: 35, + isHelpful: true + } +]; + +// Агрегированные данные для голосования +export const votingSummary = { + averageRating: 4.8, + totalVotes: 203, + totalReviews: reviewsData.length, + ratingDistribution: { + 5: 7, + 4: 2, + 3: 0, + 2: 0, + 1: 0 + } +}; diff --git a/frontend/src/pages/contacts.astro b/frontend/src/pages/contacts.astro index 33ca8e3..7a2d0ca 100644 --- a/frontend/src/pages/contacts.astro +++ b/frontend/src/pages/contacts.astro @@ -1,6 +1,9 @@ --- import Layout from '@layouts/Layout.astro'; -import { SITE_URL } from '@constants'; +import { SITE_URL, COMPANY } from '@constants'; + +// Логика авторизации (пока статичная переменная) +const isAuthorized = false; // Измените на true, чтобы увидеть форму --- -

Контакты

+ +
+
+
+
+ + БЕСПЛАТНАЯ КОНСУЛЬТАЦИЯ +
+

+ Свяжитесь с нами +

+

+ Мы всегда на связи и готовы помочь вам в решении автоспоров. Оставьте заявку или позвоните — первая консультация бесплатно. +

+
+
+
+ +
+
+
+ +
+
+ + + +
+

Телефон

+ + {COMPANY.phone} + +

Звоните в рабочее время

+
+ + +
+ +

Email

+ + {COMPANY.email} + +

Ответим в течение 24 часов

+
+ + +
+
+ + + + +
+

Адрес

+

{COMPANY.address}

+
+ + + + + {COMPANY.workHours} +
+
+
+
+
+ + +
+
+
+

+ Напишите нам +

+

+ Опишите вашу ситуацию — мы ответим в ближайшее время +

+
+ + {isAuthorized ? ( +
+
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+ + + +

+ Нажимая кнопку, вы соглашаетесь с + политикой конфиденциальности +

+
+ ) : ( +
+
+ + + + +
+

Форма доступна только клиентам

+

Чтобы отправить сообщение напрямую юристу, пожалуйста, авторизуйтесь в личном кабинете.

+ Войти в кабинет +
+ )} +
+
+ + +
+
+
+

+ Нужна срочная помощь? +

+

+ Запишитесь на бесплатную консультацию прямо сейчас — мы перезвоним в течение 15 минут +

+ +
+
+
+ + + + \ No newline at end of file diff --git a/frontend/src/pages/reviews.astro b/frontend/src/pages/reviews.astro index d185601..5f2aaea 100644 --- a/frontend/src/pages/reviews.astro +++ b/frontend/src/pages/reviews.astro @@ -1,13 +1,230 @@ --- import Layout from '@layouts/Layout.astro'; import { SITE_URL } from '@constants'; +import ReviewCard from '@components/reviews/ReviewCard.astro'; +import VotingSummary from '@components/reviews/VotingSummary.astro'; +import { reviewsData, votingSummary } from '@data/reviewsData'; --- -

Отзывы

+
+
+ + + + + + +
+ {reviewsData.map((review, index) => ( + + ))} +
+ + +
+

Хотите оставить отзыв?

+

+ Поделитесь своим опытом работы с нами. Ваш отзыв поможет другим водителям принять правильное решение. +

+ + Оставить отзыв + +
+
+
+ + + + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 6fbe542..d96b1a5 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -7,6 +7,7 @@ "paths": { "@styles/*": ["src/styles/*"], "@components/*": ["src/components/*"], + "@data/*": ["src/data/*"], "@constants": ["src/constants.ts"], "@constants/*": ["src/constants/*"], "@layouts/*": ["src/layouts/*"],