@times-components/ts-components 1.52.4 → 1.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/components/newsletter-puff/AutoNewsletterPuff.d.ts +2 -3
  3. package/dist/components/newsletter-puff/AutoNewsletterPuff.js +3 -3
  4. package/dist/components/newsletter-puff/InlineNewsletterPuff.d.ts +2 -3
  5. package/dist/components/newsletter-puff/InlineNewsletterPuff.js +7 -22
  6. package/dist/components/newsletter-puff/NewsletterPuff.stories.js +5 -5
  7. package/dist/components/newsletter-puff/__tests__/AutoNewsletterPuff.test.js +2 -4
  8. package/dist/components/newsletter-puff/__tests__/InlineNewsletterPuff.test.js +12 -94
  9. package/dist/components/newsletter-puff/loading-overlay/LoadingOverlay.d.ts +1 -0
  10. package/dist/components/newsletter-puff/loading-overlay/LoadingOverlay.js +10 -0
  11. package/dist/components/newsletter-puff/loading-overlay/styles.d.ts +3 -0
  12. package/dist/components/newsletter-puff/loading-overlay/styles.js +50 -0
  13. package/dist/components/newsletter-puff/newsletter/Newsletter.d.ts +12 -0
  14. package/dist/components/newsletter-puff/newsletter/Newsletter.js +34 -0
  15. package/dist/components/newsletter-puff/newsletter/styles.d.ts +8 -0
  16. package/dist/components/newsletter-puff/newsletter/styles.js +52 -0
  17. package/dist/components/newsletter-puff/{NewsletterPuffButton.d.ts → newsletter-puff-button/NewsletterPuffButton.d.ts} +2 -1
  18. package/dist/components/newsletter-puff/newsletter-puff-button/NewsletterPuffButton.js +24 -0
  19. package/dist/components/newsletter-puff/{__tests__ → newsletter-puff-button/__tests__}/NewsletterPuffButton.test.d.ts +0 -0
  20. package/dist/components/newsletter-puff/newsletter-puff-button/__tests__/NewsletterPuffButton.test.js +41 -0
  21. package/dist/components/newsletter-puff/newsletter-puff-button/styles.d.ts +15 -0
  22. package/dist/components/newsletter-puff/newsletter-puff-button/styles.js +26 -0
  23. package/dist/components/newsletter-puff/{NewsletterPuffLink.d.ts → newsletter-puff-link/NewsletterPuffLink.d.ts} +0 -0
  24. package/dist/components/newsletter-puff/newsletter-puff-link/NewsletterPuffLink.js +29 -0
  25. package/dist/components/newsletter-puff/{__tests__ → newsletter-puff-link/__tests__}/NewsletterPuffLink.test.d.ts +0 -0
  26. package/dist/components/newsletter-puff/newsletter-puff-link/__tests__/NewsletterPuffLink.test.js +58 -0
  27. package/dist/components/newsletter-puff/preview-newsletter-puff/PreviewNewsletterPuff.d.ts +7 -0
  28. package/dist/components/newsletter-puff/preview-newsletter-puff/PreviewNewsletterPuff.js +11 -0
  29. package/dist/components/newsletter-puff/{__tests__ → preview-newsletter-puff/__tests__}/PreviewNewsletterPuff.test.d.ts +0 -0
  30. package/dist/components/newsletter-puff/preview-newsletter-puff/__tests__/PreviewNewsletterPuff.test.js +17 -0
  31. package/dist/components/newsletter-puff/styles.d.ts +6 -29
  32. package/dist/components/newsletter-puff/styles.js +11 -88
  33. package/dist/helpers/text-formatting/CapitaliseFirstCharacter.d.ts +1 -0
  34. package/dist/helpers/text-formatting/CapitaliseFirstCharacter.js +9 -0
  35. package/dist/helpers/text-formatting/__tests__/CapitaliseFirstCharacter.test.d.ts +1 -0
  36. package/dist/helpers/text-formatting/__tests__/CapitaliseFirstCharacter.test.js +12 -0
  37. package/dist/index.d.ts +1 -8
  38. package/dist/index.js +2 -10
  39. package/package.json +3 -3
  40. package/rnw.js +1 -1
  41. package/src/components/newsletter-puff/AutoNewsletterPuff.tsx +3 -6
  42. package/src/components/newsletter-puff/InlineNewsletterPuff.tsx +16 -53
  43. package/src/components/newsletter-puff/NewsletterPuff.stories.tsx +4 -13
  44. package/src/components/newsletter-puff/__tests__/AutoNewsletterPuff.test.tsx +1 -3
  45. package/src/components/newsletter-puff/__tests__/InlineNewsletterPuff.test.tsx +13 -119
  46. package/src/components/newsletter-puff/__tests__/__snapshots__/AutoNewsletterPuff.test.tsx.snap +4 -4
  47. package/src/components/newsletter-puff/__tests__/__snapshots__/InlineNewsletterPuff.test.tsx.snap +68 -260
  48. package/src/components/newsletter-puff/loading-overlay/LoadingOverlay.tsx +15 -0
  49. package/src/components/newsletter-puff/loading-overlay/styles.ts +54 -0
  50. package/src/components/newsletter-puff/newsletter/Newsletter.tsx +79 -0
  51. package/src/components/newsletter-puff/newsletter/styles.ts +65 -0
  52. package/src/components/newsletter-puff/{NewsletterPuffButton.tsx → newsletter-puff-button/NewsletterPuffButton.tsx} +10 -8
  53. package/src/components/newsletter-puff/{__tests__ → newsletter-puff-button/__tests__}/NewsletterPuffButton.test.tsx +12 -20
  54. package/src/components/newsletter-puff/newsletter-puff-button/styles.ts +28 -0
  55. package/src/components/newsletter-puff/{NewsletterPuffLink.tsx → newsletter-puff-link/NewsletterPuffLink.tsx} +5 -14
  56. package/src/components/newsletter-puff/{__tests__ → newsletter-puff-link/__tests__}/NewsletterPuffLink.test.tsx +5 -19
  57. package/src/components/newsletter-puff/preview-newsletter-puff/PreviewNewsletterPuff.tsx +32 -0
  58. package/src/components/newsletter-puff/{__tests__ → preview-newsletter-puff/__tests__}/PreviewNewsletterPuff.test.tsx +2 -5
  59. package/src/components/newsletter-puff/preview-newsletter-puff/__tests__/__snapshots__/PreviewNewsletterPuff.test.tsx.snap +36 -0
  60. package/src/components/newsletter-puff/styles.ts +10 -100
  61. package/src/helpers/text-formatting/CapitaliseFirstCharacter.ts +9 -0
  62. package/src/helpers/text-formatting/__tests__/CapitaliseFirstCharacter.test.tsx +13 -0
  63. package/src/index.ts +2 -27
  64. package/dist/components/newsletter-puff/NewsletterPuffButton.js +0 -24
  65. package/dist/components/newsletter-puff/NewsletterPuffLink.js +0 -34
  66. package/dist/components/newsletter-puff/PreviewNewsletterPuff.d.ts +0 -8
  67. package/dist/components/newsletter-puff/PreviewNewsletterPuff.js +0 -14
  68. package/dist/components/newsletter-puff/__tests__/NewsletterPuffButton.test.js +0 -47
  69. package/dist/components/newsletter-puff/__tests__/NewsletterPuffLink.test.js +0 -64
  70. package/dist/components/newsletter-puff/__tests__/PreviewNewsletterPuff.test.js +0 -18
  71. package/src/components/newsletter-puff/PreviewNewsletterPuff.tsx +0 -40
  72. package/src/components/newsletter-puff/__tests__/__snapshots__/NewsletterPuffButton.test.tsx.snap +0 -27
  73. package/src/components/newsletter-puff/__tests__/__snapshots__/NewsletterPuffLink.test.tsx.snap +0 -40
  74. package/src/components/newsletter-puff/__tests__/__snapshots__/PreviewNewsletterPuff.test.tsx.snap +0 -83
