@times-components/ts-components 1.146.2-784617dc4a33959b8795da1d7f425c9929322fae.24 → 1.146.2-e5795a0ef59e2adb61ba52aeb7332fda4405cb7a.4

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 (73) hide show
  1. package/dist/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.d.ts +10 -0
  2. package/dist/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.js +69 -0
  3. package/dist/components/opta/football/opta-match-stats/matchday-live/MobileWidget.d.ts +12 -0
  4. package/dist/components/opta/football/opta-match-stats/matchday-live/MobileWidget.js +90 -0
  5. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.d.ts +12 -0
  6. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.js +10 -0
  7. package/dist/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.js +24 -0
  8. package/dist/components/opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.js +57 -0
  9. package/dist/components/opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.d.ts +2 -0
  10. package/dist/components/opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.js +48 -0
  11. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.d.ts +1 -0
  12. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.js +19 -0
  13. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.d.ts +12 -0
  14. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.js +67 -0
  15. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.d.ts +6 -0
  16. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.js +736 -0
  17. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.d.ts +1 -0
  18. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.js +33 -0
  19. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.d.ts +1 -0
  20. package/dist/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.js +36 -0
  21. package/dist/components/opta/football/opta-match-stats/shared/styles.js +8 -1
  22. package/dist/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.js +2 -2
  23. package/dist/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.stories.js +1 -1
  24. package/dist/components/opta/football/opta-match-stats/summary/WidgetContainer.js +19 -5
  25. package/dist/index.d.ts +1 -1
  26. package/dist/index.js +2 -2
  27. package/package.json +3 -3
  28. package/rnw.js +1 -1
  29. package/src/components/opta/football/opta-match-stats/commentary/__tests__/__snapshots__/OptaMatchStatsCommentary.test.tsx.snap +1 -1
  30. package/src/components/opta/football/opta-match-stats/matchday-live/DesktopWidget.tsx +108 -0
  31. package/src/components/opta/football/opta-match-stats/matchday-live/MobileWidget.tsx +158 -0
  32. package/src/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.tsx +38 -0
  33. package/src/components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.tsx +23 -0
  34. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.tsx +69 -0
  35. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/OptaMatchStatsMatchdayLive.test.tsx +61 -0
  36. package/src/components/opta/football/opta-match-stats/matchday-live/__tests__/__snapshots__/OptaMatchStatsMatchdayLive.test.tsx.snap +61 -0
  37. package/src/components/opta/football/opta-match-stats/matchday-live/styles/MatchdayLiveController.tsx +19 -0
  38. package/src/components/opta/football/opta-match-stats/matchday-live/styles/NavigationWrapper.tsx +81 -0
  39. package/src/components/opta/football/opta-match-stats/matchday-live/styles/WidgetContainer.tsx +767 -0
  40. package/src/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/NavigationWrapper.test.tsx +67 -0
  41. package/src/components/opta/football/opta-match-stats/matchday-live/styles/__tests__/WidgetContainer.test.tsx +64 -0
  42. package/src/components/opta/football/opta-match-stats/shared/styles.ts +8 -0
  43. package/src/components/opta/football/opta-match-stats/stats-graphs/__tests__/__snapshots__/OptaMatchStatsGraphs.test.tsx.snap +1 -1
  44. package/src/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.stories.tsx +1 -1
  45. package/src/components/opta/football/opta-match-stats/summary/OptaMatchStatsSummary.tsx +1 -1
  46. package/src/components/opta/football/opta-match-stats/summary/WidgetContainer.tsx +18 -4
  47. package/src/components/opta/football/opta-match-stats/summary/__tests__/__snapshots__/OptaMatchStatsSummary.test.tsx.snap +1 -1
  48. package/src/index.ts +3 -1
  49. package/dist/components/travel-mini-cta/__tests__/index.test.js +0 -262
  50. package/dist/components/travel-mini-cta/index.d.ts +0 -10
  51. package/dist/components/travel-mini-cta/index.js +0 -93
  52. package/dist/components/travel-mini-cta/styles.d.ts +0 -42
  53. package/dist/components/travel-mini-cta/styles.js +0 -268
  54. package/dist/components/travel-mini-cta/travel-mini-cta.stories.js +0 -8
  55. package/dist/components/travel-mini-cta/types.d.ts +0 -10
  56. package/dist/components/travel-mini-cta/types.js +0 -2
  57. package/dist/utils/applyDarkMode.d.ts +0 -1
  58. package/dist/utils/applyDarkMode.js +0 -12
  59. package/dist/utils/getMediaQuery.d.ts +0 -11
  60. package/dist/utils/getMediaQuery.js +0 -19
  61. package/dist/utils/index.d.ts +0 -2
  62. package/dist/utils/index.js +0 -3
  63. package/src/components/travel-mini-cta/__tests__/__snapshots__/index.test.tsx.snap +0 -211
  64. package/src/components/travel-mini-cta/__tests__/index.test.tsx +0 -330
  65. package/src/components/travel-mini-cta/index.tsx +0 -190
  66. package/src/components/travel-mini-cta/styles.ts +0 -331
  67. package/src/components/travel-mini-cta/travel-mini-cta.stories.tsx +0 -23
  68. package/src/components/travel-mini-cta/types.ts +0 -10
  69. package/src/utils/applyDarkMode.ts +0 -12
  70. package/src/utils/getMediaQuery.ts +0 -25
  71. package/src/utils/index.ts +0 -2
  72. /package/dist/components/{travel-mini-cta/travel-mini-cta.stories.d.ts → opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive.stories.d.ts} +0 -0
  73. /package/dist/components/{travel-mini-cta/__tests__/index.test.d.ts → opta/football/opta-match-stats/matchday-live/__tests__/MobileWidget.test.d.ts} +0 -0
