fix
This commit is contained in:
38
src/app/[locale]/about/AboutSEO.tsx
Normal file
38
src/app/[locale]/about/AboutSEO.tsx
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
'use client';
|
||||||
|
|
||||||
|
import { partner_api } from '@/features/about/lib/api';
|
||||||
|
import { useQuery } from '@tanstack/react-query';
|
||||||
|
import { useParams } from 'next/navigation';
|
||||||
|
import { useEffect } from 'react';
|
||||||
|
|
||||||
|
export default function AboutSEO() {
|
||||||
|
const { locale } = useParams();
|
||||||
|
|
||||||
|
const { data } = useQuery({
|
||||||
|
queryKey: ['aboutData'],
|
||||||
|
queryFn: async () => (await partner_api.getAbout()).data,
|
||||||
|
});
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (!data) return;
|
||||||
|
const banner = data.banner;
|
||||||
|
const title =
|
||||||
|
locale === 'uz'
|
||||||
|
? banner.title_uz
|
||||||
|
: locale === 'ru'
|
||||||
|
? banner.title_ru
|
||||||
|
: banner.title_en;
|
||||||
|
const description =
|
||||||
|
locale === 'uz'
|
||||||
|
? banner.description_uz
|
||||||
|
: locale === 'ru'
|
||||||
|
? banner.description_ru
|
||||||
|
: banner.description_en;
|
||||||
|
|
||||||
|
document.title = title || 'Gastro Market';
|
||||||
|
const descMeta = document.querySelector('meta[name="description"]');
|
||||||
|
if (descMeta) descMeta.setAttribute('content', description || '');
|
||||||
|
}, [data, locale]);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
@@ -1,32 +1,23 @@
|
|||||||
// app/[locale]/about/page.tsx
|
// app/[locale]/about/page.tsx
|
||||||
'use client';
|
|
||||||
|
|
||||||
import { partner_api } from '@/features/about/lib/api';
|
import { partner_api } from '@/features/about/lib/api';
|
||||||
import { AboutContent } from '@/features/about/ui/AboutContent';
|
import { AboutContent } from '@/features/about/ui/AboutContent';
|
||||||
import { AboutHero } from '@/features/about/ui/AboutHero';
|
import { AboutHero } from '@/features/about/ui/AboutHero';
|
||||||
import { PartnershipForm } from '@/features/about/ui/AboutPage';
|
import { PartnershipForm } from '@/features/about/ui/AboutPage';
|
||||||
import { BASE_URL } from '@/shared/config/api/URLs';
|
import { BASE_URL } from '@/shared/config/api/URLs';
|
||||||
import { useQuery } from '@tanstack/react-query';
|
|
||||||
import { Metadata } from 'next';
|
import { Metadata } from 'next';
|
||||||
import { useParams } from 'next/navigation';
|
import AboutSEO from './AboutSEO';
|
||||||
import { useEffect } from 'react';
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
params: { locale: 'uz' | 'ru' | 'en' };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Har requestda server-side yangilanishi
|
|
||||||
export const revalidate = 0;
|
export const revalidate = 0;
|
||||||
|
|
||||||
// Helper: full image url
|
|
||||||
function getImageUrl(image?: string | null): string {
|
function getImageUrl(image?: string | null): string {
|
||||||
if (!image || image.length === 0) return '/placeholder.svg';
|
if (!image) return '/placeholder.svg';
|
||||||
return image.includes(BASE_URL) ? image : BASE_URL + image;
|
return image.includes(BASE_URL) ? image : BASE_URL + image;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================
|
interface Props {
|
||||||
// Server-side Metadata
|
params: { locale: 'uz' | 'ru' };
|
||||||
// ====================
|
}
|
||||||
|
|
||||||
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
||||||
const { locale } = params;
|
const { locale } = params;
|
||||||
|
|
||||||
@@ -48,33 +39,31 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|||||||
? banner.description_ru
|
? banner.description_ru
|
||||||
: banner.description_en;
|
: banner.description_en;
|
||||||
|
|
||||||
const imageUrl = getImageUrl(banner?.image);
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: title || 'Gastro Market',
|
title: title || 'Gastro Market',
|
||||||
description: description || 'Gastro Market mahsulotlarini kashf eting',
|
description: description || 'Gastro Market mahsulotlarini kashf eting',
|
||||||
openGraph: {
|
openGraph: {
|
||||||
title: title || 'Gastro Market',
|
title,
|
||||||
description: description || 'Gastro Market mahsulotlarini kashf eting',
|
description,
|
||||||
type: 'website',
|
type: 'website',
|
||||||
images: [
|
images: [
|
||||||
{
|
{
|
||||||
url: imageUrl,
|
url: getImageUrl(banner.image),
|
||||||
width: 1200,
|
width: 1200,
|
||||||
height: 630,
|
height: 630,
|
||||||
alt: title || 'Gastro Market',
|
alt: title,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
twitter: {
|
twitter: {
|
||||||
card: 'summary_large_image',
|
card: 'summary_large_image',
|
||||||
title: title || 'Gastro Market',
|
title,
|
||||||
description: description || 'Gastro Market mahsulotlarini kashf eting',
|
description,
|
||||||
images: [imageUrl],
|
images: [getImageUrl(banner.image)],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
} catch (error) {
|
} catch (err) {
|
||||||
console.error('About metadata error:', error);
|
console.error('About metadata error:', err);
|
||||||
return {
|
return {
|
||||||
title: 'Gastro Market',
|
title: 'Gastro Market',
|
||||||
description: 'Gastro Market mahsulotlarini kashf eting',
|
description: 'Gastro Market mahsulotlarini kashf eting',
|
||||||
@@ -82,51 +71,10 @@ export async function generateMetadata({ params }: Props): Promise<Metadata> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================
|
|
||||||
// Client-side SEO Update
|
|
||||||
// ====================
|
|
||||||
function AboutSEO() {
|
|
||||||
const { locale } = useParams();
|
|
||||||
|
|
||||||
const { data } = useQuery({
|
|
||||||
queryKey: ['aboutData'],
|
|
||||||
queryFn: async () => (await partner_api.getAbout()).data,
|
|
||||||
});
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
if (!data) return;
|
|
||||||
const banner = data.banner;
|
|
||||||
const title =
|
|
||||||
locale === 'uz'
|
|
||||||
? banner.title_uz
|
|
||||||
: locale === 'ru'
|
|
||||||
? banner.title_ru
|
|
||||||
: banner.title_en;
|
|
||||||
const description =
|
|
||||||
locale === 'uz'
|
|
||||||
? banner.description_uz
|
|
||||||
: locale === 'ru'
|
|
||||||
? banner.description_ru
|
|
||||||
: banner.description_en;
|
|
||||||
|
|
||||||
document.title = title || 'Gastro Market';
|
|
||||||
const descMeta = document.querySelector('meta[name="description"]');
|
|
||||||
if (descMeta) descMeta.setAttribute('content', description || '');
|
|
||||||
}, [data, locale]);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ====================
|
|
||||||
// Page Component
|
|
||||||
// ====================
|
|
||||||
const AboutPage = async () => {
|
const AboutPage = async () => {
|
||||||
return (
|
return (
|
||||||
<div className="custom-container">
|
<div className="custom-container">
|
||||||
{/* Client-side SEO yangilash */}
|
<AboutSEO /> {/* Client-side SEO */}
|
||||||
<AboutSEO />
|
|
||||||
|
|
||||||
{/* Hero + Content + Form */}
|
|
||||||
<AboutHero />
|
<AboutHero />
|
||||||
<AboutContent />
|
<AboutContent />
|
||||||
<PartnershipForm />
|
<PartnershipForm />
|
||||||
|
|||||||
Reference in New Issue
Block a user