Skip to content

Commit acb173f

Browse files
authored
Merge pull request #98 from strapi/fix/90-locales
Fix: missing `localizations` in middleware populate
2 parents 78065bf + 2558fca commit acb173f

20 files changed

Lines changed: 736 additions & 685 deletions

File tree

next/app/[locale]/(marketing)/[slug]/page.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@ import ClientSlugHandler from '../ClientSlugHandler';
44
import PageContent from '@/lib/shared/PageContent';
55
import { generateMetadataObject } from '@/lib/shared/metadata';
66
import { fetchCollectionType } from '@/lib/strapi';
7+
import type { LocaleSlugParamsProps } from '@/types/types';
78

8-
export async function generateMetadata(props: {
9-
params: Promise<{ locale: string; slug: string }>;
10-
}): Promise<Metadata> {
11-
const params = await props.params;
9+
export async function generateMetadata({
10+
params,
11+
}: LocaleSlugParamsProps): Promise<Metadata> {
12+
const { slug, locale } = await params;
1213
const [pageData] = await fetchCollectionType('pages', {
1314
filters: {
1415
slug: {
15-
$eq: params.slug,
16+
$eq: slug,
1617
},
17-
locale: params.locale,
18+
locale: locale,
1819
},
1920
});
2021

@@ -23,16 +24,14 @@ export async function generateMetadata(props: {
2324
return metadata;
2425
}
2526

26-
export default async function Page(props: {
27-
params: Promise<{ locale: string; slug: string }>;
28-
}) {
29-
const params = await props.params;
27+
export default async function Page({ params }: LocaleSlugParamsProps) {
28+
const { slug, locale } = await params;
3029
const [pageData] = await fetchCollectionType('pages', {
3130
filters: {
3231
slug: {
33-
$eq: params.slug,
32+
$eq: slug,
3433
},
35-
locale: params.locale,
34+
locale: locale,
3635
},
3736
});
3837

@@ -41,7 +40,7 @@ export default async function Page(props: {
4140
acc[localization.locale] = localization.slug;
4241
return acc;
4342
},
44-
{ [params.locale]: params.slug }
43+
{ [locale]: slug }
4544
);
4645

4746
return (

next/app/[locale]/(marketing)/blog/[slug]/page.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import React from 'react';
44
import ClientSlugHandler from '../../ClientSlugHandler';
55
import { BlogLayout } from '@/components/blog-layout';
66
import { fetchCollectionType } from '@/lib/strapi';
7-
import type { Article } from '@/types/types';
7+
import type { Article, LocaleSlugParamsProps } from '@/types/types';
88

9-
export default async function SingleArticlePage(props: {
10-
params: Promise<{ slug: string; locale: string }>;
11-
}) {
12-
const params = await props.params;
13-
const [article] = await fetchCollectionType<any[]>('articles', {
9+
export default async function SingleArticlePage({
10+
params,
11+
}: LocaleSlugParamsProps) {
12+
const { slug, locale } = await params;
13+
const [article] = await fetchCollectionType<Article[]>('articles', {
1414
filters: {
1515
slug: {
16-
$eq: params.slug,
16+
$eq: slug,
1717
},
1818
},
1919
});
@@ -22,16 +22,16 @@ export default async function SingleArticlePage(props: {
2222
return <div>Blog not found</div>;
2323
}
2424

25-
const localizedSlugs = article.localizations?.reduce(
25+
const localizedSlugs = article.localizations.reduce(
2626
(acc: Record<string, string>, localization: any) => {
2727
acc[localization.locale] = localization.slug;
2828
return acc;
2929
},
30-
{ [params.locale]: params.slug }
30+
{ [locale]: slug }
3131
);
3232

3333
return (
34-
<BlogLayout article={article} locale={params.locale}>
34+
<BlogLayout article={article} locale={locale}>
3535
<ClientSlugHandler localizedSlugs={localizedSlugs} />
3636
<BlocksRenderer content={article.content} />
3737
</BlogLayout>

next/app/[locale]/(marketing)/blog/page.tsx

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,41 +11,37 @@ import { Heading } from '@/components/elements/heading';
1111
import { Subheading } from '@/components/elements/subheading';
1212
import { generateMetadataObject } from '@/lib/shared/metadata';
1313
import { fetchCollectionType, fetchSingleType } from '@/lib/strapi';
14-
import type { Article } from '@/types/types';
14+
import type { Article, LocaleParamsProps } from '@/types/types';
1515

16-
export async function generateMetadata(props: {
17-
params: Promise<{ locale: string }>;
18-
}): Promise<Metadata> {
19-
const params = await props.params;
20-
const pageData = await fetchSingleType('blog-page', {
21-
locale: params.locale,
22-
});
16+
export async function generateMetadata({
17+
params,
18+
}: LocaleParamsProps): Promise<Metadata> {
19+
const { locale } = await params;
20+
const pageData = await fetchSingleType('blog-page', { locale });
2321

2422
const seo = pageData.seo;
2523
const metadata = generateMetadataObject(seo);
2624
return metadata;
2725
}
2826

29-
export default async function Blog(props: {
30-
params: Promise<{ locale: string; slug: string }>;
31-
}) {
32-
const params = await props.params;
27+
export default async function Blog({ params }: LocaleParamsProps) {
28+
const { locale } = await params;
3329
const pageData = await fetchSingleType('blog-page', {
34-
locale: params.locale,
30+
locale: locale,
3531
});
3632
const [firstArticle, ...articles] = await fetchCollectionType<Article[]>(
3733
'articles',
3834
{
39-
filters: { locale: { $eq: params.locale } },
35+
filters: { locale: { $eq: locale } },
4036
}
4137
);
4238

43-
const localizedSlugs = pageData.localizations?.reduce(
39+
const localizedSlugs = pageData.localizations.reduce(
4440
(acc: Record<string, string>, localization: any) => {
4541
acc[localization.locale] = 'blog';
4642
return acc;
4743
},
48-
{ [params.locale]: 'blog' }
44+
{ [locale]: 'blog' }
4945
);
5046

5147
return (
@@ -67,7 +63,7 @@ export default async function Blog(props: {
6763

6864
<BlogCard
6965
article={firstArticle}
70-
locale={params.locale}
66+
locale={locale}
7167
key={firstArticle.title}
7268
/>
7369

next/app/[locale]/(marketing)/page.tsx

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,19 @@ import ClientSlugHandler from './ClientSlugHandler';
44
import PageContent from '@/lib/shared/PageContent';
55
import { generateMetadataObject } from '@/lib/shared/metadata';
66
import { fetchCollectionType } from '@/lib/strapi';
7+
import type { LocaleParamsProps } from '@/types/types';
78

8-
export async function generateMetadata(props: {
9-
params: Promise<{ locale: string }>;
10-
}): Promise<Metadata> {
11-
const params = await props.params;
9+
export async function generateMetadata({
10+
params,
11+
}: LocaleParamsProps): Promise<Metadata> {
12+
const { locale } = await params;
1213

1314
const [pageData] = await fetchCollectionType('pages', {
1415
filters: {
1516
slug: {
1617
$eq: 'homepage',
1718
},
18-
locale: params.locale,
19+
locale: locale,
1920
},
2021
});
2122

@@ -24,17 +25,15 @@ export async function generateMetadata(props: {
2425
return metadata;
2526
}
2627

27-
export default async function HomePage(props: {
28-
params: Promise<{ locale: string }>;
29-
}) {
30-
const params = await props.params;
28+
export default async function HomePage({ params }: LocaleParamsProps) {
29+
const { locale } = await params;
3130

3231
const [pageData] = await fetchCollectionType('pages', {
3332
filters: {
3433
slug: {
3534
$eq: 'homepage',
3635
},
37-
locale: params.locale,
36+
locale: locale,
3837
},
3938
});
4039

@@ -43,7 +42,7 @@ export default async function HomePage(props: {
4342
acc[localization.locale] = '';
4443
return acc;
4544
},
46-
{ [params.locale]: '' }
45+
{ [locale]: '' }
4746
);
4847

4948
return (

next/app/[locale]/(marketing)/products/[slug]/page.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,29 @@ import DynamicZoneManager from '@/components/dynamic-zone/manager';
77
import { SingleProduct } from '@/components/products/single-product';
88
import { generateMetadataObject } from '@/lib/shared/metadata';
99
import { fetchCollectionType } from '@/lib/strapi';
10-
import type { Product } from '@/types/types';
10+
import type { LocaleSlugParamsProps, Product } from '@/types/types';
1111

12-
export async function generateMetadata(props: {
13-
params: Promise<{ locale: string; slug: string }>;
14-
}): Promise<Metadata> {
15-
const params = await props.params;
12+
export async function generateMetadata({
13+
params,
14+
}: LocaleSlugParamsProps): Promise<Metadata> {
15+
const { slug } = await params;
1616

1717
const [pageData] = await fetchCollectionType<Product[]>('products', {
18-
filters: { slug: { $eq: params.slug } },
18+
filters: { slug: { $eq: slug } },
1919
});
2020

2121
const seo = pageData;
2222
const metadata = generateMetadataObject(seo);
2323
return metadata;
2424
}
2525

26-
export default async function SingleProductPage(props: {
27-
params: Promise<{ slug: string; locale: string }>;
28-
}) {
29-
const params = await props.params;
26+
export default async function SingleProductPage({
27+
params,
28+
}: LocaleSlugParamsProps) {
29+
const { slug, locale } = await params;
3030

3131
const [pageData] = await fetchCollectionType<Product[]>('products', {
32-
filters: { slug: { $eq: params.slug } },
32+
filters: { slug: { $eq: slug } },
3333
});
3434

3535
if (!pageData) {
@@ -44,7 +44,7 @@ export default async function SingleProductPage(props: {
4444
{pageData?.dynamic_zone && (
4545
<DynamicZoneManager
4646
dynamicZone={pageData?.dynamic_zone}
47-
locale={params.locale}
47+
locale={locale}
4848
/>
4949
)}
5050
</Container>

next/app/[locale]/(marketing)/products/page.tsx

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,32 @@ import { Featured } from '@/components/products/featured';
1111
import { ProductItems } from '@/components/products/product-items';
1212
import { generateMetadataObject } from '@/lib/shared/metadata';
1313
import { fetchCollectionType, fetchSingleType } from '@/lib/strapi';
14-
import { Product } from '@/types/types';
14+
import { LocaleParamsProps, Product } from '@/types/types';
1515

16-
export async function generateMetadata(props: {
17-
params: Promise<{ locale: string }>;
18-
}): Promise<Metadata> {
19-
const params = await props.params;
20-
const pageData = await fetchSingleType('product-page', {
21-
locale: params.locale,
22-
});
16+
export async function generateMetadata({
17+
params,
18+
}: LocaleParamsProps): Promise<Metadata> {
19+
const { locale } = await params;
20+
const pageData = await fetchSingleType('product-page', { locale });
2321

2422
const seo = pageData?.seo;
2523
const metadata = generateMetadataObject(seo);
2624
return metadata;
2725
}
2826

29-
export default async function Products(props: {
30-
params: Promise<{ locale: string }>;
31-
}) {
32-
const params = await props.params;
27+
export default async function Products({ params }: LocaleParamsProps) {
28+
const { locale } = await params;
3329

3430
// Fetch the product-page and products data
35-
const pageData = await fetchSingleType('product-page', {
36-
locale: params.locale,
37-
});
31+
const pageData = await fetchSingleType('product-page', { locale });
3832
const products = await fetchCollectionType<Product[]>('products');
3933

40-
const localizedSlugs = pageData.localizations?.reduce(
34+
const localizedSlugs = pageData.localizations.reduce(
4135
(acc: Record<string, string>, localization: any) => {
4236
acc[localization.locale] = 'products';
4337
return acc;
4438
},
45-
{ [params.locale]: 'products' }
39+
{ [locale]: 'products' }
4640
);
4741
const featured = products.filter(
4842
(product: { featured?: boolean }) => product.featured
@@ -62,8 +56,8 @@ export default async function Products(props: {
6256
<Subheading className="max-w-3xl mx-auto">
6357
{pageData.sub_heading}
6458
</Subheading>
65-
<Featured products={featured} locale={params.locale} />
66-
<ProductItems products={products} locale={params.locale} />
59+
<Featured products={featured} locale={locale} />
60+
<ProductItems products={products} locale={locale} />
6761
</Container>
6862
</div>
6963
);

next/app/[locale]/layout.tsx

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Metadata } from 'next';
22
import { ViewTransitions } from 'next-view-transitions';
33
import { Inter } from 'next/font/google';
44
import { draftMode } from 'next/headers';
5+
import type { PropsWithChildren } from 'react';
56
import React from 'react';
67

78
import { DraftModeBanner } from '@/components/draft-mode-banner';
@@ -12,6 +13,7 @@ import { CartProvider } from '@/context/cart-context';
1213
import { generateMetadataObject } from '@/lib/shared/metadata';
1314
import { fetchSingleType } from '@/lib/strapi';
1415
import { cn } from '@/lib/utils';
16+
import type { LocaleParamsProps } from '@/types/types';
1517

1618
const inter = Inter({
1719
subsets: ['latin'],
@@ -20,31 +22,24 @@ const inter = Inter({
2022
});
2123

2224
// Default Global SEO for pages without them
23-
export async function generateMetadata(props: {
24-
params: Promise<{ locale: string }>;
25-
}): Promise<Metadata> {
26-
const params = await props.params;
27-
28-
const pageData = await fetchSingleType('global', { locale: params.locale });
25+
export async function generateMetadata({
26+
params,
27+
}: PropsWithChildren<LocaleParamsProps>): Promise<Metadata> {
28+
const { locale } = await params;
29+
const pageData = await fetchSingleType('global', { locale });
2930

3031
const seo = pageData.seo;
3132
const metadata = generateMetadataObject(seo);
3233
return metadata;
3334
}
3435

35-
export default async function LocaleLayout(props: {
36-
children: React.ReactNode;
37-
params: Promise<{ locale: string }>;
38-
}) {
39-
const params = await props.params;
40-
41-
const { locale } = params;
42-
43-
const { children } = props;
44-
36+
export default async function LocaleLayout({
37+
children,
38+
params,
39+
}: PropsWithChildren<LocaleParamsProps>) {
4540
const { isEnabled: isDraftMode } = await draftMode();
46-
47-
const pageData = await fetchSingleType('global', { locale: params.locale });
41+
const { locale } = await params;
42+
const pageData = await fetchSingleType('global', { locale });
4843

4944
return (
5045
<ViewTransitions>

next/app/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { i18n } from '@/i18n.config';
55

66
import './globals.css';
77

8-
import { SlugProvider } from './context/SlugContext';
8+
import { SlugProvider } from '@/app/context/SlugContext';
99
import { Preview } from '@/components/preview';
1010

1111
export const viewport: Viewport = {

0 commit comments

Comments
 (0)