Skip to content

Commit 0017922

Browse files
authored
Merge pull request #94 from strapi/feat/71-strapi-client-sdk
Feat/71 strapi client sdk
2 parents 2ede337 + 849f87b commit 0017922

File tree

15 files changed

+255
-164
lines changed

15 files changed

+255
-164
lines changed

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

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,22 @@ import { Metadata } from 'next';
33
import ClientSlugHandler from '../ClientSlugHandler';
44
import PageContent from '@/lib/shared/PageContent';
55
import { generateMetadataObject } from '@/lib/shared/metadata';
6-
import fetchContentType from '@/lib/strapi/fetchContentType';
6+
import { fetchCollectionType } from '@/lib/strapi';
77

88
export async function generateMetadata(props: {
99
params: Promise<{ locale: string; slug: string }>;
1010
}): Promise<Metadata> {
1111
const params = await props.params;
12-
const pageData = await fetchContentType(
13-
'pages',
14-
{
15-
filters: {
16-
slug: params.slug,
17-
locale: params.locale,
12+
const [pageData] = await fetchCollectionType('pages', {
13+
filters: {
14+
slug: {
15+
$eq: params.slug,
1816
},
19-
populate: 'seo.metaImage',
17+
locale: params.locale,
2018
},
21-
true
22-
);
19+
});
2320

24-
const seo = pageData?.seo;
21+
const seo = pageData.seo;
2522
const metadata = generateMetadataObject(seo);
2623
return metadata;
2724
}
@@ -30,16 +27,14 @@ export default async function Page(props: {
3027
params: Promise<{ locale: string; slug: string }>;
3128
}) {
3229
const params = await props.params;
33-
const pageData = await fetchContentType(
34-
'pages',
35-
{
36-
filters: {
37-
slug: params.slug,
38-
locale: params.locale,
30+
const [pageData] = await fetchCollectionType('pages', {
31+
filters: {
32+
slug: {
33+
$eq: params.slug,
3934
},
35+
locale: params.locale,
4036
},
41-
true
42-
);
37+
});
4338

4439
const localizedSlugs = pageData.localizations?.reduce(
4540
(acc: Record<string, string>, localization: any) => {

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

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,20 @@ import React from 'react';
33

44
import ClientSlugHandler from '../../ClientSlugHandler';
55
import { BlogLayout } from '@/components/blog-layout';
6-
import fetchContentType from '@/lib/strapi/fetchContentType';
6+
import { fetchCollectionType } from '@/lib/strapi';
7+
import type { Article } from '@/types/types';
78

89
export default async function SingleArticlePage(props: {
910
params: Promise<{ slug: string; locale: string }>;
1011
}) {
1112
const params = await props.params;
12-
const article = await fetchContentType(
13-
'articles',
14-
{
15-
filters: {
16-
slug: params.slug,
17-
locale: params.locale,
13+
const [article] = await fetchCollectionType<any[]>('articles', {
14+
filters: {
15+
slug: {
16+
$eq: params.slug,
1817
},
1918
},
20-
true
21-
);
19+
});
2220

2321
if (!article) {
2422
return <div>Blog not found</div>;

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

Lines changed: 21 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,18 @@ import { FeatureIconContainer } from '@/components/dynamic-zone/features/feature
1010
import { Heading } from '@/components/elements/heading';
1111
import { Subheading } from '@/components/elements/subheading';
1212
import { generateMetadataObject } from '@/lib/shared/metadata';
13-
import fetchContentType from '@/lib/strapi/fetchContentType';
14-
import { Article } from '@/types/types';
13+
import { fetchCollectionType, fetchSingleType } from '@/lib/strapi';
14+
import type { Article } from '@/types/types';
1515

1616
export async function generateMetadata(props: {
1717
params: Promise<{ locale: string }>;
1818
}): Promise<Metadata> {
1919
const params = await props.params;
20-
const pageData = await fetchContentType(
21-
'blog-page',
22-
{
23-
filters: { locale: params.locale },
24-
populate: 'seo.metaImage',
25-
},
26-
true
27-
);
20+
const pageData = await fetchSingleType('blog-page', {
21+
locale: params.locale,
22+
});
2823

29-
const seo = pageData?.seo;
24+
const seo = pageData.seo;
3025
const metadata = generateMetadataObject(seo);
3126
return metadata;
3227
}
@@ -35,22 +30,17 @@ export default async function Blog(props: {
3530
params: Promise<{ locale: string; slug: string }>;
3631
}) {
3732
const params = await props.params;
38-
const blogPage = await fetchContentType(
39-
'blog-page',
40-
{
41-
filters: { locale: params.locale },
42-
},
43-
true
44-
);
45-
const articles = await fetchContentType(
33+
const pageData = await fetchSingleType('blog-page', {
34+
locale: params.locale,
35+
});
36+
const [firstArticle, ...articles] = await fetchCollectionType<Article[]>(
4637
'articles',
4738
{
48-
filters: { locale: params.locale },
49-
},
50-
false
39+
filters: { locale: { $eq: params.locale } },
40+
}
5141
);
5242

53-
const localizedSlugs = blogPage.localizations?.reduce(
43+
const localizedSlugs = pageData.localizations?.reduce(
5444
(acc: Record<string, string>, localization: any) => {
5545
acc[localization.locale] = 'blog';
5646
return acc;
@@ -68,22 +58,20 @@ export default async function Blog(props: {
6858
<IconClipboardText className="h-6 w-6 text-white" />
6959
</FeatureIconContainer>
7060
<Heading as="h1" className="mt-4">
71-
{blogPage.heading}
61+
{pageData.heading}
7262
</Heading>
7363
<Subheading className="max-w-3xl mx-auto">
74-
{blogPage.sub_heading}
64+
{pageData.sub_heading}
7565
</Subheading>
7666
</div>
7767

78-
{articles.data.slice(0, 1).map((article: Article) => (
79-
<BlogCard
80-
article={article}
81-
locale={params.locale}
82-
key={article.title}
83-
/>
84-
))}
68+
<BlogCard
69+
article={firstArticle}
70+
locale={params.locale}
71+
key={firstArticle.title}
72+
/>
8573

86-
<BlogPostRows articles={articles.data} />
74+
<BlogPostRows articles={articles} />
8775
</Container>
8876
</div>
8977
);

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

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,23 @@ import { Metadata } from 'next';
33
import ClientSlugHandler from './ClientSlugHandler';
44
import PageContent from '@/lib/shared/PageContent';
55
import { generateMetadataObject } from '@/lib/shared/metadata';
6-
import fetchContentType from '@/lib/strapi/fetchContentType';
6+
import { fetchCollectionType } from '@/lib/strapi';
77

88
export async function generateMetadata(props: {
99
params: Promise<{ locale: string }>;
1010
}): Promise<Metadata> {
1111
const params = await props.params;
1212

13-
const pageData = await fetchContentType(
14-
'pages',
15-
{
16-
filters: {
17-
slug: 'homepage',
18-
locale: params.locale,
13+
const [pageData] = await fetchCollectionType('pages', {
14+
filters: {
15+
slug: {
16+
$eq: 'homepage',
1917
},
20-
populate: 'seo.metaImage',
18+
locale: params.locale,
2119
},
22-
true
23-
);
20+
});
2421

25-
const seo = pageData?.seo;
22+
const seo = pageData.seo;
2623
const metadata = generateMetadataObject(seo);
2724
return metadata;
2825
}
@@ -32,16 +29,14 @@ export default async function HomePage(props: {
3229
}) {
3330
const params = await props.params;
3431

35-
const pageData = await fetchContentType(
36-
'pages',
37-
{
38-
filters: {
39-
slug: 'homepage',
40-
locale: params.locale,
32+
const [pageData] = await fetchCollectionType('pages', {
33+
filters: {
34+
slug: {
35+
$eq: 'homepage',
4136
},
37+
locale: params.locale,
4238
},
43-
true
44-
);
39+
});
4540

4641
const localizedSlugs = pageData.localizations?.reduce(
4742
(acc: Record<string, string>, localization: any) => {

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

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,19 @@ import { AmbientColor } from '@/components/decorations/ambient-color';
66
import DynamicZoneManager from '@/components/dynamic-zone/manager';
77
import { SingleProduct } from '@/components/products/single-product';
88
import { generateMetadataObject } from '@/lib/shared/metadata';
9-
import fetchContentType from '@/lib/strapi/fetchContentType';
9+
import { fetchCollectionType } from '@/lib/strapi';
10+
import type { Product } from '@/types/types';
1011

1112
export async function generateMetadata(props: {
1213
params: Promise<{ locale: string; slug: string }>;
1314
}): Promise<Metadata> {
1415
const params = await props.params;
1516

16-
const pageData = await fetchContentType(
17-
'products',
18-
{
19-
filters: { slug: params.slug },
20-
populate: 'seo.metaImage',
21-
},
22-
true
23-
);
17+
const [pageData] = await fetchCollectionType<Product[]>('products', {
18+
filters: { slug: { $eq: params.slug } },
19+
});
2420

25-
const seo = pageData?.seo;
21+
const seo = pageData;
2622
const metadata = generateMetadataObject(seo);
2723
return metadata;
2824
}
@@ -32,26 +28,22 @@ export default async function SingleProductPage(props: {
3228
}) {
3329
const params = await props.params;
3430

35-
const product = await fetchContentType(
36-
'products',
37-
{
38-
filters: { slug: params.slug },
39-
},
40-
true
41-
);
31+
const [pageData] = await fetchCollectionType<Product[]>('products', {
32+
filters: { slug: { $eq: params.slug } },
33+
});
4234

43-
if (!product) {
35+
if (!pageData) {
4436
redirect('/products');
4537
}
4638

4739
return (
4840
<div className="relative overflow-hidden w-full">
4941
<AmbientColor />
5042
<Container className="py-20 md:py-40">
51-
<SingleProduct product={product} />
52-
{product?.dynamic_zone && (
43+
<SingleProduct product={pageData} />
44+
{pageData?.dynamic_zone && (
5345
<DynamicZoneManager
54-
dynamicZone={product?.dynamic_zone}
46+
dynamicZone={pageData?.dynamic_zone}
5547
locale={params.locale}
5648
/>
5749
)}

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

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,16 @@ import { Subheading } from '@/components/elements/subheading';
1010
import { Featured } from '@/components/products/featured';
1111
import { ProductItems } from '@/components/products/product-items';
1212
import { generateMetadataObject } from '@/lib/shared/metadata';
13-
import fetchContentType from '@/lib/strapi/fetchContentType';
13+
import { fetchCollectionType, fetchSingleType } from '@/lib/strapi';
14+
import { Product } from '@/types/types';
1415

1516
export async function generateMetadata(props: {
1617
params: Promise<{ locale: string }>;
1718
}): Promise<Metadata> {
1819
const params = await props.params;
19-
20-
const pageData = await fetchContentType(
21-
'product-page',
22-
{
23-
filters: {
24-
locale: params.locale,
25-
},
26-
},
27-
true
28-
);
20+
const pageData = await fetchSingleType('product-page', {
21+
locale: params.locale,
22+
});
2923

3024
const seo = pageData?.seo;
3125
const metadata = generateMetadataObject(seo);
@@ -38,26 +32,20 @@ export default async function Products(props: {
3832
const params = await props.params;
3933

4034
// Fetch the product-page and products data
41-
const productPage = await fetchContentType(
42-
'product-page',
43-
{
44-
filters: {
45-
locale: params.locale,
46-
},
47-
},
48-
true
49-
);
50-
const products = await fetchContentType('products');
35+
const pageData = await fetchSingleType('product-page', {
36+
locale: params.locale,
37+
});
38+
const products = await fetchCollectionType<Product[]>('products');
5139

52-
const localizedSlugs = productPage.localizations?.reduce(
40+
const localizedSlugs = pageData.localizations?.reduce(
5341
(acc: Record<string, string>, localization: any) => {
5442
acc[localization.locale] = 'products';
5543
return acc;
5644
},
5745
{ [params.locale]: 'products' }
5846
);
59-
const featured = products?.data.filter(
60-
(product: { featured: boolean }) => product.featured
47+
const featured = products.filter(
48+
(product: { featured?: boolean }) => product.featured
6149
);
6250

6351
return (
@@ -69,13 +57,13 @@ export default async function Products(props: {
6957
<IconShoppingCartUp className="h-6 w-6 text-white" />
7058
</FeatureIconContainer>
7159
<Heading as="h1" className="pt-4">
72-
{productPage.heading}
60+
{pageData.heading}
7361
</Heading>
7462
<Subheading className="max-w-3xl mx-auto">
75-
{productPage.sub_heading}
63+
{pageData.sub_heading}
7664
</Subheading>
7765
<Featured products={featured} locale={params.locale} />
78-
<ProductItems products={products?.data} locale={params.locale} />
66+
<ProductItems products={products} locale={params.locale} />
7967
</Container>
8068
</div>
8169
);

0 commit comments

Comments
 (0)