@times-components/ts-components 1.104.1-alpha.14 → 1.104.1-alpha.33
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.
- package/CHANGELOG.md +27 -0
- package/dist/components/article-header/ArticleHeader.js +6 -3
- package/dist/components/article-header/ArticleHeader.stories.js +2 -5
- package/dist/components/article-sidebar/ArticleSidebar.js +6 -3
- package/dist/components/article-sidebar/ArticleSidebar.stories.js +20 -10
- package/dist/components/article-sidebar/__tests__/index.test.js +49 -7
- package/dist/components/article-sidebar/tracking-helpers.d.ts +13 -0
- package/dist/components/article-sidebar/tracking-helpers.js +16 -0
- package/dist/components/twitter-embed/TwitterEmbed.d.ts +5 -3
- package/dist/components/twitter-embed/TwitterEmbed.js +80 -13
- package/dist/components/twitter-embed/__tests__/TwitterEmbed.test.js +366 -25
- package/dist/components/twitter-embed/styles.d.ts +8 -0
- package/dist/components/twitter-embed/styles.js +75 -0
- package/dist/components/updated-timestamp/UpdatedTimestamp.js +4 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/package.json +5 -4
- package/rnw.js +1 -1
- package/src/components/article-header/ArticleHeader.stories.tsx +1 -5
- package/src/components/article-header/ArticleHeader.tsx +5 -6
- package/src/components/article-sidebar/ArticleSidebar.stories.tsx +24 -10
- package/src/components/article-sidebar/ArticleSidebar.tsx +22 -2
- package/src/components/article-sidebar/__tests__/__snapshots__/index.test.tsx.snap +8 -8
- package/src/components/article-sidebar/__tests__/index.test.tsx +56 -6
- package/src/components/article-sidebar/tracking-helpers.ts +21 -0
- package/src/components/twitter-embed/TwitterEmbed.tsx +134 -15
- package/src/components/twitter-embed/__tests__/TwitterEmbed.test.tsx +523 -22
- package/src/components/twitter-embed/styles.ts +82 -0
- package/src/components/updated-timestamp/UpdatedTimestamp.tsx +3 -1
- package/src/index.ts +2 -0
- package/tslint.json +2 -1
|
@@ -1,40 +1,381 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { render } from '@testing-library/react';
|
|
3
|
-
import { TwitterEmbed } from '../TwitterEmbed';
|
|
2
|
+
import { render, screen, fireEvent } from '@testing-library/react';
|
|
3
|
+
import { TwitterEmbed } from '../TwitterEmbed';
|
|
4
4
|
import '@testing-library/jest-dom';
|
|
5
|
+
import get from 'lodash.get';
|
|
6
|
+
// Mocking external dependencies
|
|
7
|
+
jest.mock('@times-components/interactive-wrapper', () => jest.fn(() => React.createElement("div", null, "InteractiveWrapper")));
|
|
8
|
+
jest.mock('lodash.get');
|
|
5
9
|
const mockTcfApi = jest.fn();
|
|
6
10
|
describe('TwitterEmbed', () => {
|
|
7
11
|
beforeEach(() => {
|
|
12
|
+
// Reset mocks before each test
|
|
8
13
|
mockTcfApi.mockReset();
|
|
9
14
|
window.__tcfapi = mockTcfApi;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
});
|
|
15
|
+
/* tslint:disable:no-empty */
|
|
16
|
+
jest.spyOn(global.console, 'log').mockImplementation(() => { });
|
|
17
|
+
/* tslint:disable:no-empty */
|
|
18
|
+
jest.spyOn(global.console, 'warn').mockImplementation(() => { });
|
|
15
19
|
});
|
|
16
20
|
afterEach(() => {
|
|
21
|
+
// Restore mocks after each test
|
|
17
22
|
jest.restoreAllMocks();
|
|
18
23
|
});
|
|
19
|
-
it('
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
it('renders Twitter content if consent is given for Twitter', () => {
|
|
25
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
26
|
+
callback({ consentedVendors: [{ name: 'Twitter' }] }, true);
|
|
27
|
+
});
|
|
28
|
+
const mockElement = {
|
|
29
|
+
attributes: {},
|
|
30
|
+
value: 'Twitter content',
|
|
31
|
+
key: 'twitter-embed'
|
|
32
|
+
};
|
|
33
|
+
const url = 'https://twitter.com';
|
|
34
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
35
|
+
// Assert that InteractiveWrapper is rendered
|
|
36
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
37
|
+
});
|
|
38
|
+
it('renders blocked content message if consent for Twitter is not given', () => {
|
|
39
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
40
|
+
callback({ consentedVendors: [] }, true);
|
|
41
|
+
});
|
|
42
|
+
const mockElement = {
|
|
43
|
+
attributes: {},
|
|
44
|
+
value: 'Twitter content',
|
|
45
|
+
key: 'twitter-embed'
|
|
46
|
+
};
|
|
47
|
+
const url = 'https://twitter.com';
|
|
48
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
49
|
+
// Assert that the blocked content message is rendered
|
|
50
|
+
expect(screen.getByText('X (Twitter) content blocked')).toBeInTheDocument();
|
|
51
|
+
expect(screen.getByText('privacy manager.')).toBeInTheDocument();
|
|
52
|
+
expect(screen.getByRole('button', { name: /Enable cookies/i })).toBeInTheDocument();
|
|
53
|
+
expect(screen.getByRole('button', { name: /Allow cookies once/i })).toBeInTheDocument();
|
|
54
|
+
});
|
|
55
|
+
it('calls __tcfapi and logs an error if consent data is unavailable', () => {
|
|
56
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
57
|
+
callback(null, false);
|
|
58
|
+
});
|
|
59
|
+
const mockElement = {
|
|
60
|
+
attributes: {},
|
|
61
|
+
value: 'Twitter content',
|
|
62
|
+
key: 'twitter-embed'
|
|
63
|
+
};
|
|
64
|
+
const url = 'https://twitter.com';
|
|
65
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
66
|
+
expect(global.console.log).toHaveBeenCalledWith('Error fetching consent data or Twitter not allowed');
|
|
67
|
+
});
|
|
68
|
+
it('enables cookies and unblocks Twitter content', () => {
|
|
69
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
70
|
+
callback({
|
|
71
|
+
grants: {
|
|
72
|
+
'5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } }
|
|
73
|
+
}
|
|
74
|
+
}, true);
|
|
75
|
+
});
|
|
76
|
+
const mockElement = {
|
|
77
|
+
attributes: {},
|
|
78
|
+
value: 'Twitter content',
|
|
79
|
+
key: 'twitter-embed'
|
|
80
|
+
};
|
|
81
|
+
const url = 'https://twitter.com';
|
|
82
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
83
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
84
|
+
// Ensure that the __tcfapi function is called with the correct arguments
|
|
33
85
|
expect(mockTcfApi).toHaveBeenCalledWith('getCustomVendorConsents', 2, expect.any(Function));
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
86
|
+
mockTcfApi.mock.calls[0][2]({
|
|
87
|
+
grants: { '5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } } }
|
|
88
|
+
}, true);
|
|
89
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
90
|
+
});
|
|
91
|
+
it('allows cookies once and unblocks Twitter content temporarily', () => {
|
|
92
|
+
// Mock implementation for __tcfapi
|
|
93
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
94
|
+
callback({
|
|
95
|
+
grants: {
|
|
96
|
+
'5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } }
|
|
97
|
+
}
|
|
98
|
+
}, true);
|
|
99
|
+
});
|
|
100
|
+
const mockElement = {
|
|
101
|
+
attributes: {},
|
|
102
|
+
value: 'Twitter content',
|
|
103
|
+
key: 'twitter-embed'
|
|
104
|
+
};
|
|
105
|
+
const url = 'https://twitter.com';
|
|
106
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
107
|
+
// Click the "Allow cookies once" button
|
|
108
|
+
fireEvent.click(screen.getByRole('button', { name: /Allow cookies once/i }));
|
|
109
|
+
// Ensure that Twitter content is unblocked temporarily (InteractiveWrapper is rendered)
|
|
110
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
111
|
+
// Mock that cookies are not permanently set, and content should be blocked again after refresh
|
|
112
|
+
// Here, we just verify that consent was not permanently stored
|
|
113
|
+
mockTcfApi.mockReset(); // Reset the mock to simulate a new page load without consent
|
|
114
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
115
|
+
// Ensure that the blocked content message is rendered again after refresh
|
|
116
|
+
expect(screen.getByText('X (Twitter) content blocked')).toBeInTheDocument();
|
|
117
|
+
});
|
|
118
|
+
it('handles missing __tcfapi gracefully', () => {
|
|
119
|
+
// Ensure __tcfapi is undefined
|
|
120
|
+
delete window.__tcfapi;
|
|
121
|
+
const mockElement = {
|
|
122
|
+
attributes: {},
|
|
123
|
+
value: 'Twitter content',
|
|
124
|
+
key: 'twitter-embed'
|
|
125
|
+
};
|
|
126
|
+
const url = 'https://twitter.com';
|
|
127
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
128
|
+
// Ensure that the blocked content message is rendered
|
|
129
|
+
expect(screen.getByText('X (Twitter) content blocked')).toBeInTheDocument();
|
|
130
|
+
expect(global.console.log).toHaveBeenCalledWith('window', window);
|
|
131
|
+
});
|
|
132
|
+
it('opens privacy modal when available', () => {
|
|
133
|
+
const mockLoadPrivacyManagerModal = jest.fn();
|
|
134
|
+
// Mock the sourcepoint configuration
|
|
135
|
+
window.__TIMES_CONFIG__ = {
|
|
136
|
+
sourcepoint: {
|
|
137
|
+
gdprMessageId: 'messageIdForGDPR'
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
// Mock get to return loadPrivacyManagerModal function
|
|
141
|
+
get.mockReturnValue(mockLoadPrivacyManagerModal);
|
|
142
|
+
const mockElement = {
|
|
143
|
+
attributes: {},
|
|
144
|
+
value: 'Twitter content',
|
|
145
|
+
key: 'twitter-embed'
|
|
146
|
+
};
|
|
147
|
+
const url = 'https://twitter.com';
|
|
148
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
149
|
+
// Simulate user clicking the privacy manager link
|
|
150
|
+
const privacyManagerLink = screen.getByText('privacy manager.');
|
|
151
|
+
fireEvent.click(privacyManagerLink);
|
|
152
|
+
// Ensure that the privacy modal load function is called with the correct message ID
|
|
153
|
+
expect(mockLoadPrivacyManagerModal).toHaveBeenCalledWith('messageIdForGDPR');
|
|
154
|
+
});
|
|
155
|
+
it('handles missing privacy modal gracefully', () => {
|
|
156
|
+
// Mock get to return undefined (no privacy modal available)
|
|
157
|
+
get.mockReturnValue(undefined);
|
|
158
|
+
const mockElement = {
|
|
159
|
+
attributes: {},
|
|
160
|
+
value: 'Twitter content',
|
|
161
|
+
key: 'twitter-embed'
|
|
162
|
+
};
|
|
163
|
+
const url = 'https://twitter.com';
|
|
164
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
165
|
+
// Simulate user clicking the privacy manager link
|
|
166
|
+
const privacyManagerLink = screen.getByText('privacy manager.');
|
|
167
|
+
fireEvent.click(privacyManagerLink);
|
|
168
|
+
// Ensure that the console.warn is triggered
|
|
169
|
+
expect(global.console.warn).toHaveBeenCalledWith('Sourcepoint LoadPrivacyManagerModal is not available');
|
|
170
|
+
});
|
|
171
|
+
it('allows cookies once for Twitter', () => {
|
|
172
|
+
// Mock implementation for __tcfapi
|
|
173
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
174
|
+
callback({
|
|
175
|
+
grants: {
|
|
176
|
+
'5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } }
|
|
177
|
+
}
|
|
178
|
+
}, true);
|
|
179
|
+
});
|
|
180
|
+
const mockElement = {
|
|
181
|
+
attributes: {},
|
|
182
|
+
value: 'Twitter content',
|
|
183
|
+
key: 'twitter-embed'
|
|
184
|
+
};
|
|
185
|
+
const url = 'https://twitter.com';
|
|
186
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
187
|
+
// Click the "Allow cookies once" button
|
|
188
|
+
fireEvent.click(screen.getByRole('button', { name: /Allow cookies once/i }));
|
|
189
|
+
// Ensure that the Twitter content is rendered after allowing cookies once
|
|
190
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
191
|
+
});
|
|
192
|
+
it('renders Twitter content when isTwitterAllowed is initially true', () => {
|
|
193
|
+
// Mock implementation to set consent for Twitter from the start
|
|
194
|
+
mockTcfApi.mockImplementation((_, __, callback) => {
|
|
195
|
+
callback({ consentedVendors: [{ name: 'Twitter' }] }, true);
|
|
37
196
|
});
|
|
197
|
+
const mockElement = {
|
|
198
|
+
attributes: {},
|
|
199
|
+
value: 'Twitter content',
|
|
200
|
+
key: 'twitter-embed'
|
|
201
|
+
};
|
|
202
|
+
const url = 'https://twitter.com';
|
|
203
|
+
// Initially set isTwitterAllowed to true
|
|
204
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
205
|
+
// Ensure Twitter content is immediately displayed
|
|
206
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
207
|
+
});
|
|
208
|
+
it('handles when __tcfapi is not available on window', () => {
|
|
209
|
+
// Ensure __tcfapi is undefined
|
|
210
|
+
delete window.__tcfapi;
|
|
211
|
+
const mockElement = {
|
|
212
|
+
attributes: {},
|
|
213
|
+
value: 'Twitter content',
|
|
214
|
+
key: 'twitter-embed'
|
|
215
|
+
};
|
|
216
|
+
const url = 'https://twitter.com';
|
|
217
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
218
|
+
// Ensure that blocked content message is rendered when __tcfapi is not available
|
|
219
|
+
expect(screen.getByText('X (Twitter) content blocked')).toBeInTheDocument();
|
|
220
|
+
// Ensure that console.log is called since __tcfapi is not available
|
|
221
|
+
expect(global.console.log).toHaveBeenCalledWith('window', window);
|
|
222
|
+
});
|
|
223
|
+
it('handles when __tcfapi is a stub', () => {
|
|
224
|
+
// Define __tcfapi as a stub (noop)
|
|
225
|
+
window.__tcfapi = jest.fn();
|
|
226
|
+
const mockElement = {
|
|
227
|
+
attributes: {},
|
|
228
|
+
value: 'Twitter content',
|
|
229
|
+
key: 'twitter-embed'
|
|
230
|
+
};
|
|
231
|
+
const url = 'https://twitter.com';
|
|
232
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
233
|
+
// Ensure that blocked content message is rendered since the stub does nothing
|
|
234
|
+
expect(screen.getByText('X (Twitter) content blocked')).toBeInTheDocument();
|
|
235
|
+
// Ensure __tcfapi was called, even though it is a stub
|
|
236
|
+
expect(window.__tcfapi).toHaveBeenCalledWith('getCustomVendorConsents', 2, expect.any(Function));
|
|
237
|
+
});
|
|
238
|
+
it('allows cookies once when the Allow cookies once button is clicked', () => {
|
|
239
|
+
const mockElement = {
|
|
240
|
+
attributes: {},
|
|
241
|
+
value: 'Twitter content',
|
|
242
|
+
key: 'twitter-embed'
|
|
243
|
+
};
|
|
244
|
+
const url = 'https://twitter.com';
|
|
245
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
246
|
+
// Click the "Allow cookies once" button
|
|
247
|
+
fireEvent.click(screen.getByRole('button', { name: /Allow cookies once/i }));
|
|
248
|
+
// Ensure that Twitter content is unblocked temporarily (InteractiveWrapper is rendered)
|
|
249
|
+
expect(screen.getByText('InteractiveWrapper')).toBeInTheDocument();
|
|
250
|
+
});
|
|
251
|
+
it('calls enableCookies and logs an error when vendor consent data is not found', () => {
|
|
252
|
+
const consoleErrorMock = jest
|
|
253
|
+
.spyOn(global.console, 'error')
|
|
254
|
+
.mockImplementation(() => { });
|
|
255
|
+
const mockElement = {
|
|
256
|
+
attributes: {},
|
|
257
|
+
value: 'Twitter content',
|
|
258
|
+
key: 'twitter-embed'
|
|
259
|
+
};
|
|
260
|
+
const url = 'https://twitter.com';
|
|
261
|
+
window.__tcfapi = jest.fn((_, __, callback) => {
|
|
262
|
+
callback(null, true); // Simulate the case where the vendor consent data is missing
|
|
263
|
+
});
|
|
264
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
265
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
266
|
+
expect(consoleErrorMock).toHaveBeenCalledWith('Twitter vendor consent not available:', null);
|
|
267
|
+
consoleErrorMock.mockRestore();
|
|
268
|
+
});
|
|
269
|
+
it('calls openPrivacyModal and warns when no modal is available', () => {
|
|
270
|
+
const consoleWarnMock = jest
|
|
271
|
+
.spyOn(global.console, 'warn')
|
|
272
|
+
.mockImplementation(() => { });
|
|
273
|
+
const mockElement = {
|
|
274
|
+
attributes: {},
|
|
275
|
+
value: 'Twitter content',
|
|
276
|
+
key: 'twitter-embed'
|
|
277
|
+
};
|
|
278
|
+
const url = 'https://twitter.com';
|
|
279
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
280
|
+
// Simulate clicking the privacy manager link
|
|
281
|
+
const privacyManagerLink = screen.getByText('privacy manager.');
|
|
282
|
+
fireEvent.click(privacyManagerLink);
|
|
283
|
+
// Expect the console warning to be called
|
|
284
|
+
expect(consoleWarnMock).toHaveBeenCalledWith('Sourcepoint LoadPrivacyManagerModal is not available');
|
|
285
|
+
consoleWarnMock.mockRestore();
|
|
286
|
+
});
|
|
287
|
+
it('logs error when consent setting fails', () => {
|
|
288
|
+
const consoleErrorMock = jest
|
|
289
|
+
.spyOn(global.console, 'error')
|
|
290
|
+
.mockImplementation(() => { });
|
|
291
|
+
const mockElement = {
|
|
292
|
+
attributes: {},
|
|
293
|
+
value: 'Twitter content',
|
|
294
|
+
key: 'twitter-embed'
|
|
295
|
+
};
|
|
296
|
+
const url = 'https://twitter.com';
|
|
297
|
+
window.__tcfapi = jest.fn((_, __, callback) => {
|
|
298
|
+
callback({
|
|
299
|
+
grants: {
|
|
300
|
+
'5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } }
|
|
301
|
+
}
|
|
302
|
+
}, false); // Simulate failure
|
|
303
|
+
});
|
|
304
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
305
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
306
|
+
expect(consoleErrorMock).toHaveBeenCalledWith('Twitter vendor consent not available:', {
|
|
307
|
+
grants: { '5fab0c31a22863611c5f8764': { purposeGrants: { '1': true } } }
|
|
308
|
+
});
|
|
309
|
+
consoleErrorMock.mockRestore();
|
|
310
|
+
});
|
|
311
|
+
it('calls enableCookies and logs a console error when TCF API is not available', () => {
|
|
312
|
+
const consoleErrorMock = jest
|
|
313
|
+
.spyOn(global.console, 'error')
|
|
314
|
+
.mockImplementation(() => { });
|
|
315
|
+
const mockElement = {
|
|
316
|
+
attributes: {},
|
|
317
|
+
value: 'Twitter content',
|
|
318
|
+
key: 'twitter-embed'
|
|
319
|
+
};
|
|
320
|
+
const url = 'https://twitter.com';
|
|
321
|
+
// Simulate missing __tcfapi
|
|
322
|
+
delete window.__tcfapi;
|
|
323
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
324
|
+
// Simulate clicking the "Enable cookies" button
|
|
325
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
326
|
+
// Expect a console error
|
|
327
|
+
expect(consoleErrorMock).toHaveBeenCalledWith('TCF API is not available or Twitter vendor ID is missing.');
|
|
328
|
+
consoleErrorMock.mockRestore();
|
|
329
|
+
});
|
|
330
|
+
it('calls enableCookies and logs a console error when TCF API is not available', () => {
|
|
331
|
+
const consoleErrorMock = jest
|
|
332
|
+
.spyOn(global.console, 'error')
|
|
333
|
+
.mockImplementation(() => { });
|
|
334
|
+
const mockElement = {
|
|
335
|
+
attributes: {},
|
|
336
|
+
value: 'Twitter content',
|
|
337
|
+
key: 'twitter-embed'
|
|
338
|
+
};
|
|
339
|
+
const url = 'https://twitter.com';
|
|
340
|
+
delete window.__tcfapi;
|
|
341
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
342
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
343
|
+
expect(consoleErrorMock).toHaveBeenCalledWith('TCF API is not available or Twitter vendor ID is missing.');
|
|
344
|
+
consoleErrorMock.mockRestore();
|
|
345
|
+
});
|
|
346
|
+
it('calls enableCookies and logs a console error when TCF API is not available', () => {
|
|
347
|
+
const consoleErrorMock = jest
|
|
348
|
+
.spyOn(global.console, 'error')
|
|
349
|
+
.mockImplementation(() => { });
|
|
350
|
+
const mockElement = {
|
|
351
|
+
attributes: {},
|
|
352
|
+
value: 'Twitter content',
|
|
353
|
+
key: 'twitter-embed'
|
|
354
|
+
};
|
|
355
|
+
const url = 'https://twitter.com';
|
|
356
|
+
delete window.__tcfapi;
|
|
357
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
358
|
+
fireEvent.click(screen.getByRole('button', { name: /Enable cookies/i }));
|
|
359
|
+
expect(consoleErrorMock).toHaveBeenCalledWith('TCF API is not available or Twitter vendor ID is missing.');
|
|
360
|
+
consoleErrorMock.mockRestore();
|
|
361
|
+
});
|
|
362
|
+
it('logs a warning when the privacy modal is unavailable', () => {
|
|
363
|
+
const consoleWarnMock = jest
|
|
364
|
+
.spyOn(global.console, 'warn')
|
|
365
|
+
.mockImplementation(() => { });
|
|
366
|
+
const mockElement = {
|
|
367
|
+
attributes: {},
|
|
368
|
+
value: 'Twitter content',
|
|
369
|
+
key: 'twitter-embed'
|
|
370
|
+
};
|
|
371
|
+
const url = 'https://twitter.com';
|
|
372
|
+
get.mockReturnValue(undefined);
|
|
373
|
+
render(React.createElement(TwitterEmbed, { element: mockElement, url: url }));
|
|
374
|
+
// Simulate clicking the privacy manager link
|
|
375
|
+
fireEvent.click(screen.getByText('privacy manager.'));
|
|
376
|
+
// Expect the warning to be logged
|
|
377
|
+
expect(consoleWarnMock).toHaveBeenCalledWith('Sourcepoint LoadPrivacyManagerModal is not available');
|
|
378
|
+
consoleWarnMock.mockRestore();
|
|
38
379
|
});
|
|
39
380
|
});
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHdpdHRlckVtYmVkLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90d2l0dGVyLWVtYmVkL19fdGVzdHNfXy9Ud2l0dGVyRW1iZWQudGVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUMsQ0FBQywrQkFBK0I7QUFDL0UsT0FBTywyQkFBMkIsQ0FBQztBQUVuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7QUFFN0IsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUU3QixpREFBaUQ7UUFDakQsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUU7WUFDeEQsNENBQTRDO1FBQzlDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlEQUF5RCxFQUFFLEdBQUcsRUFBRTtRQUNqRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFFdkIsTUFBTSxDQUFDLG9CQUFDLFlBQVksSUFBQyxhQUFhLEVBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUU5QyxzQ0FBc0M7UUFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtRQUN0RCw4Q0FBOEM7UUFDOUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMzRCxRQUFRLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDdkMsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxvQkFBQyxZQUFZLElBQUMsYUFBYSxFQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFOUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUNyQyx5QkFBeUIsRUFDekIsQ0FBQyxFQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQ3JCLENBQUM7UUFFRixzQ0FBc0M7UUFDdEMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsRUFBRTtZQUM1RCxjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHdpdHRlckVtYmVkLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy90d2l0dGVyLWVtYmVkL19fdGVzdHNfXy9Ud2l0dGVyRW1iZWQudGVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQztBQUU3QixnQ0FBZ0M7QUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUUsQ0FDdEQsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzREFBNkIsQ0FBQyxDQUM3QyxDQUFDO0FBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7QUFFN0IsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDNUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLCtCQUErQjtRQUMvQixVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUM7UUFFN0IsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFD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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const CardContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
2
|
+
export declare const Header: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
3
|
+
export declare const CustomIconContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
4
|
+
export declare const Title: import("styled-components").StyledComponent<"h1", any, {}, never>;
|
|
5
|
+
export declare const Paragraph: import("styled-components").StyledComponent<"p", any, {}, never>;
|
|
6
|
+
export declare const EnableButton: import("styled-components").StyledComponent<"button", any, {}, never>;
|
|
7
|
+
export declare const AllowButton: import("styled-components").StyledComponent<"button", any, {}, never>;
|
|
8
|
+
export declare const LinkPrivacyManager: import("styled-components").StyledComponent<"a", any, {}, never>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { breakpoints } from '@times-components/ts-styleguide';
|
|
3
|
+
import { IconContainer } from '../save-star/styles';
|
|
4
|
+
export const CardContainer = styled.div `
|
|
5
|
+
padding: 24px;
|
|
6
|
+
height: auto;
|
|
7
|
+
width: auto;
|
|
8
|
+
border: 1px solid #e4e4e4;
|
|
9
|
+
background-color: #f5f5f5;
|
|
10
|
+
margin: 0;
|
|
11
|
+
max-width: 460px;
|
|
12
|
+
`;
|
|
13
|
+
export const Header = styled.div `
|
|
14
|
+
display: flex;
|
|
15
|
+
`;
|
|
16
|
+
export const CustomIconContainer = styled(IconContainer) `
|
|
17
|
+
height: auto;
|
|
18
|
+
width: auto;
|
|
19
|
+
margin-right: 8px;
|
|
20
|
+
svg {
|
|
21
|
+
fill: #1573a2;
|
|
22
|
+
width: 20px;
|
|
23
|
+
height: 20px;
|
|
24
|
+
}
|
|
25
|
+
`;
|
|
26
|
+
export const Title = styled.h1 `
|
|
27
|
+
color: #005c8a;
|
|
28
|
+
font-family: Roboto;
|
|
29
|
+
font-size: 20px;
|
|
30
|
+
font-style: normal;
|
|
31
|
+
font-weight: 700;
|
|
32
|
+
line-height: 112.5%;
|
|
33
|
+
margin: 0;
|
|
34
|
+
|
|
35
|
+
@media (max-width: ${breakpoints.medium}px) {
|
|
36
|
+
font-size: 18px;
|
|
37
|
+
}
|
|
38
|
+
`;
|
|
39
|
+
export const Paragraph = styled.p `
|
|
40
|
+
color: #333;
|
|
41
|
+
font-family: Roboto;
|
|
42
|
+
font-size: 18px;
|
|
43
|
+
font-style: normal;
|
|
44
|
+
font-weight: 400;
|
|
45
|
+
line-height: 150%;
|
|
46
|
+
|
|
47
|
+
@media (max-width: ${breakpoints.medium}px) {
|
|
48
|
+
font-size: 16px;
|
|
49
|
+
}
|
|
50
|
+
`;
|
|
51
|
+
export const EnableButton = styled.button `
|
|
52
|
+
display: flex;
|
|
53
|
+
align-items: flex-start;
|
|
54
|
+
align-self: stretch;
|
|
55
|
+
background-color: #005c8a;
|
|
56
|
+
padding: 8px 12px;
|
|
57
|
+
width: 100%;
|
|
58
|
+
justify-content: center;
|
|
59
|
+
color: #ffffff;
|
|
60
|
+
border: none;
|
|
61
|
+
`;
|
|
62
|
+
export const AllowButton = styled.button `
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: flex-start;
|
|
65
|
+
align-self: stretch;
|
|
66
|
+
color: #333333;
|
|
67
|
+
width: 100%;
|
|
68
|
+
justify-content: center;
|
|
69
|
+
margin-top: 12px;
|
|
70
|
+
padding: 8px 12px;
|
|
71
|
+
`;
|
|
72
|
+
export const LinkPrivacyManager = styled.a `
|
|
73
|
+
color: #00527a;
|
|
74
|
+
`;
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdHdpdHRlci1lbWJlZC9zdHlsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQTs7Ozs7Ozs7Q0FRdEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFBOztDQUUvQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFBOzs7Ozs7Ozs7Q0FTdkQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFBOzs7Ozs7Ozs7dUJBU1AsV0FBVyxDQUFDLE1BQU07OztDQUd4QyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUE7Ozs7Ozs7O3VCQVFWLFdBQVcsQ0FBQyxNQUFNOzs7Q0FHeEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFBOzs7Ozs7Ozs7O0NBVXhDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTs7Ozs7Ozs7O0NBU3ZDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFBOztDQUV6QyxDQUFDIn0=
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
2
|
+
import differenceInSeconds from 'date-fns/differenceInSeconds';
|
|
3
|
+
import formatDistanceStrict from 'date-fns/formatDistanceStrict';
|
|
4
|
+
import format from 'date-fns/format';
|
|
3
5
|
import { Container, TimeSinceUpdate } from './styles';
|
|
4
6
|
export const UpdatedTimestamp = ({ updatedTime, color }) => {
|
|
5
7
|
if (!updatedTime) {
|
|
@@ -18,4 +20,4 @@ export const UpdatedTimestamp = ({ updatedTime, color }) => {
|
|
|
18
20
|
format(updatedDate, 'MMMM d, '),
|
|
19
21
|
format(updatedDate, 'h.mmaaa'))) : null));
|
|
20
22
|
};
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXBkYXRlZFRpbWVzdGFtcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VwZGF0ZWQtdGltZXN0YW1wL1VwZGF0ZWRUaW1lc3RhbXAudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLG1CQUFtQixNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sb0JBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFFckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBR3hCLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRTtJQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFO1FBQ2hCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxNQUFNLGVBQWUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ25DLE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sbUJBQW1CLEdBQ3ZCLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUU7UUFDakQsY0FBYyxFQUFFLE9BQU87S0FDeEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUNkLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV4RSxNQUFNLGlCQUFpQixHQUFHLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDN0MsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFdkQsT0FBTyxDQUNMLG9CQUFDLFNBQVMsUUFDUCxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUN6QyxvQkFBQyxlQUFlLElBQUMsS0FBSyxFQUFFLEtBQUssaUJBQWMseUJBQXlCLElBQ2pFLFdBQVcsbUJBQW1CLEVBQUUsQ0FDakIsQ0FDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FDdkIsb0JBQUMsZUFBZSxJQUFDLEtBQUssRUFBRSxLQUFLLGlCQUFjLGlCQUFpQjtRQUN6RCxVQUFVO1FBQ1YsTUFBTSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUM7UUFDL0IsTUFBTSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FDZixDQUNuQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ0UsQ0FDYixDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
|
package/dist/index.d.ts
CHANGED
|
@@ -41,3 +41,4 @@ export { WelcomeBanner } from './components/welcome-banner/WelcomeBanner';
|
|
|
41
41
|
export { default as safeDecodeURIComponent } from './utils/safeDecodeURIComponent';
|
|
42
42
|
export { ArticleSidebar } from './components/article-sidebar/ArticleSidebar';
|
|
43
43
|
export { FeaturesCarousel } from './components/features-carousel/FeaturesCarousel';
|
|
44
|
+
export { TwitterEmbed } from './components/twitter-embed/TwitterEmbed';
|
package/dist/index.js
CHANGED
|
@@ -46,4 +46,5 @@ export { WelcomeBanner } from './components/welcome-banner/WelcomeBanner';
|
|
|
46
46
|
export { default as safeDecodeURIComponent } from './utils/safeDecodeURIComponent';
|
|
47
47
|
export { ArticleSidebar } from './components/article-sidebar/ArticleSidebar';
|
|
48
48
|
export { FeaturesCarousel } from './components/features-carousel/FeaturesCarousel';
|
|
49
|
-
|
|
49
|
+
export { TwitterEmbed } from './components/twitter-embed/TwitterEmbed';
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEscUJBQXFCO0FBQ3JCLE9BQU8sRUFDTCxtQkFBbUIsRUFDbkIsZUFBZSxFQUNoQixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFFTCx1QkFBdUIsRUFDeEIsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3JCLE1BQU0scUVBQXFFLENBQUM7QUFDN0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQzVFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsWUFBWSxFQUNaLGNBQWMsRUFDZCxrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDcEIsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDeEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDeEUsT0FBTyxFQUNMLHFCQUFxQixFQUN0QixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFNUQsd0JBQXdCO0FBQ3hCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbkIsTUFBTSxpREFBaUQsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3JCLE1BQU0sbURBQW1ELENBQUM7QUFDM0QsT0FBTyxFQUNMLHFCQUFxQixFQUN0QixNQUFNLDRFQUE0RSxDQUFDO0FBRXBGLG1CQUFtQjtBQUNuQixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3JCLE1BQU0sMERBQTBELENBQUM7QUFFbEUsT0FBTyxFQUNMLDBCQUEwQixFQUMzQixNQUFNLHVFQUF1RSxDQUFDO0FBQy9FLE9BQU8sRUFDTCxvQkFBb0IsRUFDckIsTUFBTSwwREFBMEQsQ0FBQztBQUNsRSxPQUFPLEVBQ0wsOEJBQThCLEVBQy9CLE1BQU0sK0VBQStFLENBQUM7QUFDdkYsT0FBTyxFQUNMLHFCQUFxQixFQUN0QixNQUFNLDREQUE0RCxDQUFDO0FBQ3BFLE9BQU8sRUFDTCxtQkFBbUIsRUFDcEIsTUFBTSx3REFBd0QsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3ZCLE1BQU0sK0RBQStELENBQUM7QUFDdkUsT0FBTyxFQUNMLHVCQUF1QixFQUN4QixNQUFNLGlFQUFpRSxDQUFDO0FBRXpFLE9BQU8sRUFDTCxpQkFBaUIsRUFDbEIsTUFBTSxvREFBb0QsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ25CLE1BQU0sc0RBQXNELENBQUM7QUFDOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNqQixNQUFNLGtEQUFrRCxDQUFDO0FBQzFELE9BQU8sRUFDTCxtQkFBbUIsRUFDcEIsTUFBTSx5REFBeUQsQ0FBQztBQUVqRSw2QkFBNkI7QUFDN0IsT0FBTyxFQUNMLGdCQUFnQixFQUNqQixNQUFNLG9EQUFvRCxDQUFDO0FBRTVELFVBQVU7QUFDVixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUNMLGdCQUFnQixFQUNqQixNQUFNLCtDQUErQyxDQUFDO0FBRXZELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXZFLE9BQU8sRUFDTCxPQUFPLElBQUksYUFBYSxFQUN6QixNQUFNLDJDQUEyQyxDQUFDO0FBRW5ELE9BQU8sRUFDTCxnQkFBZ0IsRUFDakIsTUFBTSxpREFBaUQsQ0FBQztBQUV6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUNMLE9BQU8sSUFBSSxzQkFBc0IsRUFDbEMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDN0UsT0FBTyxFQUNMLGdCQUFnQixFQUNqQixNQUFNLGlEQUFpRCxDQUFDO0FBRXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@times-components/ts-components",
|
|
3
|
-
"version": "1.104.1-alpha.
|
|
3
|
+
"version": "1.104.1-alpha.33+253fffb890",
|
|
4
4
|
"description": "Reuseable Typescript React Components ",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"dev": "dist/index.js",
|
|
@@ -54,11 +54,12 @@
|
|
|
54
54
|
"@times-components/date-publication": "^0.30.34",
|
|
55
55
|
"@times-components/icons": "^2.22.12",
|
|
56
56
|
"@times-components/image": "^6.18.1",
|
|
57
|
+
"@times-components/interactive-wrapper": "^0.9.89",
|
|
57
58
|
"@times-components/link": "^3.17.34",
|
|
58
59
|
"@times-components/provider": "^1.41.4",
|
|
59
60
|
"@times-components/provider-queries": "^2.23.3",
|
|
60
|
-
"@times-components/related-articles": "^6.17.89-alpha.
|
|
61
|
-
"@times-components/ts-slices": "^1.9.
|
|
61
|
+
"@times-components/related-articles": "^6.17.89-alpha.33+253fffb890",
|
|
62
|
+
"@times-components/ts-slices": "^1.9.23",
|
|
62
63
|
"@times-components/ts-styleguide": "^1.50.34",
|
|
63
64
|
"@times-components/utils": "^6.26.0",
|
|
64
65
|
"algoliasearch": "4.9.0",
|
|
@@ -117,5 +118,5 @@
|
|
|
117
118
|
"@testing-library/jest-dom/extend-expect"
|
|
118
119
|
]
|
|
119
120
|
},
|
|
120
|
-
"gitHead": "
|
|
121
|
+
"gitHead": "253fffb8902eb98258e7e319adc615dce41b20e4"
|
|
121
122
|
}
|