137 lines
4.6 KiB
TypeScript
137 lines
4.6 KiB
TypeScript
import React, { useEffect, useState } from 'react'
|
||
import { Helmet } from 'react-helmet'
|
||
import navigationIcon from '@/configs/navigation-icon.config'
|
||
import { AboutDto } from '@/proxy/about/models'
|
||
import { getAbout } from '@/services/about'
|
||
import { useLocalization } from '@/utils/hooks/useLocalization'
|
||
import Loading from '@/components/shared/Loading'
|
||
|
||
const About: React.FC = () => {
|
||
const { translate } = useLocalization()
|
||
const [loading, setLoading] = useState(true)
|
||
const [about, setAbout] = useState<AboutDto>()
|
||
|
||
const iconColors = [
|
||
'text-blue-600',
|
||
'text-red-600',
|
||
'text-green-600',
|
||
'text-purple-600',
|
||
'text-yellow-600',
|
||
'text-indigo-600',
|
||
]
|
||
|
||
function getRandomColor() {
|
||
return iconColors[Math.floor(Math.random() * iconColors.length)]
|
||
}
|
||
|
||
useEffect(() => {
|
||
setLoading(true)
|
||
const fetchServices = async () => {
|
||
try {
|
||
const result = await getAbout()
|
||
setAbout(result.data)
|
||
} catch (error) {
|
||
console.error('About alınırken hata oluştu:', error)
|
||
} finally {
|
||
setLoading(false)
|
||
}
|
||
}
|
||
fetchServices()
|
||
}, [])
|
||
|
||
if (loading) {
|
||
return (
|
||
<div className="flex items-center justify-center min-h-screen bg-gray-50">
|
||
<div className="text-center">
|
||
<Loading loading={loading} />
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|
||
|
||
return (
|
||
<>
|
||
<Helmet
|
||
titleTemplate="%s | Erp Platform"
|
||
title={translate('::' + 'Public.about.title')}
|
||
defaultTitle="Erp Platform"
|
||
></Helmet>
|
||
|
||
<div className="min-h-screen bg-gray-50">
|
||
{/* Hero Section */}
|
||
<div className="relative bg-blue-900 text-white py-12">
|
||
<div
|
||
className="absolute inset-0 opacity-20"
|
||
style={{
|
||
backgroundImage:
|
||
'url("https://images.pexels.com/photos/3183183/pexels-photo-3183183.jpeg?auto=compress&cs=tinysrgb&w=1920")',
|
||
backgroundSize: 'cover',
|
||
backgroundPosition: 'center',
|
||
}}
|
||
></div>
|
||
<div className="container mx-auto pt-20 relative">
|
||
<h1 className="text-5xl font-bold ml-4 mt-3 mb-2 text-white">
|
||
{translate('::Public.about.title')}
|
||
</h1>
|
||
<p className="text-xl max-w-3xl ml-4">{translate('::Public.about.subtitle')}</p>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Stats Section */}
|
||
<div className="py-10 bg-white">
|
||
<div className="container mx-auto px-4">
|
||
<div className="grid grid-cols-1 md:grid-cols-4 gap-8">
|
||
{about?.statsDto.map((stat, index) => {
|
||
const IconComponent = navigationIcon[stat.icon || '']
|
||
|
||
let displayValue = stat.value
|
||
let elementRef = undefined
|
||
|
||
return (
|
||
<div key={index} className="text-center">
|
||
{IconComponent && (
|
||
<IconComponent className={`w-12 h-12 mx-auto mb-4 ${getRandomColor()}`} />
|
||
)}
|
||
<div className="text-4xl font-bold text-gray-900 mb-2">{displayValue}</div>
|
||
<div className="text-gray-600">{translate('::' + stat.labelKey)}</div>
|
||
</div>
|
||
)
|
||
})}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Main Content */}
|
||
<div className="py-6">
|
||
<div className="container mx-auto px-4">
|
||
<div className="mb-6">
|
||
<div className="p-5 mx-auto mx-auto text-gray-800 text-lg leading-relaxed shadow-md bg-white border-l-4 border-blue-600">
|
||
<p>{translate('::' + about?.descriptionsDto[0])}</p>
|
||
<p className="text-center p-5 text-blue-800">
|
||
{translate('::' + about?.descriptionsDto[1])}
|
||
</p>
|
||
<p>{translate('::' + about?.descriptionsDto[2])}</p>
|
||
<p className="text-center p-5 text-blue-800">
|
||
{translate('::' + about?.descriptionsDto[3])}
|
||
</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12">
|
||
{about?.sectionsDto.map((section, index) => (
|
||
<div key={index} className="bg-white p-8 rounded-xl shadow-lg">
|
||
<h3 className="text-2xl font-bold text-gray-900 mb-4">
|
||
{translate('::' + section.key)}
|
||
</h3>
|
||
<p className="text-gray-700">{translate('::' + section.descKey)}</p>
|
||
</div>
|
||
))}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</>
|
||
)
|
||
}
|
||
|
||
export default About
|