@@ -6,8 +6,7 @@ export const AutoNewsletterPuff = ({
6
6
  code,
7
7
  copy,
8
8
  headline,
9
- imageUri,
10
- label
9
+ section
11
10
  }: AutoNewsletterPuffProps) => (
12
11
  <ViewCountWrapper
13
12
  trackingName={`auto-puff-${code}`}
@@ -17,8 +16,7 @@ export const AutoNewsletterPuff = ({
17
16
  code={code}
18
17
  copy={copy}
19
18
  headline={headline}
20
- imageUri={imageUri}
21
- label={label}
19
+ section={section}
22
20
  />
23
21
  </ViewCountWrapper>
24
22
  );
@@ -27,6 +25,5 @@ type AutoNewsletterPuffProps = {
27
25
  code: string;
28
26
  copy: string;
29
27
  headline: string;
30
- imageUri: string;
31
- label?: string;
28
+ section?: string;
32
29
  };
@@ -3,32 +3,19 @@ import { Mutation } from 'react-apollo';
3
3
 
4
4
  import { GetNewsletter } from '@times-components/provider';
5
5
  import { subscribeNewsletter as subscribeNewsletterMutation } from '@times-components/provider-queries';
6
- import Image, { Placeholder } from '@times-components/image';
6
+ import { Placeholder } from '@times-components/image';
7
7
 
8
- import { NewsletterPuffButton } from './NewsletterPuffButton';
9
-
10
- import { NewsletterPuffLink } from './NewsletterPuffLink';
8
+ import { Newsletter } from './newsletter/Newsletter';
11
9
 
12
10
  import { TrackingContextProvider } from '../../helpers/tracking/TrackingContextProvider';
11
+ import { capitaliseFirstCharacter } from '../../helpers/text-formatting/CapitaliseFirstCharacter';
13
12
 
14
- import {
15
- InpContainer,
16
- InpCopy,
17
- InpImageContainer,
18
- InpPreferencesContainer,
19
- InpSignupContainer,
20
- InpSignupCTAContainer,
21
- InpSignupHeadline,
22
- InpSignupLabel,
23
- InpSubscribedContainer,
24
- InpSubscribedHeadline
25
- } from './styles';
13
+ import { InpContainer } from './styles';
26
14
 
27
15
  type InlineNewsletterPuffProps = {
28
16
  copy: string;
29
17
  headline: string;
30
- imageUri: string;
31
- label?: string;
18
+ section?: string;
32
19
  code: string;
33
20
  };
34
21
 
@@ -36,8 +23,7 @@ export const InlineNewsletterPuff = ({
36
23
  code,
37
24
  copy,
38
25
  headline,
39
- imageUri,
40
- label
26
+ section
41
27
  }: InlineNewsletterPuffProps) => {
42
28
  const [justSubscribed, setJustSubscribed] = useState(false);
43
29
 
@@ -90,39 +76,16 @@ export const InlineNewsletterPuff = ({
90
76
  }}
91
77
  >
92
78
  {({ intersectObserverRef }) => (
93
- <InpContainer>
94
- <InpImageContainer>
95
- <Image aspectRatio={1.42} uri={imageUri} />
96
- </InpImageContainer>
97
- {justSubscribed ? (
98
- <InpSubscribedContainer>
99
- <InpSubscribedHeadline>
100
- {`You’ve successfully signed up to ${
101
- newsletter.title
102
- }`}
103
- </InpSubscribedHeadline>
104
- <InpPreferencesContainer>
105
- <NewsletterPuffLink />
106
- </InpPreferencesContainer>
107
- </InpSubscribedContainer>
108
- ) : (
109
- <InpSignupContainer>
110
- <InpSignupLabel>{label}</InpSignupLabel>
111
- <InpSignupHeadline>{headline}</InpSignupHeadline>
112
- <InpCopy>{copy}</InpCopy>
113
- <InpSignupCTAContainer ref={intersectObserverRef}>
114
- <NewsletterPuffButton
115
- updatingSubscription={updatingSubscription}
116
- onPress={() => {
117
- if (!updatingSubscription) {
118
- subscribeNewsletter({ variables: { code } });
119
- }
120
- }}
121
- />
122
- </InpSignupCTAContainer>
123
- </InpSignupContainer>
124
- )}
125
- </InpContainer>
79
+ <Newsletter
80
+ intersectObserverRef={intersectObserverRef}
81
+ section={capitaliseFirstCharacter(section)}
82
+ justSubscribed={justSubscribed}
83
+ headline={headline}
84
+ updatingSubscription={updatingSubscription}
85
+ copy={copy}
86
+ code={code}
87
+ subscribeNewsletter={subscribeNewsletter}
88
+ />
126
89
  )}
127
90
  </TrackingContextProvider>
128
91
  )}
@@ -11,7 +11,7 @@ import { AutoNewsletterPuff } from './AutoNewsletterPuff';
11
11
  import { InlineNewsletterPuff } from './InlineNewsletterPuff';
12
12
 
13
13
  import { TrackingContextProvider } from '../../helpers/tracking/TrackingContextProvider';
14
- import { PreviewNewsletterPuff } from './PreviewNewsletterPuff';
14
+ import { PreviewNewsletterPuff } from './preview-newsletter-puff/PreviewNewsletterPuff';
15
15
 
16
16
  import analyticsStream from '../../fixtures/analytics-actions/analytics-actions';
17
17
 
@@ -72,10 +72,7 @@ const showcase = {
72
72
  'copy',
73
73
  'We’ll send you our top stories, across all sections, straight to your inbox. Simple as that.'
74
74
  )}
