Skip to content

Commit 938b4a8

Browse files
committed
Add new onward container to gallery layout
1 parent da25c99 commit 938b4a8

File tree

10 files changed

+106
-77
lines changed

10 files changed

+106
-77
lines changed

dotcom-rendering/src/components/Card/Card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ export const Card = ({
855855
showTopBarMobile={showTopBarMobile}
856856
isOnwardContent={isOnwardContent}
857857
containerPalette={containerPalette}
858-
colour={
858+
topBarColour={
859859
isGallerySecondaryOnward
860860
? palette('--onward-content-border')
861861
: undefined

dotcom-rendering/src/components/Card/components/CardWrapper.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type Props = {
1414
showTopBarMobile: boolean;
1515
isOnwardContent: boolean;
1616
containerPalette?: DCRContainerPalette;
17-
colour?: string;
17+
topBarColour?: string;
1818
};
1919

2020
const baseCardStyles = css`
@@ -112,7 +112,7 @@ export const CardWrapper = ({
112112
showTopBarMobile,
113113
isOnwardContent,
114114
containerPalette,
115-
colour = palette('--card-border-top'),
115+
topBarColour = palette('--card-border-top'),
116116
}: Props) => {
117117
return (
118118
<FormatBoundary format={format}>
@@ -121,8 +121,8 @@ export const CardWrapper = ({
121121
css={[
122122
baseCardStyles,
123123
hoverStyles,
124-
showTopBarDesktop && desktopTopBarStyles(colour),
125-
showTopBarMobile && mobileTopBarStyles(colour),
124+
showTopBarDesktop && desktopTopBarStyles(topBarColour),
125+
showTopBarMobile && mobileTopBarStyles(topBarColour),
126126
isOnwardContent &&
127127
contextFormat?.design !== ArticleDesign.Gallery &&
128128
onwardContentStyles,

dotcom-rendering/src/components/FetchOnwardsData.importable.tsx

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import type { ComponentEvent } from '@guardian/ophan-tracker-js';
44
import { useEffect, useState } from 'react';
55
import { submitComponentEvent } from '../client/ophan/ophan';
66
import { ArticleDesign, type ArticleFormat } from '../lib/articleFormat';
7-
import { decideTrail, dedupeTrail } from '../lib/decideTrail';
7+
import {
8+
decideTrail,
9+
decideTrailWithMasterImage,
10+
dedupeTrail,
11+
} from '../lib/decideTrail';
812
import { useApi } from '../lib/useApi';
913
import { addDiscussionIds } from '../lib/useCommentCount';
1014
import { useIsInView } from '../lib/useIsInView';
@@ -14,6 +18,7 @@ import type { RenderingTarget } from '../types/renderingTarget';
1418
import type { FETrailType, TrailType } from '../types/trails';
1519
import { Carousel } from './Carousel.importable';
1620
import { Placeholder } from './Placeholder';
21+
import { ScrollableSmallOnwards } from './ScrollableSmallOnwards';
1722

1823
type Props = {
1924
url: string;
@@ -35,8 +40,8 @@ type OnwardsResponse = {
3540
description: string;
3641
};
3742

38-
const minHeight = css`
39-
min-height: 300px;
43+
const minHeight = (design: ArticleDesign) => css`
44+
min-height: ${design === ArticleDesign.Gallery ? '250px' : '300px'};
4045
`;
4146

4247
const isTrailPaidContent = (trailType: FETrailType) =>
@@ -47,12 +52,13 @@ const buildTrails = (
4752
trailLimit: number,
4853
isAdFreeUser: boolean,
4954
webURL: string,
55+
withMasterImage: boolean,
5056
): TrailType[] => {
5157
return trails
5258
.filter((trailType) => !(isTrailPaidContent(trailType) && isAdFreeUser))
5359
.filter((trailType) => dedupeTrail(trailType, webURL))
5460
.slice(0, trailLimit)
55-
.map(decideTrail);
61+
.map(withMasterImage ? decideTrailWithMasterImage : decideTrail);
5662
};
5763

5864
export const FetchOnwardsData = ({
@@ -117,26 +123,38 @@ export const FetchOnwardsData = ({
117123
.filter(isNonNullable),
118124
);
119125

120-
const trails = buildTrails(data.trails, limit, isAdFreeUser, webURL);
126+
const trails = ({ withMasterImage }: { withMasterImage: boolean }) =>
127+
buildTrails(data.trails, limit, isAdFreeUser, webURL, withMasterImage);
121128

122129
return (
123-
<div ref={setIsInViewRef} css={minHeight}>
124-
<Carousel
125-
heading={data.heading || data.displayname} // Sometimes the api returns heading as 'displayName'
126-
trails={trails}
127-
description={data.description}
128-
onwardsSource={onwardsSource}
129-
format={format}
130-
leftColSize={
131-
format.design === ArticleDesign.LiveBlog ||
132-
format.design === ArticleDesign.DeadBlog
133-
? 'wide'
134-
: 'compact'
135-
}
136-
discussionApiUrl={discussionApiUrl}
137-
serverTime={serverTime}
138-
renderingTarget={renderingTarget}
139-
/>
130+
<div id="marjan" ref={setIsInViewRef} css={minHeight(format.design)}>
131+
{format.design === ArticleDesign.Gallery ? (
132+
<ScrollableSmallOnwards
133+
serverTime={serverTime}
134+
trails={trails({ withMasterImage: true })}
135+
discussionApiUrl={discussionApiUrl}
136+
heading={data.heading || data.displayname}
137+
onwardsSource={onwardsSource}
138+
format={format}
139+
/>
140+
) : (
141+
<Carousel
142+
heading={data.heading || data.displayname} // Sometimes the api returns heading as 'displayName'
143+
trails={trails({ withMasterImage: false })}
144+
description={data.description}
145+
onwardsSource={onwardsSource}
146+
format={format}
147+
leftColSize={
148+
format.design === ArticleDesign.LiveBlog ||
149+
format.design === ArticleDesign.DeadBlog
150+
? 'wide'
151+
: 'compact'
152+
}
153+
discussionApiUrl={discussionApiUrl}
154+
serverTime={serverTime}
155+
renderingTarget={renderingTarget}
156+
/>
157+
)}
140158
</div>
141159
);
142160
};

dotcom-rendering/src/components/OnwardsUpper.importable.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,15 @@ export const OnwardsUpper = ({
321321
<Section
322322
fullWidth={true}
323323
borderColour={palette('--article-section-border')}
324+
padSides={
325+
format.design === ArticleDesign.Gallery ? false : true
326+
}
327+
showTopBorder={
328+
format.design === ArticleDesign.Gallery ? false : true
329+
}
330+
showSideBorders={
331+
format.design === ArticleDesign.Gallery ? false : true
332+
}
324333
>
325334
<FetchOnwardsData
326335
url={url}
@@ -340,6 +349,15 @@ export const OnwardsUpper = ({
340349
<Section
341350
fullWidth={true}
342351
borderColour={palette('--article-section-border')}
352+
showTopBorder={
353+
format.design === ArticleDesign.Gallery ? false : true
354+
}
355+
showSideBorders={
356+
format.design === ArticleDesign.Gallery ? false : true
357+
}
358+
padSides={
359+
format.design === ArticleDesign.Gallery ? false : true
360+
}
343361
>
344362
<FetchOnwardsData
345363
url={curatedDataUrl}

dotcom-rendering/src/components/ScrollableCarousel.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -411,18 +411,18 @@ export const ScrollableCarousel = ({
411411
ScrollableCarousel.Item = ({
412412
isStackingCarousel = false,
413413
children,
414-
colour = palette('--card-border-top'),
414+
borderColour = palette('--card-border-top'),
415415
}: {
416416
isStackingCarousel?: boolean;
417417
children: React.ReactNode;
418-
colour?: string;
418+
borderColour?: string;
419419
}) => (
420420
<li
421421
css={[
422422
itemStyles,
423423
isStackingCarousel
424-
? stackedRowLeftBorderStyles(colour)
425-
: singleRowLeftBorderStyles(colour),
424+
? stackedRowLeftBorderStyles(borderColour)
425+
: singleRowLeftBorderStyles(borderColour),
426426
]}
427427
>
428428
{children}

dotcom-rendering/src/components/ScrollableSmallOnwards.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ export const ScrollableSmallOnwards = (props: Props) => {
109109
<ScrollableCarousel.Item
110110
key={trail.url}
111111
isStackingCarousel={true}
112-
colour={palette('--onward-content-border')}
112+
borderColour={palette(
113+
'--onward-content-border',
114+
)}
113115
>
114116
<Card
115117
{...getDefaultCardProps(

dotcom-rendering/src/layouts/GalleryLayout.tsx

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { ArticleMetaApps } from '../components/ArticleMeta.apps';
1616
import { ArticleMeta } from '../components/ArticleMeta.web';
1717
import { ArticleTitle } from '../components/ArticleTitle';
1818
import { Caption } from '../components/Caption';
19-
import { Carousel } from '../components/Carousel.importable';
2019
import { DiscussionLayout } from '../components/DiscussionLayout';
2120
import { FetchMoreGalleriesData } from '../components/FetchMoreGalleriesData.importable';
2221
import { Footer } from '../components/Footer';
@@ -30,6 +29,7 @@ import { Masthead } from '../components/Masthead/Masthead';
3029
import { MostViewedFooterData } from '../components/MostViewedFooterData.importable';
3130
import { MostViewedFooterLayout } from '../components/MostViewedFooterLayout';
3231
import { OnwardsUpper } from '../components/OnwardsUpper.importable';
32+
import { ScrollableSmallOnwards } from '../components/ScrollableSmallOnwards';
3333
import { Section } from '../components/Section';
3434
import { Standfirst } from '../components/Standfirst';
3535
import { StickyBottomBanner } from '../components/StickyBottomBanner.importable';
@@ -212,13 +212,13 @@ export const GalleryLayout = (props: WebProps | AppProps) => {
212212
show={showMerchandisingHigh}
213213
display={format.display}
214214
/>
215-
<StoryPackage
215+
<ScrollableSmallOnwards
216216
serverTime={serverTime}
217+
trails={gallery.storyPackage?.trails ?? []}
217218
discussionApiUrl={discussionApiUrl}
218219
format={format}
219-
renderingTarget={renderingTarget}
220-
storyPackage={gallery.storyPackage}
221-
topBorder={showMerchandisingHigh}
220+
heading={gallery.storyPackage?.heading ?? 'More on this story'}
221+
onwardsSource={'more-on-this-story'}
222222
/>
223223
<Island priority="feature" defer={{ until: 'visible' }}>
224224
<OnwardsUpper
@@ -655,40 +655,3 @@ const MerchandisingHigh = (props: {
655655
/>
656656
</Section>
657657
) : null;
658-
659-
const StoryPackage = ({
660-
storyPackage,
661-
format,
662-
discussionApiUrl,
663-
serverTime,
664-
renderingTarget,
665-
topBorder,
666-
}: {
667-
storyPackage: Gallery['storyPackage'];
668-
format: ArticleFormat;
669-
discussionApiUrl: string;
670-
serverTime?: number;
671-
renderingTarget: RenderingTarget;
672-
topBorder: boolean;
673-
}) =>
674-
storyPackage === undefined ? null : (
675-
<Section
676-
fullWidth={true}
677-
backgroundColour={palette('--article-section-background')}
678-
borderColour={palette('--onward-content-border')}
679-
showTopBorder={topBorder}
680-
>
681-
<Island priority="feature" defer={{ until: 'visible' }}>
682-
<Carousel
683-
heading={storyPackage.heading}
684-
trails={storyPackage.trails}
685-
onwardsSource="more-on-this-story"
686-
format={format}
687-
leftColSize="compact"
688-
discussionApiUrl={discussionApiUrl}
689-
serverTime={serverTime}
690-
renderingTarget={renderingTarget}
691-
/>
692-
</Island>
693-
</Section>
694-
);

dotcom-rendering/src/lib/decideTrail.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,25 @@ export const decideTrail = (trail: FETrailType, index = 0): TrailType => {
3232
dataLinkName: getDataLinkNameCard(format, '0', index),
3333
};
3434
};
35+
36+
// This is used for the new ScrollableSmallOnwards component which relies on the masterImage
37+
// In future work, we will need to fully migrate to this function and deprecate decideTrail
38+
export const decideTrailWithMasterImage = (
39+
trail: FETrailType,
40+
index = 0,
41+
): TrailType => {
42+
const format: ArticleFormat = decideFormat(trail.format);
43+
const image: DCRFrontImage | undefined = trail.masterImage
44+
? {
45+
src: trail.masterImage,
46+
altText: '',
47+
}
48+
: undefined;
49+
50+
return {
51+
...trail,
52+
image,
53+
format,
54+
dataLinkName: getDataLinkNameCard(format, '0', index),
55+
};
56+
};
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { FEStoryPackage } from './frontend/feArticle';
2-
import { decideTrail } from './lib/decideTrail';
2+
import { decideTrail, decideTrailWithMasterImage } from './lib/decideTrail';
33
import type { TrailType } from './types/trails';
44

55
export type StoryPackage = {
@@ -9,13 +9,16 @@ export type StoryPackage = {
99

1010
export const parse = (
1111
feStoryPackage: FEStoryPackage | undefined,
12+
withMasterImage: boolean = false,
1213
): StoryPackage | undefined => {
1314
if (feStoryPackage === undefined) {
1415
return undefined;
1516
}
1617

1718
return {
1819
heading: feStoryPackage.heading,
19-
trails: feStoryPackage.trails.map(decideTrail),
20+
trails: feStoryPackage.trails.map(
21+
withMasterImage ? decideTrailWithMasterImage : decideTrail,
22+
),
2023
};
2124
};

dotcom-rendering/src/types/article.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,10 @@ export const enhanceArticleType = (
117117
data.main,
118118
)(data.mainMediaElements);
119119

120-
const storyPackage = parseStoryPackage(data.storyPackage);
120+
const storyPackage = parseStoryPackage(
121+
data.storyPackage,
122+
format.design === ArticleDesign.Gallery,
123+
);
121124

122125
if (format.design === ArticleDesign.Gallery) {
123126
const design = ArticleDesign.Gallery;

0 commit comments

Comments
 (0)