|
| 1 | +import { CompanyLogo } from '@/components/company-logo'; |
| 2 | +import { Badge } from '@/components/ui/badge'; |
| 3 | +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; |
| 4 | +import { Tabs } from '@/components/ui/tabs'; |
| 5 | +import { caseStudies } from '@/lib/data/case-studies'; |
| 6 | +import type { Locale } from '@/lib/i18n'; |
| 7 | +import { notFound } from 'next/navigation'; |
| 8 | + |
| 9 | +type Params = { lang: Locale; slug: string }; |
| 10 | + |
| 11 | +export function generateStaticParams() { |
| 12 | + const locales: Locale[] = ['es', 'en']; |
| 13 | + return caseStudies.flatMap((item) => locales.map((lang) => ({ lang, slug: item.slug }))); |
| 14 | +} |
| 15 | + |
| 16 | +export default function CaseStudyLangPage({ params }: { params: Params }) { |
| 17 | + if (params.lang !== 'es' && params.lang !== 'en') return notFound(); |
| 18 | + |
| 19 | + const study = caseStudies.find((item) => item.slug === params.slug); |
| 20 | + if (!study) return notFound(); |
| 21 | + |
| 22 | + const isEn = params.lang === 'en'; |
| 23 | + const title = isEn && study.titleEn ? study.titleEn : study.title; |
| 24 | + const problem = isEn && study.problemEn ? study.problemEn : study.problem; |
| 25 | + const solution = isEn && study.solutionEn ? study.solutionEn : study.solution; |
| 26 | + const impact = isEn && study.impactEn ? study.impactEn : study.impact; |
| 27 | + |
| 28 | + const tabs = [ |
| 29 | + { id: 'context', label: isEn ? 'Context' : 'Contexto', content: problem }, |
| 30 | + { id: 'solution', label: isEn ? 'Solution' : 'Solución', content: solution }, |
| 31 | + { |
| 32 | + id: 'impact', |
| 33 | + label: isEn ? 'Impact' : 'Impacto', |
| 34 | + content: ( |
| 35 | + <ul className="list-disc pl-4 space-y-1"> |
| 36 | + {impact.map((item) => ( |
| 37 | + <li key={item}>{item}</li> |
| 38 | + ))} |
| 39 | + </ul> |
| 40 | + ) |
| 41 | + } |
| 42 | + ]; |
| 43 | + |
| 44 | + return ( |
| 45 | + <main className="min-h-screen py-16 md:py-20"> |
| 46 | + <div className="max-w-4xl mx-auto px-4 space-y-8"> |
| 47 | + <div className="flex items-center gap-3"> |
| 48 | + <CompanyLogo companyId={study.companyId} size={40} /> |
| 49 | + <div> |
| 50 | + <p className="text-sm text-base-muted uppercase tracking-[0.2em]">{study.company}</p> |
| 51 | + <h1 className="text-3xl font-semibold font-display text-base-text">{title}</h1> |
| 52 | + </div> |
| 53 | + </div> |
| 54 | + <div className="flex flex-wrap gap-2"> |
| 55 | + <Badge variant="blue">{study.domain}</Badge> |
| 56 | + {study.frontend.map((item) => ( |
| 57 | + <Badge key={item} variant="mint"> |
| 58 | + Frontend: {item} |
| 59 | + </Badge> |
| 60 | + ))} |
| 61 | + {study.backend.map((item) => ( |
| 62 | + <Badge key={item} variant="mint"> |
| 63 | + Backend: {item} |
| 64 | + </Badge> |
| 65 | + ))} |
| 66 | + {study.infra.map((item) => ( |
| 67 | + <Badge key={item} variant="muted"> |
| 68 | + {item} |
| 69 | + </Badge> |
| 70 | + ))} |
| 71 | + </div> |
| 72 | + <Card> |
| 73 | + <CardHeader> |
| 74 | + <CardTitle>{isEn ? 'Details' : 'Detalles'}</CardTitle> |
| 75 | + </CardHeader> |
| 76 | + <CardContent> |
| 77 | + <Tabs tabs={tabs} /> |
| 78 | + </CardContent> |
| 79 | + </Card> |
| 80 | + </div> |
| 81 | + </main> |
| 82 | + ); |
| 83 | +} |
0 commit comments