Merge branch 'dev' of https://devgit.oriyo.tj/adilovcode/oriyo_next into dev
This commit is contained in:
commit
1e9e2445e6
1
public/placeholder.svg
Normal file
1
public/placeholder.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg fill="none" viewBox="0 0 142 80" xmlns="http://www.w3.org/2000/svg"><title></title><rect fill="#F2F4F5" height="80" stroke="#E3E4E6" width="142"></rect><path d="M84.8156 47.5402L77.8157 33.9407C77.5479 33.4222 77.0282 33.0703 76.4349 33.0108C75.8434 32.9445 75.2572 33.1876 74.8844 33.6381L68.8854 40.9206L64.9707 38.386C64.5717 38.1293 64.08 38.0392 63.6162 38.1412C63.149 38.2432 62.7447 38.5271 62.4997 38.9249L57.2497 47.4246C56.9242 47.9499 56.9172 48.6026 57.227 49.1381C57.5367 49.6719 58.1195 50 58.7495 50H83.2494C83.8567 50 84.4184 49.694 84.7386 49.1925C85.0589 48.691 85.0851 48.0655 84.8156 47.5402Z" fill="#CACBCC"></path><path d="M67.5 33C69.433 33 71 31.433 71 29.5C71 27.567 69.433 26 67.5 26C65.567 26 64 27.567 64 29.5C64 31.433 65.567 33 67.5 33Z" fill="#CACBCC"></path><defs><clipPath id="clip0"><rect fill="white" height="65" width="127"></rect></clipPath></defs></svg>
|
||||||
|
After Width: | Height: | Size: 896 B |
@ -1,5 +1,6 @@
|
|||||||
import { Map, Placemark, YMaps } from '@pbe/react-yandex-maps';
|
import { Map, Placemark, YMaps } from '@pbe/react-yandex-maps';
|
||||||
import React, { Dispatch, SetStateAction } from 'react';
|
import { isEmpty } from 'lodash';
|
||||||
|
import { Dispatch, SetStateAction } from 'react';
|
||||||
|
|
||||||
import { Point } from '../model';
|
import { Point } from '../model';
|
||||||
|
|
||||||
@ -9,7 +10,7 @@ type YandexMapProps = {
|
|||||||
setSelectedStation: Dispatch<SetStateAction<number | null>>;
|
setSelectedStation: Dispatch<SetStateAction<number | null>>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const mapCenter = [55.751574, 37.573856];
|
const mapCenter = [38.53575, 68.77905];
|
||||||
|
|
||||||
export const YandexMap = ({
|
export const YandexMap = ({
|
||||||
points,
|
points,
|
||||||
@ -21,12 +22,11 @@ export const YandexMap = ({
|
|||||||
query={{
|
query={{
|
||||||
apikey: process.env.NEXT_PUBLIC_YANDEX_MAP_API_KEY,
|
apikey: process.env.NEXT_PUBLIC_YANDEX_MAP_API_KEY,
|
||||||
lang: 'ru_RU',
|
lang: 'ru_RU',
|
||||||
// load: 'geoObject.addon.balloon',
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Map
|
<Map
|
||||||
defaultState={{
|
defaultState={{
|
||||||
center: points[0]?.coordinates || mapCenter,
|
center: !isEmpty(points) ? points[0].coordinates : mapCenter,
|
||||||
zoom: 11,
|
zoom: 11,
|
||||||
behaviors: ['drag', 'multiTouch', 'dblClickZoom', 'scrollZoom'],
|
behaviors: ['drag', 'multiTouch', 'dblClickZoom', 'scrollZoom'],
|
||||||
}}
|
}}
|
||||||
|
|||||||
26
src/middleware.ts
Normal file
26
src/middleware.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { NextRequest, NextResponse } from 'next/server';
|
||||||
|
|
||||||
|
export function middleware(req: NextRequest) {
|
||||||
|
const url = req.nextUrl.clone();
|
||||||
|
const path = url.pathname;
|
||||||
|
|
||||||
|
if (
|
||||||
|
path.startsWith('/customer-dashboard') ||
|
||||||
|
path.startsWith('/corporate-dashboard')
|
||||||
|
) {
|
||||||
|
const token = req.cookies.get(
|
||||||
|
`${path.includes('customer') ? 'bonus' : 'corporate'}__token`,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
url.pathname = '/login';
|
||||||
|
return NextResponse.redirect(url);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NextResponse.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
export const config = {
|
||||||
|
matcher: ['/customer-dashboard/:path*', '/corporate-dashboard/:path*'],
|
||||||
|
};
|
||||||
@ -1,5 +1,6 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { deleteCookie } from 'cookies-next';
|
||||||
import { subMonths } from 'date-fns';
|
import { subMonths } from 'date-fns';
|
||||||
import { Building2, LogOut, Wallet } from 'lucide-react';
|
import { Building2, LogOut, Wallet } from 'lucide-react';
|
||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
@ -104,9 +105,16 @@ export function CorporateDashboard() {
|
|||||||
<div className='flex min-h-screen flex-col px-2.5'>
|
<div className='flex min-h-screen flex-col px-2.5'>
|
||||||
<main className='flex-1 py-10'>
|
<main className='flex-1 py-10'>
|
||||||
<div className='container mx-auto max-w-6xl'>
|
<div className='container mx-auto max-w-6xl'>
|
||||||
<div className='mb-4 flex flex-col gap-4 items-start sm:justify-between sm:items-center sm:mb-8 sm:flex-row'>
|
<div className='mb-4 flex flex-col items-start gap-4 sm:mb-8 sm:flex-row sm:items-center sm:justify-between'>
|
||||||
<h1 className='text-3xl font-bold'>{t('corporate.pageTitle')}</h1>
|
<h1 className='text-3xl font-bold'>{t('corporate.pageTitle')}</h1>
|
||||||
<Button variant='outline' className='gap-2'>
|
<Button
|
||||||
|
variant='outline'
|
||||||
|
className='gap-2'
|
||||||
|
onClick={() => {
|
||||||
|
deleteCookie(`corporate__token`);
|
||||||
|
window.location.reload();
|
||||||
|
}}
|
||||||
|
>
|
||||||
<LogOut className='h-4 w-4' />
|
<LogOut className='h-4 w-4' />
|
||||||
{t('corporate.logoutButton')}
|
{t('corporate.logoutButton')}
|
||||||
</Button>
|
</Button>
|
||||||
@ -114,7 +122,11 @@ export function CorporateDashboard() {
|
|||||||
|
|
||||||
<div className='mb-10 grid gap-3 md:grid-cols-3 md:gap-6'>
|
<div className='mb-10 grid gap-3 md:grid-cols-3 md:gap-6'>
|
||||||
{/* Company Card */}
|
{/* Company Card */}
|
||||||
<Card data-aos='zoom-in' data-aos-mirror="true" className='md:col-span-2'>
|
<Card
|
||||||
|
data-aos='zoom-in'
|
||||||
|
data-aos-mirror='true'
|
||||||
|
className='md:col-span-2'
|
||||||
|
>
|
||||||
<CardHeader className='pb-2'>
|
<CardHeader className='pb-2'>
|
||||||
<CardTitle className='flex items-center gap-2'>
|
<CardTitle className='flex items-center gap-2'>
|
||||||
<Building2 className='h-5 w-5 text-red-600' />
|
<Building2 className='h-5 w-5 text-red-600' />
|
||||||
@ -178,7 +190,11 @@ export function CorporateDashboard() {
|
|||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
{/* Fund Card */}
|
{/* Fund Card */}
|
||||||
<Card data-aos='zoom-in' data-aos-mirror="true" className='bg-gradient-to-br from-red-600 to-red-800 text-white'>
|
<Card
|
||||||
|
data-aos='zoom-in'
|
||||||
|
data-aos-mirror='true'
|
||||||
|
className='bg-gradient-to-br from-red-600 to-red-800 text-white'
|
||||||
|
>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className='flex items-center gap-2'>
|
<CardTitle className='flex items-center gap-2'>
|
||||||
<Wallet className='h-5 w-5' />
|
<Wallet className='h-5 w-5' />
|
||||||
|
|||||||
@ -1,9 +1,11 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
|
import { deleteCookie } from 'cookies-next';
|
||||||
import { ArrowUpRight, Clock, CreditCard, LogOut, User } from 'lucide-react';
|
import { ArrowUpRight, Clock, CreditCard, LogOut, User } from 'lucide-react';
|
||||||
|
|
||||||
import { useFetchMyBonusInfoQuery } from '@/entities/bonus/api/bonus.api';
|
import { useFetchMyBonusInfoQuery } from '@/entities/bonus/api/bonus.api';
|
||||||
|
|
||||||
|
import Loader from '@/shared/components/loader';
|
||||||
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
||||||
import { Button } from '@/shared/shadcn-ui/button';
|
import { Button } from '@/shared/shadcn-ui/button';
|
||||||
import {
|
import {
|
||||||
@ -15,7 +17,6 @@ import {
|
|||||||
} from '@/shared/shadcn-ui/card';
|
} from '@/shared/shadcn-ui/card';
|
||||||
|
|
||||||
import { TransactionsTable } from '@/widgets/transactions-table';
|
import { TransactionsTable } from '@/widgets/transactions-table';
|
||||||
import Loader from '@/shared/components/loader';
|
|
||||||
|
|
||||||
export function CustomerDashboard() {
|
export function CustomerDashboard() {
|
||||||
const { t } = useTextController();
|
const { t } = useTextController();
|
||||||
@ -28,14 +29,25 @@ export function CustomerDashboard() {
|
|||||||
<div className='container mx-auto max-w-6xl'>
|
<div className='container mx-auto max-w-6xl'>
|
||||||
<div className='mb-8 flex items-center justify-between'>
|
<div className='mb-8 flex items-center justify-between'>
|
||||||
<h1 className='text-3xl font-bold'>{t('customer.pageTitle')}</h1>
|
<h1 className='text-3xl font-bold'>{t('customer.pageTitle')}</h1>
|
||||||
<Button variant='outline' className='gap-2'>
|
<Button
|
||||||
|
variant='outline'
|
||||||
|
className='gap-2'
|
||||||
|
onClick={() => {
|
||||||
|
deleteCookie(`bonus__token`);
|
||||||
|
window.location.reload();
|
||||||
|
}}
|
||||||
|
>
|
||||||
<LogOut className='h-4 w-4' />
|
<LogOut className='h-4 w-4' />
|
||||||
{t('customer.logoutButton')}
|
{t('customer.logoutButton')}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mb-10 grid gap-3 md:grid-cols-3 md:gap-6'>
|
<div className='mb-10 grid gap-3 md:grid-cols-3 md:gap-6'>
|
||||||
<Card data-aos="zoom-in" data-aos-mirror="true" className='bg-gradient-to-br from-red-600 to-red-800 text-white'>
|
<Card
|
||||||
|
data-aos='zoom-in'
|
||||||
|
data-aos-mirror='true'
|
||||||
|
className='bg-gradient-to-br from-red-600 to-red-800 text-white'
|
||||||
|
>
|
||||||
{!data || isLoading ? (
|
{!data || isLoading ? (
|
||||||
<Loader />
|
<Loader />
|
||||||
) : (
|
) : (
|
||||||
@ -73,7 +85,11 @@ export function CustomerDashboard() {
|
|||||||
|
|
||||||
{/* Bonus Card */}
|
{/* Bonus Card */}
|
||||||
{/* Customer Card */}
|
{/* Customer Card */}
|
||||||
<Card data-aos="zoom-in" data-aos-mirror="true" className='md:col-span-2'>
|
<Card
|
||||||
|
data-aos='zoom-in'
|
||||||
|
data-aos-mirror='true'
|
||||||
|
className='md:col-span-2'
|
||||||
|
>
|
||||||
<CardHeader className='pb-2'>
|
<CardHeader className='pb-2'>
|
||||||
<CardTitle className='flex items-center gap-2'>
|
<CardTitle className='flex items-center gap-2'>
|
||||||
<User className='h-5 w-5 text-red-600' />
|
<User className='h-5 w-5 text-red-600' />
|
||||||
|
|||||||
@ -19,9 +19,9 @@ import {
|
|||||||
CardHeader,
|
CardHeader,
|
||||||
CardTitle,
|
CardTitle,
|
||||||
} from '@/shared/shadcn-ui/card';
|
} from '@/shared/shadcn-ui/card';
|
||||||
|
import Container from '@/shared/shadcn-ui/conteiner';
|
||||||
|
|
||||||
import { CtaSection } from '@/widgets/cta-section';
|
import { CtaSection } from '@/widgets/cta-section';
|
||||||
import Container from '@/shared/shadcn-ui/conteiner';
|
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: 'Благотворительность | GasNetwork - Сеть заправок в Таджикистане',
|
title: 'Благотворительность | GasNetwork - Сеть заправок в Таджикистане',
|
||||||
@ -48,7 +48,11 @@ export function CharityPage() {
|
|||||||
/>
|
/>
|
||||||
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
||||||
<Container>
|
<Container>
|
||||||
<div data-aos='fade-down' data-aos-duration='800' className='container mx-auto'>
|
<div
|
||||||
|
data-aos='fade-down'
|
||||||
|
data-aos-duration='800'
|
||||||
|
className='container mx-auto'
|
||||||
|
>
|
||||||
<div className='max-w-2xl space-y-6 text-white'>
|
<div className='max-w-2xl space-y-6 text-white'>
|
||||||
<div className='inline-flex items-center justify-center rounded-full bg-red-600/20 p-2'>
|
<div className='inline-flex items-center justify-center rounded-full bg-red-600/20 p-2'>
|
||||||
<Heart className='size-6 text-red-500' />
|
<Heart className='size-6 text-red-500' />
|
||||||
@ -56,7 +60,7 @@ export function CharityPage() {
|
|||||||
<h1 className='text-3xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
<h1 className='text-3xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
||||||
{t('charity.hero.title')}
|
{t('charity.hero.title')}
|
||||||
</h1>
|
</h1>
|
||||||
<p className='text-lg sm:text-xl text-gray-200'>
|
<p className='text-lg text-gray-200 sm:text-xl'>
|
||||||
{t('charity.hero.subtitle')}
|
{t('charity.hero.subtitle')}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -87,21 +91,30 @@ export function CharityPage() {
|
|||||||
|
|
||||||
<div className='space-y-4'>
|
<div className='space-y-4'>
|
||||||
{[0, 1, 2].map((index) => (
|
{[0, 1, 2].map((index) => (
|
||||||
<div data-aos='fade-right' key={index} className='flex items-start'>
|
<div
|
||||||
|
data-aos='fade-right'
|
||||||
|
key={index}
|
||||||
|
className='flex items-start'
|
||||||
|
>
|
||||||
<CheckCircle className='mr-3 h-6 w-6 flex-shrink-0 text-red-600' />
|
<CheckCircle className='mr-3 h-6 w-6 flex-shrink-0 text-red-600' />
|
||||||
<div>
|
<div>
|
||||||
<h3 className='text-lg font-medium'>
|
<h3 className='text-lg font-medium'>
|
||||||
{t(`charity.mission.principles.${index}.title`)}
|
{t(`charity.mission.principles.${index}.title`)}
|
||||||
</h3>
|
</h3>
|
||||||
<p className='text-gray-600'>
|
<p className='text-gray-600'>
|
||||||
{t(`charity.mission.principles.${index}.description`)}
|
{t(
|
||||||
|
`charity.mission.principles.${index}.description`,
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-aos='fade-right' className='relative h-[500px] overflow-hidden rounded-xl shadow-xl'>
|
<div
|
||||||
|
data-aos='fade-right'
|
||||||
|
className='relative h-[500px] overflow-hidden rounded-xl shadow-xl'
|
||||||
|
>
|
||||||
<Image
|
<Image
|
||||||
src='/placeholder.svg?height=500&width=600&text=Наша+миссия'
|
src='/placeholder.svg?height=500&width=600&text=Наша+миссия'
|
||||||
alt={t('charity.mission.imageAlt')}
|
alt={t('charity.mission.imageAlt')}
|
||||||
@ -185,7 +198,11 @@ export function CharityPage() {
|
|||||||
'/placeholder.svg?height=200&width=300&text=Школьные+принадлежности',
|
'/placeholder.svg?height=200&width=300&text=Школьные+принадлежности',
|
||||||
},
|
},
|
||||||
].map((event, index) => (
|
].map((event, index) => (
|
||||||
<Card data-aos='zoom-in-up' key={index} className='overflow-hidden flex flex-col justify-between'>
|
<Card
|
||||||
|
data-aos='zoom-in-up'
|
||||||
|
key={index}
|
||||||
|
className='flex flex-col justify-between overflow-hidden'
|
||||||
|
>
|
||||||
<div>
|
<div>
|
||||||
<div className='relative h-48 w-full'>
|
<div className='relative h-48 w-full'>
|
||||||
<Image
|
<Image
|
||||||
@ -196,7 +213,9 @@ export function CharityPage() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<CardTitle className='text-xl lg:text-2xl'>{event.title}</CardTitle>
|
<CardTitle className='text-xl lg:text-2xl'>
|
||||||
|
{event.title}
|
||||||
|
</CardTitle>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent className='space-y-4'>
|
<CardContent className='space-y-4'>
|
||||||
<p className='text-gray-600'>{event.description}</p>
|
<p className='text-gray-600'>{event.description}</p>
|
||||||
@ -267,7 +286,9 @@ export function CharityPage() {
|
|||||||
].map((item, index) => (
|
].map((item, index) => (
|
||||||
<Card data-aos='zoom-in' key={index} className='text-center'>
|
<Card data-aos='zoom-in' key={index} className='text-center'>
|
||||||
<CardHeader>
|
<CardHeader>
|
||||||
<div className='mb-4 flex justify-center'>{item.icon}</div>
|
<div className='mb-4 flex justify-center'>
|
||||||
|
{item.icon}
|
||||||
|
</div>
|
||||||
<CardTitle className='break-words hyphens-auto'>
|
<CardTitle className='break-words hyphens-auto'>
|
||||||
{item.title}
|
{item.title}
|
||||||
</CardTitle>
|
</CardTitle>
|
||||||
|
|||||||
@ -64,6 +64,8 @@ export function CertificatesPage() {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
certificates.length = 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Container>
|
<Container>
|
||||||
<main className='container mx-auto py-10'>
|
<main className='container mx-auto py-10'>
|
||||||
|
|||||||
@ -3,11 +3,11 @@
|
|||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
|
|
||||||
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
||||||
|
import Container from '@/shared/shadcn-ui/conteiner';
|
||||||
|
|
||||||
import { BenefitsSection } from '@/widgets/clients/ui/benefits-section';
|
import { BenefitsSection } from '@/widgets/clients/ui/benefits-section';
|
||||||
import { ServicesOverviewSection } from '@/widgets/clients/ui/services-overview-section';
|
import { ServicesOverviewSection } from '@/widgets/clients/ui/services-overview-section';
|
||||||
import { CtaSection } from '@/widgets/cta-section';
|
import { CtaSection } from '@/widgets/cta-section';
|
||||||
import Container from '@/shared/shadcn-ui/conteiner';
|
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: 'Клиентам | GasNetwork - Сеть заправок в Таджикистане',
|
title: 'Клиентам | GasNetwork - Сеть заправок в Таджикистане',
|
||||||
@ -34,7 +34,11 @@ export function ClientsPage() {
|
|||||||
/>
|
/>
|
||||||
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
||||||
<Container>
|
<Container>
|
||||||
<div data-aos='fade-down' data-aos-duration="1000" className='container mx-auto'>
|
<div
|
||||||
|
data-aos='fade-down'
|
||||||
|
data-aos-duration='1000'
|
||||||
|
className='container mx-auto'
|
||||||
|
>
|
||||||
<div className='max-w-2xl space-y-4 text-white'>
|
<div className='max-w-2xl space-y-4 text-white'>
|
||||||
<h1 className='text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
<h1 className='text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
||||||
{t('clients.title')}
|
{t('clients.title')}
|
||||||
|
|||||||
@ -5,11 +5,11 @@ import Image from 'next/image';
|
|||||||
|
|
||||||
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
||||||
import { Card, CardContent } from '@/shared/shadcn-ui/card';
|
import { Card, CardContent } from '@/shared/shadcn-ui/card';
|
||||||
|
|
||||||
import { CtaSection } from '@/widgets/cta-section';
|
|
||||||
import Container from '@/shared/shadcn-ui/conteiner';
|
import Container from '@/shared/shadcn-ui/conteiner';
|
||||||
|
|
||||||
import ProgrammImg from '../../../../public/clients/loyatly/03a771e7-5d76-4111-a516-801aa925659f.jpg'
|
import { CtaSection } from '@/widgets/cta-section';
|
||||||
|
|
||||||
|
import ProgrammImg from '../../../../public/clients/loyatly/03a771e7-5d76-4111-a516-801aa925659f.jpg';
|
||||||
|
|
||||||
export const metadata = {
|
export const metadata = {
|
||||||
title: 'Программа лояльности | GasNetwork - Сеть заправок в Таджикистане',
|
title: 'Программа лояльности | GasNetwork - Сеть заправок в Таджикистане',
|
||||||
@ -36,7 +36,11 @@ export function LoyaltyPage() {
|
|||||||
/>
|
/>
|
||||||
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
<div className='absolute inset-0 flex items-center bg-gradient-to-r from-black/70 to-black/30'>
|
||||||
<Container>
|
<Container>
|
||||||
<div data-aos='fade-down' data-aos-duration="800" className='container mx-auto'>
|
<div
|
||||||
|
data-aos='fade-down'
|
||||||
|
data-aos-duration='800'
|
||||||
|
className='container mx-auto'
|
||||||
|
>
|
||||||
<div className='max-w-2xl space-y-4 text-white'>
|
<div className='max-w-2xl space-y-4 text-white'>
|
||||||
<h1 className='text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
<h1 className='text-4xl font-bold tracking-tight sm:text-5xl md:text-6xl'>
|
||||||
{t('clients.loyalty.title')}
|
{t('clients.loyalty.title')}
|
||||||
@ -80,7 +84,9 @@ export function LoyaltyPage() {
|
|||||||
{t('clients.loyalty.programm.conditions-1')}
|
{t('clients.loyalty.programm.conditions-1')}
|
||||||
</h3>
|
</h3>
|
||||||
<p className='text-gray-600'>
|
<p className='text-gray-600'>
|
||||||
{t('clients.loyalty.programm.conditions.description-1')}
|
{t(
|
||||||
|
'clients.loyalty.programm.conditions.description-1',
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -93,7 +99,9 @@ export function LoyaltyPage() {
|
|||||||
{t('clients.loyalty.programm.conditions-2')}
|
{t('clients.loyalty.programm.conditions-2')}
|
||||||
</h3>
|
</h3>
|
||||||
<p className='text-gray-600'>
|
<p className='text-gray-600'>
|
||||||
{t('clients.loyalty.programm.conditions.description-2')}
|
{t(
|
||||||
|
'clients.loyalty.programm.conditions.description-2',
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -106,18 +114,23 @@ export function LoyaltyPage() {
|
|||||||
{t('clients.loyalty.programm.conditions-3')}
|
{t('clients.loyalty.programm.conditions-3')}
|
||||||
</h3>
|
</h3>
|
||||||
<p className='text-gray-600'>
|
<p className='text-gray-600'>
|
||||||
{t('clients.loyalty.programm.conditions.description-3')}
|
{t(
|
||||||
|
'clients.loyalty.programm.conditions.description-3',
|
||||||
|
)}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-aos='fade-up' className='relative h-[400px] overflow-hidden rounded-xl shadow-xl'>
|
<div
|
||||||
|
data-aos='fade-up'
|
||||||
|
className='relative h-[400px] overflow-hidden rounded-xl shadow-xl'
|
||||||
|
>
|
||||||
<Image
|
<Image
|
||||||
src={ProgrammImg}
|
src={ProgrammImg}
|
||||||
alt='Программа лояльности'
|
alt='Программа лояльности'
|
||||||
fill
|
fill
|
||||||
className="w-full object-contain p-2.5"
|
className='w-full object-contain p-2.5'
|
||||||
priority
|
priority
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
@ -126,7 +139,7 @@ export function LoyaltyPage() {
|
|||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* How It Works */}
|
{/* How It Works */}
|
||||||
<section className='bg-gray-50 py-16 px-2'>
|
<section className='bg-gray-50 px-2 py-16'>
|
||||||
<div className='container mx-auto'>
|
<div className='container mx-auto'>
|
||||||
<div className='mb-12 text-center'>
|
<div className='mb-12 text-center'>
|
||||||
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
<h2 className='mb-4 text-3xl font-bold tracking-tight sm:text-4xl'>
|
||||||
@ -199,7 +212,11 @@ export function LoyaltyPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='grid gap-8 md:grid-cols-3'>
|
<div className='grid gap-8 md:grid-cols-3'>
|
||||||
<Card data-aos='flip-left' data-aos-duration='500' className='overflow-hidden border-t-4 border-t-gray-400 transition-all hover:shadow-lg'>
|
<Card
|
||||||
|
data-aos='flip-left'
|
||||||
|
data-aos-duration='500'
|
||||||
|
className='overflow-hidden border-t-4 border-t-gray-400 transition-all hover:shadow-lg'
|
||||||
|
>
|
||||||
<CardContent className='p-6'>
|
<CardContent className='p-6'>
|
||||||
<h3 className='mb-4 text-center text-2xl font-bold'>
|
<h3 className='mb-4 text-center text-2xl font-bold'>
|
||||||
{t('clients.loyalty.works.levels.card-1.title')}
|
{t('clients.loyalty.works.levels.card-1.title')}
|
||||||
@ -235,7 +252,11 @@ export function LoyaltyPage() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card data-aos='flip-left' data-aos-duration='500' className='overflow-hidden border-t-4 border-t-yellow-500 transition-all hover:shadow-lg'>
|
<Card
|
||||||
|
data-aos='flip-left'
|
||||||
|
data-aos-duration='500'
|
||||||
|
className='overflow-hidden border-t-4 border-t-yellow-500 transition-all hover:shadow-lg'
|
||||||
|
>
|
||||||
<CardContent className='p-6'>
|
<CardContent className='p-6'>
|
||||||
<h3 className='mb-4 text-center text-2xl font-bold'>
|
<h3 className='mb-4 text-center text-2xl font-bold'>
|
||||||
{t('clients.loyalty.works.levels.card-2.title')}
|
{t('clients.loyalty.works.levels.card-2.title')}
|
||||||
@ -277,7 +298,11 @@ export function LoyaltyPage() {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Card data-aos='flip-left' data-aos-duration='500' className='overflow-hidden border-t-4 border-t-red-600 transition-all hover:shadow-lg'>
|
<Card
|
||||||
|
data-aos='flip-left'
|
||||||
|
data-aos-duration='500'
|
||||||
|
className='overflow-hidden border-t-4 border-t-red-600 transition-all hover:shadow-lg'
|
||||||
|
>
|
||||||
<CardContent className='p-6'>
|
<CardContent className='p-6'>
|
||||||
<h3 className='mb-4 text-center text-2xl font-bold'>
|
<h3 className='mb-4 text-center text-2xl font-bold'>
|
||||||
{t('clients.loyalty.works.levels.card-3.title')}
|
{t('clients.loyalty.works.levels.card-3.title')}
|
||||||
|
|||||||
@ -66,7 +66,7 @@ function LoginPageTabs() {
|
|||||||
<TabsTrigger
|
<TabsTrigger
|
||||||
key={tab.label}
|
key={tab.label}
|
||||||
value={tab.type}
|
value={tab.type}
|
||||||
className='w-full text-base'
|
className='w-full cursor-pointer text-base'
|
||||||
>
|
>
|
||||||
<tab.Icon className='mr-2 h-4 w-4' /> {t(tab.label)}
|
<tab.Icon className='mr-2 h-4 w-4' /> {t(tab.label)}
|
||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
|
|||||||
@ -10,7 +10,9 @@ import { Discounts } from '@/app/api-utlities/@types/index';
|
|||||||
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
import { useTextController } from '@/shared/language/hooks/use-text-controller';
|
||||||
import { Button } from '@/shared/shadcn-ui/button';
|
import { Button } from '@/shared/shadcn-ui/button';
|
||||||
import { Card, CardContent } from '@/shared/shadcn-ui/card';
|
import { Card, CardContent } from '@/shared/shadcn-ui/card';
|
||||||
import PromoImg from '../../../public/main/#promotions/995b9daa-959f-4bd5-9135-ef7c47148f2c.jpg'
|
|
||||||
|
import PromoImg from '../../../public/main/#promotions/995b9daa-959f-4bd5-9135-ef7c47148f2c.jpg';
|
||||||
|
|
||||||
const promotions = [
|
const promotions = [
|
||||||
{
|
{
|
||||||
id: 1,
|
id: 1,
|
||||||
@ -105,7 +107,7 @@ export default function PromotionSlider({ discounts }: PromotionSliderProps) {
|
|||||||
src={PromoImg}
|
src={PromoImg}
|
||||||
alt={promo.name}
|
alt={promo.name}
|
||||||
fill
|
fill
|
||||||
className='object-contain p-2 rounded-lg'
|
className='rounded-lg object-contain p-2'
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -38,7 +38,11 @@ export const BenefitsSection = () => {
|
|||||||
<section className='bg-gray-50 py-16'>
|
<section className='bg-gray-50 py-16'>
|
||||||
<div className='container mx-auto'>
|
<div className='container mx-auto'>
|
||||||
<div className='grid items-center gap-12 md:grid-cols-2'>
|
<div className='grid items-center gap-12 md:grid-cols-2'>
|
||||||
<div data-aos='fade-right' data-aos-duration='4000' className='order-2 md:order-1'>
|
<div
|
||||||
|
data-aos='fade-right'
|
||||||
|
data-aos-duration='4000'
|
||||||
|
className='order-2 md:order-1'
|
||||||
|
>
|
||||||
<div className='mb-4 inline-flex items-center justify-center rounded-full bg-red-100 p-2'>
|
<div className='mb-4 inline-flex items-center justify-center rounded-full bg-red-100 p-2'>
|
||||||
<Percent className='h-6 w-6 text-red-600' />
|
<Percent className='h-6 w-6 text-red-600' />
|
||||||
</div>
|
</div>
|
||||||
@ -65,7 +69,10 @@ export const BenefitsSection = () => {
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div data-aos='fade-up' className='relative order-1 h-[400px] overflow-hidden rounded-xl shadow-xl md:order-2'>
|
<div
|
||||||
|
data-aos='fade-up'
|
||||||
|
className='relative order-1 h-[400px] overflow-hidden rounded-xl shadow-xl md:order-2'
|
||||||
|
>
|
||||||
<Image
|
<Image
|
||||||
src='/placeholder.svg?height=400&width=600&text=Преимущества+для+клиентов'
|
src='/placeholder.svg?height=400&width=600&text=Преимущества+для+клиентов'
|
||||||
alt='Преимущества для клиентов'
|
alt='Преимущества для клиентов'
|
||||||
|
|||||||
@ -24,21 +24,21 @@ export const HeroSection = () => {
|
|||||||
<div className='container mx-auto'>
|
<div className='container mx-auto'>
|
||||||
<div className='max-w-lg space-y-4 text-white'>
|
<div className='max-w-lg space-y-4 text-white'>
|
||||||
<div className='animate-fade animate-duration-[3000ms] animate-ease-in-out'>
|
<div className='animate-fade animate-duration-[3000ms] animate-ease-in-out'>
|
||||||
<h1 className='font-bold tracking-tight text-4xl md:text-6xl'>
|
<h1 className='text-4xl font-bold tracking-tight md:text-6xl'>
|
||||||
{t('home.hero.title')}
|
{t('home.hero.title')}
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<p className='text-gray-200 sm:text-lg'>
|
<p className='text-gray-200 sm:text-lg'>
|
||||||
{t('home.hero.description')}
|
{t('home.hero.description')}
|
||||||
</p>
|
</p>
|
||||||
<div className='flex flex-col mt-6 gap-2 sm:flex-row sm:gap-4'>
|
<div className='mt-6 flex flex-col gap-2 sm:flex-row sm:gap-4'>
|
||||||
<Link href='#'>
|
<Link href='#stations'>
|
||||||
<Button className='bg-red-600 hover:bg-red-700'>
|
<Button className='bg-red-600 hover:bg-red-700'>
|
||||||
{t('common.buttons.findStation')}{' '}
|
{t('common.buttons.findStation')}{' '}
|
||||||
<MapPin className='ml-2 h-4 w-4' />
|
<MapPin className='ml-2 h-4 w-4' />
|
||||||
</Button>
|
</Button>
|
||||||
</Link>
|
</Link>
|
||||||
<Link href='#'>
|
<Link href='about'>
|
||||||
<Button variant='outline' className='animate-pulse'>
|
<Button variant='outline' className='animate-pulse'>
|
||||||
{t('common.buttons.learnMore')}
|
{t('common.buttons.learnMore')}
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user