Skip to content

Commit b1346d6

Browse files
authored
Merge pull request #582 from guardian/dblatcher/update-stand
update Stand, replace IntendedAudienceSignifier prop logic
2 parents 65e5cfc + bbf990e commit b1346d6

5 files changed

Lines changed: 72 additions & 320 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
"sass": "^1.77.8",
4343
"sass-loader": "^8.0.2",
4444
"style-loader": "^0.13.1",
45-
"terser-webpack-plugin": "^3.0.2",
45+
"terser-webpack-plugin": "^5.6.1",
4646
"ts-loader": "^9.5.1",
47-
"typescript": "^4.6.2",
47+
"typescript": "^5.0.0",
4848
"url-loader": "^4.1.1",
4949
"webpack": "5.94.0",
5050
"webpack-cli": "^5.1.4",
@@ -53,7 +53,7 @@
5353
},
5454
"dependencies": {
5555
"@emotion/react": "^11.11.4",
56-
"@guardian/stand": "^0.0.37",
56+
"@guardian/stand": "^0.0.47",
5757
"@guardian/user-telemetry-client": "1.2.1",
5858
"@types/react": "^17.0.76",
5959
"@types/react-dom": "^17.0.9",
Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
<td
22
class="content-list-item__field--intended-audience"
3-
title="Intended Audience: {{ contentItem.intendedAudience || 'none' }}"
43
>
5-
<intended-audience-signifier
6-
production-office="contentItem.office"
7-
intended-audience="contentItem.intendedAudience"
4+
<intended-audience-signifier
5+
intended-audience="contentItem.intendedAudience"
86
></intended-audience-signifier>
97
</td>

public/lib/model/intended-audience.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ type IntendedAudienceOptionValue =
1111
type AudienceTagSlug = "global" | "uk" | "au" | "us";
1212
const expectedAudienceSlugs = ["global", "uk", "au", "us"];
1313

14-
export const isAudienceTagSlug = (text: string) =>
15-
expectedAudienceSlugs.includes(text);
16-
1714
export const intendedAudienceOptions: {
1815
displayName: string;
1916
value: IntendedAudienceOptionValue;
Lines changed: 19 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,40 @@
11
import {
22
IntendedAudienceSignifier,
3-
type IntendedAudienceSignifierProps,
4-
} from "@guardian/stand/intendedAudienceSignifier";
3+
mapTagsToSourceAndTarget
4+
} from "@guardian/stand/IntendedAudienceSignifier";
55
import React from "react";
6-
import { isAudienceTagSlug } from "../lib/model/intended-audience";
76

87
type Props = {
98
intendedAudience?: string;
10-
productionOffice?: string;
119
};
1210

13-
const parseProductionOfficeToSource = (
14-
source?: string,
15-
): IntendedAudienceSignifierProps["source"] => {
16-
if (!source) {
17-
return "UK";
11+
const getSourceAndTarget = (intendedAudience?: string) => {
12+
if (!intendedAudience) {
13+
return undefined;
1814
}
19-
switch (source?.toUpperCase()) {
20-
case "US":
21-
return "US";
22-
case "AU":
23-
case "AUS":
24-
return "AUS";
25-
case "UK":
26-
default:
27-
return "UK";
28-
}
29-
};
3015

31-
const slugsToSource = (
32-
audienceTagTokens: string[],
33-
): IntendedAudienceSignifierProps["source"] => {
34-
if (audienceTagTokens.includes("au")) {
35-
return "AUS";
36-
}
37-
if (audienceTagTokens.includes("us")) {
38-
return "US";
39-
}
40-
return "UK";
41-
};
16+
// We intend to deprecate the stub.externalData.intendedAudience (Option[String], comma separated tag slugs) and use
17+
// stub.externalData.trackingTags (Option[List[String]], array of tag paths)
4218

43-
const slugsToIntendedAudience = (
44-
audienceTagTokens: string[],
45-
): IntendedAudienceSignifierProps["intendedAudience"] => {
46-
if (audienceTagTokens.length === 0) {
47-
return "Don't know";
48-
}
49-
if (audienceTagTokens.includes("global")) {
50-
return audienceTagTokens.length === 1 ? "Global" : "Domestic For Global";
51-
}
52-
return "Domestic for Domestic";
53-
};
54-
55-
const deriveProps = (
56-
stubIntendedAudience: string | undefined,
57-
productionOffice: string | undefined,
58-
): {
59-
source: IntendedAudienceSignifierProps["source"];
60-
intendedAudience: IntendedAudienceSignifierProps["intendedAudience"];
61-
} => {
62-
if (!stubIntendedAudience) {
63-
return {
64-
source: parseProductionOfficeToSource(productionOffice),
65-
intendedAudience: "Don't know",
66-
};
67-
}
68-
69-
const audienceTagSlugs = stubIntendedAudience
70-
.split(",")
71-
.filter(isAudienceTagSlug);
72-
73-
return {
74-
source: slugsToSource(audienceTagSlugs),
75-
intendedAudience: slugsToIntendedAudience(audienceTagSlugs),
76-
};
19+
return mapTagsToSourceAndTarget(
20+
intendedAudience
21+
.split(",")
22+
.map((slug) => ({ path: `tracking/audience/${slug}` })),
23+
);
7724
};
7825

7926
export const IntendedAudienceWrapper: React.FunctionComponent<Props> = ({
80-
intendedAudience: stubIntendedAudience,
81-
productionOffice,
27+
intendedAudience,
8228
}: Props) => {
83-
const { intendedAudience, source } = deriveProps(
84-
stubIntendedAudience,
85-
productionOffice,
86-
);
29+
const sourceAndTarget = getSourceAndTarget(intendedAudience);
30+
if (!sourceAndTarget) {
31+
return null; // do not render the "Don't know" signifier in the table
32+
}
8733

8834
return (
8935
<IntendedAudienceSignifier
90-
intendedAudience={intendedAudience}
91-
source={source}
92-
theme={{
93-
svg: {
94-
width: "16px",
95-
height: "12px",
96-
},
97-
typography: {
98-
font: "normal 460 12px GuardianAgateSans1Web",
99-
},
100-
}}
36+
target={sourceAndTarget.target}
37+
source={sourceAndTarget.source}
10138
/>
10239
);
10340
};

0 commit comments

Comments
 (0)