@@ -0,0 +1,67 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import { NavigationWrapper } from '../NavigationWrapper';
5
+
6
+ const HomeColour = { light: '#123456', dark: '#abcdef' };
7
+ const AwayColour = { light: '#654321', dark: '#fedcba' };
8
+
9
+ describe('Matchday Live NavigationWrapper', () => {
10
+ it('renders with active home', () => {
11
+ const { container } = render(
12
+ <NavigationWrapper
13
+ isApp={false}
14
+ activeTeam="home"
15
+ homeTeamColor={HomeColour}
16
+ awayTeamColor={AwayColour}
17
+ >
18
+ <div className="navigation-buttons">
19
+ <button className="active home">Home</button>
20
+ <button className="away">Away</button>
21
+ </div>
22
+ <div className="home-widget-container">Home widget</div>
23
+ <div className="away-widget-container">Away widget</div>
24
+ </NavigationWrapper>
25
+ );
26
+
27
+ expect(container.querySelector('.navigation-buttons')).toBeInTheDocument();
28
+ expect(
29
+ container.querySelector('.navigation-buttons .active.home')
30
+ ).toBeInTheDocument();
31
+ expect(
32
+ container.querySelector('.home-widget-container')
33
+ ).toBeInTheDocument();
34
+ expect(
35
+ container.querySelector('.away-widget-container')
36
+ ).toBeInTheDocument();
37
+ });
38
+
39
+ it('renders with active away and isApp true', () => {
40
+ const { container } = render(
41
+ <NavigationWrapper
42
+ isApp={true}
43
+ activeTeam="away"
44
+ homeTeamColor={HomeColour}
45
+ awayTeamColor={AwayColour}
46
+ >
47
+ <div className="navigation-buttons">
48
+ <button className="home">Home</button>
49
+ <button className="active away">Away</button>
50
+ </div>
51
+ <div className="home-widget-container">Home widget</div>
52
+ <div className="away-widget-container">Away widget</div>
53
+ </NavigationWrapper>
54
+ );
55
+
56
+ expect(container.querySelector('.navigation-buttons')).toBeInTheDocument();
57
+ expect(
58
+ container.querySelector('.navigation-buttons .active.away')
59
+ ).toBeInTheDocument();
60
+ expect(
61
+ container.querySelector('.home-widget-container')
62
+ ).toBeInTheDocument();
63
+ expect(
64
+ container.querySelector('.away-widget-container')
65
+ ).toBeInTheDocument();
66
+ });
67
+ });
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import { WidgetContainer } from '../WidgetContainer';
5
+
6
+ describe('Matchday Live WidgetContainer', () => {
7
+ const baseProps = {
8
+ isApp: true,
9
+ homeTeamColor: { light: '#000000', dark: '#a19c9cff' },
10
+ awayTeamColor: { light: '#007A3F', dark: '#007A3F' }
11
+ };
12
+
13
+ it('generates styles', () => {
14
+ const { container } = render(
15
+ <WidgetContainer {...baseProps}>
16
+ <div className="Opta">
17
+ <div className="Opta_W">content</div>
18
+ </div>
19
+ </WidgetContainer>
20
+ );
21
+ expect(container.querySelector('.Opta > .Opta_W')).toBeTruthy();
22
+ });
23
+
24
+ it('generates dark-mode styles under .Opta-Overlay .Opta-Flex', () => {
25
+ const { container } = render(
26
+ <WidgetContainer {...baseProps}>
27
+ <div className="Opta-Overlay">
28
+ <div className="Opta-Flex">flex</div>
29
+ </div>
30
+ </WidgetContainer>
31
+ );
32
+ expect(container.querySelector('.Opta-Overlay .Opta-Flex')).toBeTruthy();
33
+ });
34
+
35
+ it('applies home-widget-container styles', () => {
36
+ const { container } = render(
37
+ <WidgetContainer {...baseProps} className="home-widget-container">
38
+ <div className="Opta-MatchHeader">
39
+ <div className="Opta-Away">Away Team</div>
40
+ </div>
41
+ </WidgetContainer>
42
+ );
43
+ expect(
44
+ container.querySelector(
45
+ '.home-widget-container .Opta-MatchHeader .Opta-Away'
46
+ )
47
+ ).toBeTruthy();
48
+ });
49
+
50
+ it('applies away-widget-container styles', () => {
51
+ const { container } = render(
52
+ <WidgetContainer {...baseProps} className="away-widget-container">
53
+ <div className="Opta-MatchHeader">
54
+ <div className="Opta-Home">Home Team</div>
55
+ </div>
56
+ </WidgetContainer>
57
+ );
58
+ expect(
59
+ container.querySelector(
60
+ '.away-widget-container .Opta-MatchHeader .Opta-Home'
61
+ )
62
+ ).toBeTruthy();
63
+ });
64
+ });
@@ -54,5 +54,13 @@ export const WidgetWrapper = styled.div<{
54
54
  @media (max-width: ${maxMDBreakpoint}px) {
55
55
  display: none;
56
56
  }
57
+
58
+ ${props =>
59
+ props.isApp &&
60
+ `
61
+ @media(prefers-color-scheme: dark) {
62
+ color: ${darkTextColor} !important;
63
+ }
64
+ `}
57
65
  }