75
- imageUri={text(
76
- 'imageUri',
77
- 'https://www.thetimes.co.uk/imageserver/image/methode%2Ftimes%2Fprod%2Fweb%2Fbin%2F728c3e68-5311-4533-809a-b313a6503789.jpg?resize=800'
78
- )}
75
+ section="sport"
79
76
  />
80
77
  </TrackingContextProvider>
81
78
  </MockedProvider>
@@ -94,16 +91,13 @@ const showcase = {
94
91
  context={{ component: 'ArticleSkeleton' }}
95
92
  >
96
93
  <InlineNewsletterPuff
94
+ section="news"
97
95
  code={text('code', 'TNL-101')}
98
96
  headline={text('headline', 'Best of Times')}
99
97
  copy={text(
100
98
  'copy',
101
99
  'We’ll send you our top stories, across all sections, straight to your inbox. Simple as that.'
102
100
  )}
103
- imageUri={text(
104
- 'imageUri',
105
- 'https://www.thetimes.co.uk/imageserver/image/methode%2Ftimes%2Fprod%2Fweb%2Fbin%2F728c3e68-5311-4533-809a-b313a6503789.jpg?resize=800'
106
- )}
107
101
  />
108
102
  </TrackingContextProvider>
109
103
  </MockedProvider>
@@ -117,15 +111,12 @@ const showcase = {
117
111
  // eslint-disable-next-line react/prop-types
118
112
  component: ({ text }: any) => (
119
113
  <PreviewNewsletterPuff
114
+ section="sport"
120
115
  headline={text('headline', 'Best of Times')}
121
116
  copy={text(
122
117
  'copy',
123
118
  'We’ll send you our top stories, across all sections, straight to your inbox. Simple as that.'
124
119
  )}
125
- imageUri={text(
126
- 'imageUri',
127
- 'https://www.thetimes.co.uk/imageserver/image/methode%2Ftimes%2Fprod%2Fweb%2Fbin%2F728c3e68-5311-4533-809a-b313a6503789.jpg?resize=800'
128
- )}
129
120
  />
130
121
  ),
131
122
 
@@ -13,9 +13,7 @@ import {
13
13
  const defaultProps = {
14
14
  code: '123',
15
15
  copy: 'abc',
16
- headline: 'headline',
17
- imageUri: 'http://jpeg.jpg',
18
- label: 'news'
16
+ headline: 'headline'
19
17
  };
20
18
 
21
19
  const mocks = [
@@ -69,13 +69,10 @@ const renderComponent = (
69
69
  <InlineNewsletterPuff
70
70
  {...{
71
71
  code: 'TNL-119',
72
-
73
- label: 'STRAIGHT IN YOUR INBOX',
72
+ section: 'news',
74
73
  headline: 'Politics. Explained.',
75
74
  copy:
76
- 'Sign up to receive our brilliant Red Box newsletter, Matt Chorley`s poke at politics delivered every weekday morning at 8am.',
77
- imageUri:
78
- 'https://nuk-tnl-deck-prod-static.s3-eu-west-1.amazonaws.com/uploads/2aa9050e6c3d4de682f11a4802ebba96.jpg'
75
+ 'Sign up to receive our brilliant Red Box newsletter, Matt Chorley`s poke at politics delivered every weekday morning at 8am.'
79
76
  }}
80
77
  />
81
78
  </TrackingContextProvider>
@@ -100,7 +97,15 @@ describe('Inline Newsletter Puff', () => {
100
97
 
101
98
  it('renders signup state', async () => {
102
99
  const component = renderComponent();
103
- await component.findByText('Sign up now');
100
+ await component.findAllByText('One click sign up');
101
+ expect(component.baseElement).toMatchSnapshot();
102
+ });
103
+
104
+ it('renders loading state state', async () => {
105
+ const component = renderComponent();
106
+ const oneClickSignUp = await component.findAllByText('One click sign up');
107
+
108
+ fireEvent.click(oneClickSignUp[0]);
104
109
  expect(component.baseElement).toMatchSnapshot();
105
110
  });
106
111
 
@@ -138,90 +143,6 @@ describe('Inline Newsletter Puff', () => {
138
143
  expect(component.baseElement).toMatchSnapshot();
139
144
  });
140
145
 
141
- describe('Clicking Subscribe', () => {
142
- it("renders 'saving' when the button is clicked", async () => {
143
- const component = renderComponent(() => true);
144
-
145
- const signupButton = await component.findByText('Sign up now');
146
- fireEvent.click(signupButton);
147
-
148
- expect(component.baseElement).toMatchSnapshot();
149
- expect(await component.findByText('Saving…')).toBeTruthy();
150
- });
151
-
152
- it('triggers analytics when subscribed', async () => {
153
- const analyticsStream = jest.fn();
154
- const component = renderComponent(analyticsStream);
155
-
156
- const signupButton = await component.findByText('Sign up now');
157
- fireEvent.click(signupButton);
158
-
159
- await component.findByText('Saving…');
160
-
161
- expect(analyticsStream).toHaveBeenCalledWith({
162
- action: 'Clicked',
163
- component: 'ArticleSkeleton',
164
- object: 'NewsletterPuffButton',
165
- attrs: {
166
- article_parent_name: 'RED BOX',
167
- eventTime: '2021-05-03T00:00:00.000Z',
168
- event_navigation_action: 'navigation',
169
- event_navigation_browsing_method: 'click',
170
- event_navigation_name: 'widget : puff : sign up now'
171
- }
172
- });
173
- });
174
- });
175
-
176
- describe('Manage preferences ', () => {
177
- beforeEach(() => {
178
- mockDate.set(1620000000000);
179
- });
180
-
181
- afterEach(() => {
182
- mockDate.reset();
183
- jest.clearAllMocks();
184
- cleanup();
185
- });
186
- it('renders the success view after subscribing ', async () => {
187
- const component = renderComponent(() => true);
188
-
189
- const signupButton = await component.findByText('Sign up now');
190
- fireEvent.click(signupButton);
191
-
192
- expect(
193
- await component.findByText('Manage preferences here')
194
- ).toBeTruthy();
195
- expect(component.baseElement).toMatchSnapshot();
196
- });
197
-
198
- it('triggers analytics event when manage preferences clicked', async () => {
199
- const analyticsStream = jest.fn();
200
- const component = renderComponent(analyticsStream);
201
-
202
- const signupButton = await component.findByText('Sign up now');
203
- fireEvent.click(signupButton);
204
-
205
- const link = await component.findByText('Manage preferences here');
206
-
207
- analyticsStream.mockClear();
208
-
209
- fireEvent.click(link);
210
- expect(analyticsStream).toHaveBeenCalledWith({
211
- action: 'Clicked',
212
- object: 'NewsletterPuffLink',
213
- component: 'ArticleSkeleton',
214
- attrs: {
215
- article_parent_name: 'RED BOX',
216
- eventTime: '2021-05-03T00:00:00.000Z',
217
- event_navigation_action: 'navigation',
218
- event_navigation_browsing_method: 'click',
219
- event_navigation_name: 'widget : puff : manage preferences here'
220
- }
221
- });
222
- });
223
- });
224
-
225
146
  describe('intersectionObserverTests', () => {
226
147
  let oldIntersectionObserver: typeof IntersectionObserver;
227
148
  beforeEach(() => {
@@ -234,11 +155,11 @@ describe('Inline Newsletter Puff', () => {
234
155
  window.IntersectionObserver = oldIntersectionObserver;
235
156
  });
236
157
 
237
- it('sign up now : displayed', async () => {
158
+ it('One click sign up : displayed', async () => {
238
159
  const analyticsStream = jest.fn();
239
160
  const component = renderComponent(analyticsStream);
240
161
 
241
- await component.findByText('Sign up now');
162
+ await component.findAllByText('One click sign up');
242
163
 
243
164
  FakeIntersectionObserver.intersect();
244
165
 
@@ -255,32 +176,5 @@ describe('Inline Newsletter Puff', () => {
255
176
  }
256
177
  });
257
178
  });
258
- it('manage preferences here : displayed', async () => {
259
- const analyticsStream = jest.fn();
260
- const component = renderComponent(analyticsStream);
261
-
262
- const signupButton = await component.findByText('Sign up now');
263
- fireEvent.click(signupButton);
264
-
265
- await component.findByText('Manage preferences here');
266
-
267
- analyticsStream.mockClear();
268
-
269
- FakeIntersectionObserver.intersect();
270
-
271
- expect(analyticsStream).toHaveBeenCalledWith({
272
- action: 'Scrolled',
273
- component: 'ArticleSkeleton',
274
- object: 'NewsletterPuffLink',
275
- attrs: {
276
- article_parent_name: 'RED BOX',
277
- eventTime: '2021-05-03T00:00:00.000Z',
278
- event_navigation_action: 'navigation',
279
- event_navigation_browsing_method: 'automated',
280
- event_navigation_name:
281
- 'widget : puff : manage preferences here : displayed'
282
- }
283
- });
284
- });
285
179
  });
286
180
  });
@@ -6,7 +6,7 @@ exports[`<AutoNewsletterPuff> display function always renders 1`] = `
6
6
  style="display: block;"
7
7
  >
8
8
  <div
9
- class="sc-bdVaJa sc-htpNat bSdOkq"
9
+ class="sc-bwzfXH sc-bxivhb jahLAV"
10
10
  style="height: 257px;"
11
11
  >
12
12
  <div
@@ -45,7 +45,7 @@ exports[`<AutoNewsletterPuff> display function doesnt render without consent 1`]
45
45
  style="display: none;"
46
46
  >
47
47
  <div
48
- class="sc-bdVaJa sc-htpNat bSdOkq"
48
+ class="sc-bwzfXH sc-bxivhb jahLAV"
49
49
  style="height: 257px;"
50
50
  >
51
51
  <div
@@ -84,7 +84,7 @@ exports[`<AutoNewsletterPuff> using a display function [1, 3] count = 1 1`] = `
84
84
  style="display: block;"
85
85
  >
86
86
  <div
87
- class="sc-bdVaJa sc-htpNat bSdOkq"
87
+ class="sc-bwzfXH sc-bxivhb jahLAV"
88
88
  style="height: 257px;"
89
89
  >
90
90
  <div
@@ -123,7 +123,7 @@ exports[`<AutoNewsletterPuff> using a display function [1, 3] count = 2 1`] = `
123
123
  style="display: none;"
124
124
  >
125
125
  <div
126
- class="sc-bdVaJa sc-htpNat bSdOkq"
126
+ class="sc-bwzfXH sc-bxivhb jahLAV"
127
127
  style="height: 257px;"
128
128
  >
129
129
  <div