Мелкие правки кода

This commit is contained in:
Web-serfer 2026-04-15 01:31:23 +05:00
parent 28f41cf346
commit 014439d565
2 changed files with 183 additions and 154 deletions

View file

@ -12,171 +12,191 @@ export interface Case {
featured?: boolean; featured?: boolean;
} }
export type CaseCategory = export type CaseCategory =
| 'insurance' | "insurance"
| 'rights' | "rights"
| 'accident' | "accident"
| 'court' | "court"
| 'consultation'; | "consultation";
export const categories = [ export const categories = [
{ {
id: 'all', id: "all",
label: 'Все кейсы', label: "Все кейсы",
icon: '📋' icon: "📋",
}, },
{ {
id: 'insurance', id: "insurance",
label: 'Споры со страховыми', label: "Споры со страховыми",
icon: '🛡️' icon: "🛡️",
}, },
{ {
id: 'rights', id: "rights",
label: 'Возврат прав', label: "Возврат прав",
icon: '🚗' icon: "🚗",
}, },
{ {
id: 'accident', id: "accident",
label: 'ДТП и возмещение', label: "ДТП и возмещение",
icon: '💥' icon: "💥",
}, },
{ {
id: 'court', id: "court",
label: 'Судебные дела', label: "Судебные дела",
icon: '⚖️' icon: "⚖️",
}, },
] as const; ] as const;
export const casesData: Case[] = [ export const casesData: Case[] = [
{ {
id: 1, id: 1,
title: 'Взыскание 450 000 ₽ со страховой компании', title: "Взыскание 450 000 ₽ со страховой компании",
category: 'insurance', category: "insurance",
description: 'Клиент обратился после ДТП — страховая выплатила только 50 000 ₽ вместо положенных 500 000 ₽', description:
result: 'Выплачено 500 000 ₽ + неустойка 50 000 ₽', "Клиент обратился после ДТП — страховая выплатила только 50 000 ₽ вместо положенных 500 000 ₽",
clientStory: 'Попал в ДТП по вине другого водителя. Страховая насчитала смешную сумму. Ребята из Автоюриста 086 сделали независимую экспертизу и выиграли суд.', result: "Выплачено 500 000 ₽ + неустойка 50 000 ₽",
amount: '500 000 ₽', clientStory:
duration: '3 месяца', "Попал в ДТП по вине другого водителя. Страховая насчитала смешную сумму. Ребята из Автоюриста 086 сделали независимую экспертизу и выиграли суд.",
image: '/images/cases/case-insurance-1.jpg', amount: "500 000 ₽",
tags: ['ОСАГО', 'Независимая экспертиза', 'Суд'], duration: "3 месяца",
image: "/images/cases/case-insurance-1.jpg",
tags: ["ОСАГО", "Независимая экспертиза", "Суд"],
featured: true, featured: true,
}, },
{ {
id: 2, id: 2,
title: 'Возврат водительских прав после лишения', title: "Возврат водительских прав после лишения",
category: 'rights', category: "rights",
description: 'Клиент был лишён прав на 1,5 года за отказ от медосвидетельствования. Нашли procedural violations.', description:
result: 'Права возвращены через 4 месяца', "Клиент был лишён прав на 1,5 года за отказ от медосвидетельствования. Нашли процедурные нарушения.",
clientStory: 'Остановили ночью, сказали пройти освидетельствование. Я попросил показать документы врача — отказали. Лишили прав. Юристы нашли нарушения в процедуре.', result: "Права возвращены через 4 месяца",
amount: 'Сохранены права', clientStory:
duration: '4 месяца', "Остановили ночью, сказали пройти освидетельствование. Я попросил показать документы врача — отказали. Лишили прав. Юристы нашли нарушения в процедуре.",
image: '/images/cases/case-rights-1.jpg', amount: "Сохранены права",
tags: ['Лишение прав', 'Медосвидетельствование', 'Апелляция'], duration: "4 месяца",
image: "/images/cases/case-rights-1.jpg",
tags: ["Лишение прав", "Медосвидетельствование", "Апелляция"],
featured: true, featured: true,
}, },
{ {
id: 3, id: 3,
title: 'Оспаривание вины в ДТП на перекрёстке', title: "Оспаривание вины в ДТП на перекрёстке",
category: 'accident', category: "accident",
description: 'Сложное ДТП на регулируемом перекрёстке. ГИБДД признала виновным нашего клиента.', description:
result: 'Виность пересмотрена, выплата 320 000 ₽', "Сложное ДТП на регулируемом перекрёстке. ГИБДД признала виновным нашего клиента.",
clientStory: 'Ехал на зелёный, а мне врезались сбоку. Инспектор составил протокол против меня. Адвокаты собрали видеозаписи и доказали мою невиновность.', result: "Виность пересмотрена, выплата 320 000 ₽",
amount: '320 000 ₽', clientStory:
duration: '5 месяцев', "Ехал на зелёный, а мне врезались сбоку. Инспектор составил протокол против меня. Адвокаты собрали видеозаписи и доказали мою невиновность.",
image: '/images/cases/case-accident-1.jpg', amount: "320 000 ₽",
tags: ['ДТП', 'Видеозапись', 'Перекрёсток'], duration: "5 месяцев",
image: "/images/cases/case-accident-1.jpg",
tags: ["ДТП", "Видеозапись", "Перекрёсток"],
}, },
{ {
id: 4, id: 4,
title: 'Защита от необоснованного штрафа с камеры', title: "Защита от необоснованного штрафа с камеры",
category: 'court', category: "court",
description: 'Клиент получил штраф 5000 ₽ с камеры фотовидеофиксации за нарушение, которого не совершал.', description:
result: 'Штраф отменён полностью', "Клиент получил штраф 5000 ₽ с камеры фотовидеофиксации за нарушение, которого не совершал.",
clientStory: 'Пришел штраф за проезд на красный. Но я там не был! Оказалось, камера ошиблась. Юристы помогли оспорить.', result: "Штраф отменён полностью",
amount: 'Экономия 5 000 ₽', clientStory:
duration: '1 месяц', "Пришел штраф за проезд на красный. Но я там не был! Оказалось, камера ошиблась. Юристы помогли оспорить.",
image: '/images/cases/case-court-1.jpg', amount: "Экономия 5 000 ₽",
tags: ['Штрафы', 'Камеры', 'Обжалование'], duration: "1 месяц",
image: "/images/cases/case-court-1.jpg",
tags: ["Штрафы", "Камеры", "Обжалование"],
}, },
{ {
id: 5, id: 5,
title: 'Возмещение ущерба от града по КАСКО', title: "Возмещение ущерба от града по КАСКО",
category: 'insurance', category: "insurance",
description: 'После сильного града автомобиль получил серьёзные повреждения. Страховая отказала в выплате.', description:
result: 'Выплачено 680 000 ₽ по КАСКО', "После сильного града автомобиль получил серьёзные повреждения. Страховая отказала в выплате.",
clientStory: 'Градом побило стёкла и крышу. Страховая сказала, что это не страховой случай. Обратился сюда — выплатили всё до копейки.', result: "Выплачено 680 000 ₽ по КАСКО",
amount: '680 000 ₽', clientStory:
duration: '2 месяца', "Градом побило стёкла и крышу. Страховая сказала, что это не страховой случай. Обратился сюда — выплатили всё до копейки.",
image: '/images/cases/case-insurance-2.jpg', amount: "680 000 ₽",
tags: ['КАСКО', 'Град', 'Отказ страховой'], duration: "2 месяца",
image: "/images/cases/case-insurance-2.jpg",
tags: ["КАСКО", "Град", "Отказ страховой"],
}, },
{ {
id: 6, id: 6,
title: 'Возврат прав после лишения за алкоголь', title: "Возврат прав после лишения за алкоголь",
category: 'rights', category: "rights",
description: 'Клиента лишили прав на 2 года за управление в состоянии опьянения. Нашли ошибки в протоколе.', description:
result: 'Дело прекращено, права возвращены', "Клиента лишили прав на 2 года за управление в состоянии опьянения. Нашли ошибки в протоколе.",
clientStory: 'Остановили, заподозрили опьянение. Составили протокол с ошибками. Благодаря юристам удалось доказать невиновность.', result: "Дело прекращено, права возвращены",
amount: 'Сохранены права', clientStory:
duration: '6 месяцев', "Остановили, заподозрили опьянение. Составили протокол с ошибками. Благодаря юристам удалось доказать невиновность.",
image: '/images/cases/case-rights-2.jpg', amount: "Сохранены права",
tags: ['Лишение прав', 'Алкоголь', 'Протокол'], duration: "6 месяцев",
image: "/images/cases/case-rights-2.jpg",
tags: ["Лишение прав", "Алкоголь", "Протокол"],
featured: true, featured: true,
}, },
{ {
id: 7, id: 7,
title: 'Спор о виновности при столкновении на парковке', title: "Спор о виновности при столкновении на парковке",
category: 'accident', category: "accident",
description: 'На подземной парковке произошло столкновение. Владелец соседнего авто обвинил нашего клиента.', description:
result: 'Доказана невиновность клиента', "На подземной парковке произошло столкновение. Владелец соседнего авто обвинил нашего клиента.",
clientStory: 'Парковался, задел чужую машину. Но оказалось, что тот автомобиль стоял в неположенном месте. Юристы разобрались.', result: "Доказана невиновность клиента",
amount: '0 ₽ (виность не доказана)', clientStory:
duration: '2 месяца', "Парковался, задел чужую машину. Но оказалось, что тот автомобиль стоял в неположенном месте. Юристы разобрались.",
image: '/images/cases/case-accident-2.jpg', amount: "0 ₽ (виность не доказана)",
tags: ['Парковка', 'Столкновение', 'Защита'], duration: "2 месяца",
image: "/images/cases/case-accident-2.jpg",
tags: ["Парковка", "Столкновение", "Защита"],
}, },
{ {
id: 8, id: 8,
title: 'Консультация по покупке автомобиля с пробегом', title: "Консультация по покупке автомобиля с пробегом",
category: 'consultation', category: "consultation",
description: 'Клиент хотел купить б/у авто, но боялся нарваться на проблемы с документами или скрытыми дефектами.', description:
result: 'Безопасная покупка автомобиля', "Клиент хотел купить б/у авто, но боялся нарваться на проблемы с документами или скрытыми дефектами.",
clientStory: 'Хотел купить машину с рук. Юристы проверили все документы, историю, залоги. Всё оказалось чисто — купил без проблем.', result: "Безопасная покупка автомобиля",
amount: 'Предотвращены риски', clientStory:
duration: '1 неделя', "Хотел купить машину с рук. Юристы проверили все документы, историю, залоги. Всё оказалось чисто — купил без проблем.",
image: '/images/cases/case-consultation-1.jpg', amount: "Предотвращены риски",
tags: ['Покупка авто', 'Проверка документов', 'Консультация'], duration: "1 неделя",
image: "/images/cases/case-consultation-1.jpg",
tags: ["Покупка авто", "Проверка документов", "Консультация"],
}, },
{ {
id: 9, id: 9,
title: 'Судебный иск к автосалону за скрытые дефекты', title: "Судебный иск к автосалону за скрытые дефекты",
category: 'court', category: "court",
description: 'Клиент купил автомобиль в салоне, но обнаружил скрытые дефекты, о которых не предупредили.', description:
result: 'Возврат 1 200 000 ₽ за автомобиль', "Клиент купил автомобиль в салоне, но обнаружил скрытые дефекты, о которых не предупредили.",
clientStory: 'Купил машину в салоне. Через месяц посыпались проблемы. Оказалось, defects были скрыты. Выиграли суд и вернули деньги.', result: "Возврат 1 200 000 ₽ за автомобиль",
amount: '1 200 000 ₽', clientStory:
duration: '7 месяцев', "Купил машину в салоне. Через месяц посыпались проблемы. Оказалось, дефекты были скрыты. Выиграли суд и вернули деньги.",
image: '/images/cases/case-court-2.jpg', amount: "1 200 000 ₽",
tags: ['Автосалон', 'Скрытые дефекты', 'Возврат денег'], duration: "7 месяцев",
image: "/images/cases/case-court-2.jpg",
tags: ["Автосалон", "Скрытые дефекты", "Возврат денег"],
featured: true, featured: true,
}, },
{ {
id: 10, id: 10,
title: 'Компенсация морального вреда после ДТП', title: "Компенсация морального вреда после ДТП",
category: 'accident', category: "accident",
description: 'После серьёзного ДТП клиент получил травмы и моральный вред. Нужно было взыскать компенсацию.', description:
result: 'Компенсация 250 000 ₽ морального вреда', "После серьёзного ДТП клиент получил травмы и моральный вред. Нужно было взыскать компенсацию.",
clientStory: 'Попал в аварию, получил травмы. Страховая покрыла только лечение. Юристы помогли получить компенсацию за моральный вред.', result: "Компенсация 250 000 ₽ морального вреда",
amount: '250 000 ₽', clientStory:
duration: '4 месяца', "Попал в аварию, получил травмы. Страховая покрыла только лечение. Юристы помогли получить компенсацию за моральный вред.",
image: '/images/cases/case-accident-3.jpg', amount: "250 000 ₽",
tags: ['Моральный вред', 'Травмы', 'Компенсация'], duration: "4 месяца",
image: "/images/cases/case-accident-3.jpg",
tags: ["Моральный вред", "Травмы", "Компенсация"],
}, },
]; ];
export const statsData = { export const statsData = {
totalCases: '500+', totalCases: "500+",
successRate: '98%', successRate: "98%",
totalRecovered: '50+ млн ₽', totalRecovered: "50+ млн ₽",
averageDuration: '3-4 месяца', averageDuration: "3-4 месяца",
} as const; } as const;