58
66
  `;
@@ -3,7 +3,7 @@
3
3
  exports[`OptaMatchStatsSummary should render correctly 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
- class="sc-bxivhb JyPwY"
6
+ class="sc-bxivhb dwwqvg"
7
7
  >
8
8
  <h3>
9
9
  Match Stats
@@ -26,7 +26,7 @@ const showcase = {
26
26
  <OptaMatchStatsSummary
27
27
  season="2025"
28
28
  competition="8"
29
- match="2561901"
29
+ match="2562044"
30
30
  isApp
31
31
  />
32
32
  </>
@@ -72,7 +72,7 @@ export const OptaMatchStatsSummary: React.FC<{
72
72
  show_competition_name: true,
73
73
  competition_naming: 'full',
74
74
  team_naming: 'full',
75
- player_naming: 'initial',
75
+ player_naming: 'last_name',
76
76
  show_live: false,
77
77
  show_logo: false,
78
78
  show_title: false
@@ -94,9 +94,14 @@ export const WidgetContainer = styled.div<{
94
94
  .Opta-Team {
95
95
  flex: 1;
96
96
  font-family: ${fonts.headline};
97
- font-size: 24px;
97
+ font-size: 20px;
98
98
  font-weight: 800;
99
99
  color: ${textColor};
100
+
101
+ @media (min-width: ${1024}px) {
102
+ font-size: 24px;
103
+ }
104
+
100
105
  ${props =>
101
106
  props.isApp &&
102
107
  `
@@ -316,14 +321,23 @@ export const WidgetContainer = styled.div<{
316
321
  display: flex;
317
322
  text-align: right;
318
323
  }
324
+
325
+ &.Opta-Home {
326
+ .Opta-Event-Player {
327
+ text-align: left;
328
+ }
329
+ }
330
+
331
+ &.Opta-Away {
332
+ .Opta-Event-Player {
333
+ text-align: right;
334
+ }
335
+ }
319
336
  }
320
337
 
321
338
  .Opta-Event-Text {
322
339
  display: flex;
323
340
  align-items: center;
324
- .Opta-Event-Player {
325
- text-align: left;
326
- }
327
341
 
328
342
  &.Opta-Home {
329
343
  li {
@@ -3,7 +3,7 @@
3
3
  exports[`OptaMatchStatsSummary should render correctly 1`] = `
4
4
  <DocumentFragment>
5
5
  <div
6
- class="sc-ifAKCX eIVfcL"
6
+ class="sc-ifAKCX hyetdF"
7
7
  />
8
8
  <div
9
9
  class="sc-bwzfXH eSqyJ"
package/src/index.ts CHANGED
@@ -32,7 +32,6 @@ export {
32
32
  } from './components/update-button/update-button-with-delay';
33
33
  export { Banner } from './components/banner/banner';
34
34
  export { JobTitle } from './components/job-title/job-title';
35
- export { TravelMiniCTA } from './components/travel-mini-cta';
36
35
 
37
36
  // Newsletter Components
38
37
  export {
@@ -153,3 +152,6 @@ export {
153
152
  export {
154
153
  OptaMatchStatsCommentary
155
154
  } from './components/opta/football/opta-match-stats/commentary/OptaMatchStatsCommentary';
155
+ export {
156
+ OptaMatchStatsMatchdayLive
157
+ } from './components/opta/football/opta-match-stats/matchday-live/OptaMatchStatsMatchdayLive';
@@ -1,262 +0,0 @@
1
- import React from 'react';
2
- import '@testing-library/jest-dom';
3
- import { render, screen, act, fireEvent, waitFor } from '@testing-library/react';
4
- import { TravelMiniCTA } from '../index';
5
- describe('TravelMiniCTA', () => {
6
- const defaultProps = {
7
- description: 'Begin your journey to Croatia with a holiday designed around you',
8
- phoneLabel: 'Call us on',
9
- phoneNumber: '08083049757',
10
- workingHours: ['Mon - Fri: 9am - 6pm', 'Sat: 10am - 5pm'],
11
- primaryButtonText: 'Chat with us',
12
- secondaryButtonText: 'Enquire now',
13
- secondaryButtonUrl: '/enquire'
14
- };
15
- let mockObserve;
16
- let mockDisconnect;
17
- let mutationCallback;
18
- beforeEach(() => {
19
- jest.clearAllMocks();
20
- jest.useFakeTimers();
21
- // Mock MutationObserver
22
- mockObserve = jest.fn();
23
- mockDisconnect = jest.fn();
24
- const MockMutationObserver = jest.fn((callback) => {
25
- mutationCallback = callback;
26
- const observer = {
27
- observe: mockObserve,
28
- disconnect: mockDisconnect,
29
- takeRecords: jest.fn()
30
- };
31
- return observer;
32
- });
33
- global.MutationObserver = MockMutationObserver;
34
- // Mock lpTag
35
- global.lpTag = {
36
- newPage: jest.fn()
37
- };
38
- });
39
- afterEach(() => {
40
- jest.runOnlyPendingTimers();
41
- jest.useRealTimers();
42
- delete global.lpTag;
43
- });
44
- it('should render with all props', () => {
45
- const { container } = render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
46
- expect(container).toMatchSnapshot();
47
- });
48
- it('should render the logo with "T" text', () => {
49
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
50
- expect(screen.getByText('T')).toBeInTheDocument();
51
- });
52
- it('should render the label "VISIT TIMES HOLIDAYS"', () => {
53
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
54
- const labels = screen.getAllByText('VISIT TIMES HOLIDAYS');
55
- expect(labels.length).toBe(2); // Desktop and mobile labels
56
- });
57
- it('should render the description', () => {
58
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
59
- expect(screen.getByText(defaultProps.description)).toBeInTheDocument();
60
- });
61
- it('should render phone label and number', () => {
62
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
63
- expect(screen.getByText('Call us on')).toBeInTheDocument();
64
- expect(screen.getByText('08083049757')).toBeInTheDocument();
65
- });
66
- it('should render phone number as a tel link', () => {
67
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
68
- const phoneLink = screen.getByText('Call us on').closest('a');
69
- expect(phoneLink).toHaveAttribute('href', 'tel:08083049757');
70
- });
71
- it('should render working hours', () => {
72
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
73
- expect(screen.getByText('Mon - Fri: 9am - 6pm')).toBeInTheDocument();
74
- expect(screen.getByText('Sat: 10am - 5pm')).toBeInTheDocument();
75
- });
76
- it('should render primary button with loading text initially', () => {
77
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
78
- expect(screen.getByText('Loading chat...')).toBeInTheDocument();
79
- });
80
- it('should render secondary button with correct text and URL', () => {
81
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
82
- const secondaryButton = screen.getByText('Enquire now');
83
- expect(secondaryButton).toBeInTheDocument();
84
- });
85
- it('should render with minimal props', () => {
86
- render(React.createElement(TravelMiniCTA, null));
87
- expect(screen.getByTestId('travel-mini-cta')).toBeInTheDocument();
88
- });
89
- it('should render without working hours if not provided', () => {
90
- const propsWithoutWorkingHours = {
91
- ...defaultProps,
92
- workingHours: undefined
93
- };
94
- render(React.createElement(TravelMiniCTA, Object.assign({}, propsWithoutWorkingHours)));
95
- expect(screen.queryByText('Mon - Fri: 9am - 6pm')).not.toBeInTheDocument();
96
- });
97
- it('should render empty working hours array', () => {
98
- const propsWithEmptyWorkingHours = {
99
- ...defaultProps,
100
- workingHours: []
101
- };
102
- const { container } = render(React.createElement(TravelMiniCTA, Object.assign({}, propsWithEmptyWorkingHours)));
103
- expect(container.querySelector('[data-testid="travel-mini-cta"]')).toBeInTheDocument();
104
- });
105
- it('should render with custom description', () => {
106
- const customDescription = 'Explore the world with our expert guidance';
107
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps, { description: customDescription })));
108
- expect(screen.getByText(customDescription)).toBeInTheDocument();
109
- });
110
- it('should render with custom phone details', () => {
111
- const customProps = {
112
- ...defaultProps,
113
- phoneLabel: 'Contact us at',
114
- phoneNumber: '0123456789'
115
- };
116
- render(React.createElement(TravelMiniCTA, Object.assign({}, customProps)));
117
- expect(screen.getByText('Contact us at')).toBeInTheDocument();
118
- expect(screen.getByText('0123456789')).toBeInTheDocument();
119
- });
120
- it('should have correct container test id', () => {
121
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
122
- expect(screen.getByTestId('travel-mini-cta')).toBeInTheDocument();
123
- });
124
- it('should render with isApp prop', () => {
125
- const { container } = render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps, { isApp: true })));
126
- expect(container).toMatchSnapshot();
127
- });
128
- it('should pass isApp prop to styled components', () => {
129
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps, { isApp: true })));
130
- const container = screen.getByTestId('travel-mini-cta');
131
- expect(container).toBeInTheDocument();
132
- });
133
- describe('LivePerson Chat Integration', () => {
134
- it('should render LivePerson container div with correct ID', () => {
135
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
136
- const chatDiv = document.getElementById('LP_DIV_TRAVEL_1239001');
137
- expect(chatDiv).toBeInTheDocument();
138
- });
139
- it('should show loading text initially', () => {
140
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
141
- expect(screen.getByText('Loading chat...')).toBeInTheDocument();
142
- });
143
- it('should setup MutationObserver on mount', () => {
144
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
145
- expect(global.MutationObserver).toHaveBeenCalled();
146
- expect(mockObserve).toHaveBeenCalledWith(expect.any(HTMLElement), {
147
- childList: true,
148
- subtree: true
149
- });
150
- });
151
- it('should set chat ready when LivePerson element is detected', async () => {
152
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
153
- // Simulate LivePerson injecting the chat element
154
- const chatDiv = document.getElementById('LP_DIV_TRAVEL_1239001');
155
- const lpElement = document.createElement('div');
156
- lpElement.setAttribute('data-lp-event', 'click');
157
- lpElement.textContent = 'Chat';
158
- chatDiv && chatDiv.appendChild(lpElement);
159
- // Trigger the mutation observer callback
160
- const observer = {
161
- observe: mockObserve,
162
- disconnect: mockDisconnect,
163
- takeRecords: jest.fn()
164
- };
165
- act(() => {
166
- mutationCallback([], observer);
167
- });
168
- await waitFor(() => {
169
- expect(screen.queryByText('Loading chat...')).not.toBeInTheDocument();
170
- });
171
- });
172
- it('should clear timeout when chat loads successfully', async () => {
173
- const clearTimeoutSpy = jest.spyOn(global, 'clearTimeout');
174
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
175
- const chatDiv = document.getElementById('LP_DIV_TRAVEL_1239001');
176
- const lpElement = document.createElement('div');
177
- lpElement.setAttribute('data-lp-event', 'click');
178
- chatDiv && chatDiv.appendChild(lpElement);
179
- const observer = {
180
- observe: mockObserve,
181
- disconnect: mockDisconnect,
182
- takeRecords: jest.fn()
183
- };
184
- act(() => {
185
- mutationCallback([], observer);
186
- });
187
- await waitFor(() => {
188
- expect(clearTimeoutSpy).toHaveBeenCalled();
189
- });
190
- // Timeout should not fire
191
- act(() => {
192
- jest.advanceTimersByTime(15000);
193
- });
194
- expect(screen.queryByText('Chat unavailable')).not.toBeInTheDocument();
195
- clearTimeoutSpy.mockRestore();
196
- });
197
- it('should disconnect observer on unmount', () => {
198
- const { unmount } = render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
199
- unmount();
200
- expect(mockDisconnect).toHaveBeenCalled();
201
- });
202
- it('should clear timeout on unmount', () => {
203
- const clearTimeoutSpy = jest.spyOn(global, 'clearTimeout');
204
- const { unmount } = render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
205
- unmount();
206
- expect(clearTimeoutSpy).toHaveBeenCalled();
207
- clearTimeoutSpy.mockRestore();
208
- });
209
- it('should trigger LivePerson element click when primary button is clicked', async () => {
210
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
211
- // Simulate chat loaded
212
- const chatDiv = document.getElementById('LP_DIV_TRAVEL_1239001');
213
- const lpElement = document.createElement('button');
214
- lpElement.setAttribute('data-lp-event', 'click');
215
- // Mock click on the LivePerson element
216
- const lpClickSpy = jest.fn();
217
- lpElement.onclick = lpClickSpy;
218
- chatDiv && chatDiv.appendChild(lpElement);
219
- const observer = {
220
- observe: mockObserve,
221
- disconnect: mockDisconnect,
222
- takeRecords: jest.fn()
223
- };
224
- act(() => {
225
- mutationCallback([], observer);
226
- });
227
- await waitFor(() => {
228
- expect(screen.queryByText('Loading chat...')).not.toBeInTheDocument();
229
- });
230
- // Get and click the primary button
231
- const parentElement = chatDiv ? chatDiv.parentElement : null;
232
- if (parentElement instanceof HTMLButtonElement) {
233
- fireEvent.click(parentElement);
234
- expect(lpClickSpy).toHaveBeenCalled();
235
- }
236
- });
237
- it('should handle button click without errors when chat is ready', async () => {
238
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
239
- const chatDiv = document.getElementById('LP_DIV_TRAVEL_1239001');
240
- const lpElement = document.createElement('button');
241
- lpElement.setAttribute('data-lp-event', 'click');
242
- chatDiv && chatDiv.appendChild(lpElement);
243
- const observer = {
244
- observe: mockObserve,
245
- disconnect: mockDisconnect,
246
- takeRecords: jest.fn()
247
- };
248
- act(() => {
249
- mutationCallback([], observer);
250
- });
251
- await waitFor(() => {
252
- expect(screen.queryByText('Loading chat...')).not.toBeInTheDocument();
253
- });
254
- // Click button should not throw error
255
- const parentElement = chatDiv ? chatDiv.parentElement : null;
256
- if (parentElement instanceof HTMLButtonElement) {
257
- expect(() => fireEvent.click(parentElement)).not.toThrow();
258
- }
259
- });
260
- });
261
- });
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RyYXZlbC1taW5pLWN0YS9fX3Rlc3RzX18vaW5kZXgudGVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sR0FBRyxFQUNILFNBQVMsRUFDVCxPQUFPLEVBQ1IsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO0lBQzdCLE1BQU0sWUFBWSxHQUFHO1FBQ25CLFdBQVcsRUFDVCxrRUFBa0U7UUFDcEUsVUFBVSxFQUFFLFlBQVk7UUFDeEIsV0FBVyxFQUFFLGFBQWE7UUFDMUIsWUFBWSxFQUFFLENBQUMsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUM7UUFDekQsaUJBQWlCLEVBQUUsY0FBYztRQUNqQyxtQkFBbUIsRUFBRSxhQUFhO1FBQ2xDLGtCQUFrQixFQUFFLFVBQVU7S0FDL0IsQ0FBQztJQUVGLElBQUksV0FBc0IsQ0FBQztJQUMzQixJQUFJLGNBQXlCLENBQUM7SUFDOUIsSUFBSSxnQkFBa0MsQ0FBQztJQUV2QyxVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQix3QkFBd0I7UUFDeEIsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN4QixjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBRTNCLE1BQU0sb0JBQW9CLEdBQTRCLElBQUksQ0FBQyxFQUFFLENBQzNELENBQUMsUUFBMEIsRUFBRSxFQUFFO1lBQzdC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
@@ -1,10 +0,0 @@
1
- import { FC } from 'react';
2
- import { TravelMiniCTAProps } from './types';
3
- declare global {
4
- interface Window {
5
- lpTag?: {
6
- [key: string]: any;
7
- };
8
- }
9
- }
10
- export declare const TravelMiniCTA: FC<TravelMiniCTAProps>;
@@ -1,93 +0,0 @@
1
- import React, { useEffect, useState, useRef } from 'react';
2
- import { Container, ContentWrapper, LeftSection, LogoContainer, LogoBox, LogoText, TextContainer, Label, MobileLabel, Description, RightSection, ContactInfo, PhoneLabel, PhoneNumber, WorkingHoursContainer, WorkingHoursText, ButtonsContainer, PrimaryButton, SecondaryButton } from './styles';
3
- export const TravelMiniCTA = ({ description, phoneLabel, phoneNumber, workingHours, primaryButtonText, secondaryButtonText, secondaryButtonUrl, isApp }) => {
4
- const [chatReady, setChatReady] = useState(false);
5
- const [chatFailed, setChatFailed] = useState(false);
6
- const [buttonText, setButtonText] = useState('Loading chat...');
7
- const chatDivRef = useRef(null);
8
- const timeoutRef = useRef(null);
9
- const observerRef = useRef(null);
10
- const handlePrimaryButtonClick = (e) => {
11
- e.preventDefault();
12
- const chatDiv = chatDivRef.current;
13
- if (chatDiv) {
14
- const lpEventElement = chatDiv.querySelector('[data-lp-event]');
15
- if (lpEventElement) {
16
- lpEventElement.click();
17
- }
18
- }
19
- };
20
- useEffect(() => {
21
- if (typeof window === 'undefined') {
22
- return;
23
- }
24
- const cleanup = () => {
25
- if (timeoutRef.current) {
26
- clearTimeout(timeoutRef.current);
27
- timeoutRef.current = null;
28
- }
29
- if (observerRef.current) {
30
- observerRef.current.disconnect();
31
- observerRef.current = null;
32
- }
33
- };
34
- const handleChatReady = () => {
35
- cleanup();
36
- setChatReady(true);
37
- setChatFailed(false);
38
- setButtonText(primaryButtonText || 'Chat with us');
39
- };
40
- const handleChatFailed = () => {
41
- cleanup();
42
- setChatReady(false);
43
- setChatFailed(true);
44
- setButtonText('Call us');
45
- };
46
- // Check if LivePerson is already loaded
47
- if (window.lpTag && window.lpTag.loaded) {
48
- handleChatReady();
49
- return cleanup;
50
- }
51
- // Set up MutationObserver to detect when LivePerson loads
52
- const chatDiv = chatDivRef.current;
53
- if (!chatDiv) {
54
- return cleanup;
55
- }
56
- observerRef.current = new MutationObserver(() => {
57
- const lpEventElement = chatDiv.querySelector('[data-lp-event]');
58
- if (lpEventElement) {
59
- handleChatReady();
60
- }
61
- });
62
- observerRef.current.observe(chatDiv, {
63
- childList: true,
64
- subtree: true
65
- });
66
- // Fallback: If LivePerson doesn't load in 15s, show "Call us"
67
- timeoutRef.current = setTimeout(handleChatFailed, 15000);
68
- return cleanup;
69
- }, [primaryButtonText]);
70
- return (React.createElement(Container, { "data-testid": "travel-mini-cta", isApp: isApp },
71
- React.createElement(ContentWrapper, null,
72
- React.createElement(LeftSection, null,
73
- React.createElement(LogoContainer, null,
74
- React.createElement(LogoBox, { isApp: isApp },
75
- React.createElement(LogoText, { isApp: isApp }, "T")),
76
- React.createElement(MobileLabel, { isApp: isApp }, "TIMES HOLIDAYS")),
77
- React.createElement(TextContainer, null,
78
- React.createElement(Label, { isApp: isApp }, "TIMES HOLIDAYS"),
79
- React.createElement(Description, { isApp: isApp }, description))),
80
- React.createElement(RightSection, null,
81
- React.createElement(ContactInfo, null,
82
- React.createElement(PhoneLabel, { href: `tel:${phoneNumber}`, isApp: isApp },
83
- phoneLabel,
84
- ' ',
85
- React.createElement(PhoneNumber, { isApp: isApp }, phoneNumber)),
86
- React.createElement(WorkingHoursContainer, null, workingHours &&
87
- workingHours.map((hours, index) => (React.createElement(WorkingHoursText, { key: index, isApp: isApp }, hours))))),
88
- React.createElement(ButtonsContainer, null,
89
- chatFailed ? (React.createElement(PrimaryButton, { as: "a", href: `tel:${phoneNumber}`, isApp: isApp }, buttonText)) : (React.createElement(PrimaryButton, { as: "button", type: "button", onClick: handlePrimaryButtonClick, isApp: isApp, disabled: !chatReady }, buttonText)),
90
- React.createElement("div", { id: "LP_DIV_TRAVEL_1239001", ref: chatDivRef, style: { display: 'none' } }),
91
- React.createElement(SecondaryButton, { href: secondaryButtonUrl, isApp: isApp }, secondaryButtonText))))));
92
- };
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy90cmF2ZWwtbWluaS1jdGEvaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQWtCLE1BQU0sT0FBTyxDQUFDO0FBRTNFLE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxFQUNkLFdBQVcsRUFDWCxhQUFhLEVBQ2IsT0FBTyxFQUNQLFFBQVEsRUFDUixhQUFhLEVBQ2IsS0FBSyxFQUNMLFdBQVcsRUFDWCxXQUFXLEVBQ1gsWUFBWSxFQUNaLFdBQVcsRUFDWCxVQUFVLEVBQ1YsV0FBVyxFQUNYLHFCQUFxQixFQUNyQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixlQUFlLEVBQ2hCLE1BQU0sVUFBVSxDQUFDO0FBV2xCLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBMkIsQ0FBQyxFQUNwRCxXQUFXLEVBQ1gsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsS0FBSyxFQUNOLEVBQUUsRUFBRTtJQUNILE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDaEUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQXdCLElBQUksQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FB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