-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathrelated-articles.tsx
128 lines (124 loc) · 3.62 KB
/
related-articles.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import { Await, useLoaderData } from "@remix-run/react";
import type { HydrogenComponentSchema } from "@weaverse/hydrogen";
import { Suspense, forwardRef } from "react";
import { layoutInputs, Section, type SectionProps } from "~/components/section";
import { Skeleton } from "~/components/skeleton";
import { getImageLoadingPriority } from "~/utils/image";
import { ArticleCard, type ArticleCardProps } from "./blogs";
import type { ArticleFragment } from "storefront-api.generated";
import { Swimlane } from "~/components/swimlane";
import Heading from "~/components/heading";
interface RelatedArticlesProps
extends Omit<ArticleCardProps, "article" | "blogHandle" | "loading">,
SectionProps {
heading: string;
}
let RelatedArticles = forwardRef<HTMLElement, RelatedArticlesProps>(
(props, ref) => {
let { blog, relatedArticles } = useLoaderData<{
relatedArticles: ArticleFragment[];
blog: { handle: string };
}>();
let {
heading,
showExcerpt,
showAuthor,
showDate,
showReadmore,
imageAspectRatio,
...rest
} = props;
if (relatedArticles.length > 0) {
return (
<Section ref={ref} {...rest}>
<Heading content={heading} animate={false} />
<Swimlane>
{relatedArticles.map((article, i) => (
<ArticleCard
key={article.id}
blogHandle={blog.handle}
article={article}
loading={getImageLoadingPriority(i, 2)}
showAuthor={showAuthor}
showExcerpt={showExcerpt}
showDate={showDate}
showReadmore={showReadmore}
imageAspectRatio={imageAspectRatio}
className="snap-start w-80"
/>
))}
</Swimlane>
</Section>
);
}
return <section ref={ref} />;
},
);
export default RelatedArticles;
export let schema: HydrogenComponentSchema = {
type: "related-articles",
title: "Related articles",
limit: 1,
enabledOn: {
pages: ["ARTICLE"],
},
inspector: [
{
group: "Layout",
inputs: layoutInputs,
},
{
group: "Content",
inputs: [
{
type: "text",
name: "heading",
label: "Heading",
defaultValue: "Related articles",
placeholder: "Related articles",
},
{
type: "select",
name: "imageAspectRatio",
label: "Image aspect ratio",
defaultValue: "adapt",
configs: {
options: [
{ value: "adapt", label: "Adapt to image" },
{ value: "1/1", label: "Square (1/1)" },
{ value: "3/4", label: "Portrait (3/4)" },
{ value: "4/3", label: "Landscape (4/3)" },
{ value: "16/9", label: "Widescreen (16/9)" },
],
},
helpText:
'Learn more about image <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio" target="_blank" rel="noopener noreferrer">aspect ratio</a> property.',
},
{
type: "switch",
name: "showExcerpt",
label: "Show excerpt",
defaultValue: false,
},
{
type: "switch",
name: "showDate",
label: "Show date",
defaultValue: false,
},
{
type: "switch",
name: "showAuthor",
label: "Show author",
defaultValue: false,
},
{
type: "switch",
name: "showReadmore",
label: "Show read more",
defaultValue: true,
},
],
},
],
};