View file

@ -1,127 +1,136 @@
export interface Review { export interface Review {
id: number;
name: string; name: string;
car: string; car: string;
text: string; text: string;
rating: number; rating: number;
initial: string; avatar: { initial: string; color: string; };
color: string;
date: string; date: string;
votesCount: number; votesCount: number;
isHelpful: boolean; isHelpful: boolean;
} }
export const reviewsData: Review[] = [ const reviewsRaw = [
{ {
id: 1,
name: "Алексей М.", name: "Алексей М.",
car: "Toyota Camry", car: "Toyota Camry",
text: "Помогли вернуть права после того, как инспектор незаконно составил протокол за встречку. Юрист нашел кучу ошибок в схеме ДТП. Огромное спасибо!", text: "Помогли вернуть права после того, как инспектор незаконно составил протокол за встречку. Юрист нашел кучу ошибок в схеме ДТП. Огромное спасибо!",
rating: 5, rating: 5,
initial: "А",
color: "bg-blue-100 text-blue-600",
date: "2024-03-15", date: "2024-03-15",
votesCount: 24, votesCount: 24,
isHelpful: true isHelpful: true
}, },
{ {
id: 2,
name: "Екатерина П.", name: "Екатерина П.",
car: "Hyundai Solaris", car: "Hyundai Solaris",
text: "Страховая выплатила копейки по ОСАГО. Обратилась сюда, сделали независимую экспертизу и через суд взыскали еще 120 тысяч. Профессионалы!", text: "Страховая выплатила копейки по ОСАГО. Обратилась сюда, сделали независимую экспертизу и через суд взыскали еще 120 тысяч. Профессионалы!",
rating: 5, rating: 5,
initial: "Е",
color: "bg-teal-100 text-teal-600",
date: "2024-03-10", date: "2024-03-10",
votesCount: 18, votesCount: 18,
isHelpful: true isHelpful: true
}, },
{ {
id: 3,
name: "Игорь С.", name: "Игорь С.",
car: "Lexus RX", car: "Lexus RX",
text: "Грамотно разобрали сложное ДТП на перекрестке. Доказали, что я не виноват, хотя ГИБДД изначально решило иначе. Лучшие в Сургуте.", text: "Грамотно разобрали сложное ДТП на перекрестке. Доказали, что я не виноват, хотя ГИБДД изначально решило иначе. Лучшие в Сургуте.",
rating: 5, rating: 5,
initial: "И",
color: "bg-orange-100 text-orange-600",
date: "2024-03-05", date: "2024-03-05",
votesCount: 31, votesCount: 31,
isHelpful: true isHelpful: true
}, },
{ {
id: 4,
name: "Марина К.", name: "Марина К.",
car: "Kia Rio", car: "Kia Rio",
text: "Обратилась по вопросу возврата прав после лишения. Всё сделали быстро и профессионально. Через 2 месяца права уже были у меня. Рекомендую!", text: "Обратилась по вопросу возврата прав после лишения. Всё сделали быстро и профессионально. Через 2 месяца права уже были у меня. Рекомендую!",
rating: 4, rating: 4,
initial: "М",
color: "bg-pink-100 text-pink-600",
date: "2024-02-28", date: "2024-02-28",
votesCount: 15, votesCount: 15,
isHelpful: true isHelpful: true
}, },
{ {
id: 5,
name: "Дмитрий В.", name: "Дмитрий В.",
car: "Volkswagen Tiguan", car: "Volkswagen Tiguan",
text: "Были проблемы со страховой после ДТП. Юристы помогли составить претензию, потом представляли интересы в суде. Выиграли дело полностью.", text: "Были проблемы со страховой после ДТП. Юристы помогли составить претензию, потом представляли интересы в суде. Выиграли дело полностью.",
rating: 5, rating: 5,
initial: "Д",
color: "bg-purple-100 text-purple-600",
date: "2024-02-20", date: "2024-02-20",
votesCount: 22, votesCount: 22,
isHelpful: true isHelpful: true
}, },
{ {
id: 6,
name: "Ольга Н.", name: "Ольга Н.",
car: "Mazda CX-5", car: "Mazda CX-5",
text: "Купила б/у авто с проблемами, которые не были указаны при продаже. Юристы помогли вернуть деньги через суд. Очень благодарна за помощь!", text: "Купила б/у авто с проблемами, которые не были указаны при продаже. Юристы помогли вернуть деньги через суд. Очень благодарна за помощь!",
rating: 5, rating: 5,
initial: "О",
color: "bg-indigo-100 text-indigo-600",
date: "2024-02-15", date: "2024-02-15",
votesCount: 27, votesCount: 27,
isHelpful: true isHelpful: true
}, },
{ {
id: 7,
name: "Сергей Т.", name: "Сергей Т.",
car: "Nissan Qashqai", car: "Nissan Qashqai",
text: "Спор со страховой длился полгода. Сам не мог ничего добиться. Обратился сюда - ребята за 2 месяца решили вопрос в мою пользу. Супер!", text: "Спор со страховой длился полгода. Сам не мог ничего добиться. Обратился сюда - ребята за 2 месяца решили вопрос в мою пользу. Супер!",
rating: 4, rating: 4,
initial: "С",
color: "bg-green-100 text-green-600",
date: "2024-02-08", date: "2024-02-08",
votesCount: 19, votesCount: 19,
isHelpful: true isHelpful: true
}, },
{ {
id: 8,
name: "Анна Р.", name: "Анна Р.",
car: "Skoda Octavia", car: "Skoda Octavia",
text: "Помогли оспорить штраф с камеры, который пришел ошибочно. Юрист быстро разобрался в ситуации и подготовил все документы. Спасибо!", text: "Помогли оспорить штраф с камеры, который пришел ошибочно. Юрист быстро разобрался в ситуации и подготовил все документы. Спасибо!",
rating: 5, rating: 5,
initial: "А",
color: "bg-yellow-100 text-yellow-600",
date: "2024-02-01", date: "2024-02-01",
votesCount: 12, votesCount: 12,
isHelpful: false isHelpful: false
}, },
{ {
id: 9,
name: "Виктор Л.", name: "Виктор Л.",
car: "Honda CR-V", car: "Honda CR-V",
text: "Обратился по вопросу компенсации после ДТП. Страховая занижала выплату в 3 раза. Сделали экспертизу и через суд добились справедливой суммы.", text: "Обратился по вопросу компенсации после ДТП. Страховая занижала выплату в 3 раза. Сделали экспертизу и через суд добились справедливой суммы.",
rating: 5, rating: 5,
initial: "В",
color: "bg-red-100 text-red-600",
date: "2024-01-25", date: "2024-01-25",
votesCount: 35, votesCount: 35,
isHelpful: true isHelpful: true
} }
]; ];
// Агрегированные данные для голосования const colors = [
export const votingSummary = { "bg-blue-100 text-blue-600", "bg-teal-100 text-teal-600", "bg-orange-100 text-orange-600",
averageRating: 4.8, "bg-pink-100 text-pink-600", "bg-purple-100 text-purple-600", "bg-indigo-100 text-indigo-600",
totalVotes: 203, "bg-green-100 text-green-600", "bg-yellow-100 text-yellow-600", "bg-red-100 text-red-600"
totalReviews: reviewsData.length, ];
ratingDistribution: {
5: 7, export const reviewsData: Review[] = reviewsRaw.map(review => {
4: 2, const initial = review.name.charAt(0).toUpperCase();
3: 0, const color = colors[initial.charCodeAt(0) % colors.length];
2: 0, return { ...review, avatar: { initial, color } };
1: 0 });
}
}; export const votingSummary = (() => {
const totalReviews = reviewsData.length;
const totalVotes = reviewsData.reduce((sum, review) => sum + review.votesCount, 0);
const totalRating = reviewsData.reduce((sum, review) => sum + review.rating, 0);
const averageRating = totalReviews > 0 ? parseFloat((totalRating / totalReviews).toFixed(1)) : 0;
const ratingDistribution = reviewsData.reduce((acc, review) => {
acc[review.rating] = (acc[review.rating] || 0) + 1;
return acc;
}, {} as Record<number, number>);
return {
averageRating,
totalVotes,
totalReviews,
ratingDistribution
};
})();