@times-components/ts-components 1.146.2-52fb3513ac253011b85740aa1f70a12f27281c4e.28 → 1.146.2-63663ce01bc48c5c40f3f9affcb75ec88314b196.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 (48) hide show
  1. package/dist/components/social-embed/SocialMediaEmbed.js +97 -15
  2. package/dist/components/social-embed/SocialVendor.d.ts +1 -16
  3. package/dist/components/social-embed/SocialVendor.js +41 -2
  4. package/dist/components/social-embed/__tests__/SocialVendor.test.js +8 -1
  5. package/dist/components/social-embed/components/FacebookComponent.d.ts +6 -0
  6. package/dist/components/social-embed/components/FacebookComponent.js +74 -0
  7. package/dist/components/social-embed/constants.d.ts +1 -0
  8. package/dist/components/social-embed/constants.js +3 -2
  9. package/dist/components/social-embed/helpers/socialMediaVendors.js +6 -1
  10. package/dist/components/social-embed/styles.d.ts +1 -0
  11. package/dist/components/social-embed/styles.js +28 -1
  12. package/dist/index.d.ts +0 -1
  13. package/dist/index.js +1 -2
  14. package/package.json +3 -3
  15. package/rnw.js +1 -1
  16. package/src/components/social-embed/SocialMediaEmbed.tsx +84 -1
  17. package/src/components/social-embed/SocialVendor.tsx +46 -1
  18. package/src/components/social-embed/__tests__/SocialVendor.test.tsx +11 -0
  19. package/src/components/social-embed/components/FacebookComponent.tsx +93 -0
  20. package/src/components/social-embed/constants.ts +2 -1
  21. package/src/components/social-embed/helpers/socialMediaVendors.ts +5 -0
  22. package/src/components/social-embed/styles.ts +30 -0
  23. package/src/index.ts +0 -1
  24. package/dist/components/travel-mini-cta/__tests__/index.test.d.ts +0 -1
  25. package/dist/components/travel-mini-cta/__tests__/index.test.js +0 -262
  26. package/dist/components/travel-mini-cta/index.d.ts +0 -10
  27. package/dist/components/travel-mini-cta/index.js +0 -93
  28. package/dist/components/travel-mini-cta/styles.d.ts +0 -45
  29. package/dist/components/travel-mini-cta/styles.js +0 -293
  30. package/dist/components/travel-mini-cta/travel-mini-cta.stories.d.ts +0 -1
  31. package/dist/components/travel-mini-cta/travel-mini-cta.stories.js +0 -9
  32. package/dist/components/travel-mini-cta/types.d.ts +0 -11
  33. package/dist/components/travel-mini-cta/types.js +0 -2
  34. package/dist/utils/applyDarkMode.d.ts +0 -1
  35. package/dist/utils/applyDarkMode.js +0 -12
  36. package/dist/utils/getMediaQuery.d.ts +0 -11
  37. package/dist/utils/getMediaQuery.js +0 -19
  38. package/dist/utils/index.d.ts +0 -2
  39. package/dist/utils/index.js +0 -3
  40. package/src/components/travel-mini-cta/__tests__/__snapshots__/index.test.tsx.snap +0 -211
  41. package/src/components/travel-mini-cta/__tests__/index.test.tsx +0 -330
  42. package/src/components/travel-mini-cta/index.tsx +0 -191
  43. package/src/components/travel-mini-cta/styles.ts +0 -359
  44. package/src/components/travel-mini-cta/travel-mini-cta.stories.tsx +0 -24
  45. package/src/components/travel-mini-cta/types.ts +0 -11
  46. package/src/utils/applyDarkMode.ts +0 -12
  47. package/src/utils/getMediaQuery.ts +0 -25
  48. package/src/utils/index.ts +0 -2
@@ -1,4 +1,4 @@
1
- import React, { FC, useEffect } from 'react';
1
+ /* import React, { FC, useEffect } from 'react';
2
2
  import { BlockedEmbedMessage } from './BlockedEmbedMessage';
3
3
  import { checkVendorConsent } from './helpers/vendorConsent';
4
4
  import { eventStatus } from './constants';
@@ -74,3 +74,86 @@ export const SocialMediaEmbed: FC<SocialMediaEmbedProps> = ({
74
74
  <BlockedEmbedMessage vendorName={vendorName} />
75
75
  );
76
76
  };
77
+ */
78
+
79
+ import React, { FC, useEffect } from 'react';
80
+ import { BlockedEmbedMessage } from './BlockedEmbedMessage';
81
+ import { checkVendorConsent } from './helpers/vendorConsent';
82
+ import { eventStatus } from './constants';
83
+ import { TcData, VendorName } from './types';
84
+ import { useSocialEmbedsContext } from '../../contexts/SocialEmbedsProvider';
85
+ import { Vendor } from './SocialVendor';
86
+
87
+ declare global {
88
+ interface Window {
89
+ __tcfapi?: (
90
+ command: string,
91
+ version: number,
92
+ callback: (data: TcData, success: boolean) => void,
93
+ listenerId?: number
94
+ ) => void;
95
+ twttr?: {
96
+ widgets: {
97
+ load: (element?: HTMLElement) => void;
98
+ };
99
+ };
100
+ instgrm?: {
101
+ Embeds?: {
102
+ process: () => void;
103
+ };
104
+ };
105
+ }
106
+ }
107
+
108
+ export type SocialMediaEmbedProps = {
109
+ element?: any;
110
+ url: string;
111
+ vendorName: VendorName;
112
+ id: string;
113
+ };
114
+
115
+ export const SocialMediaEmbed: FC<SocialMediaEmbedProps> = ({
116
+ id,
117
+ url,
118
+ vendorName
119
+ }) => {
120
+ const {
121
+ setIsSocialEmbedAllowed,
122
+ isAllowedOnce,
123
+ isSocialEmbedAllowed
124
+ } = useSocialEmbedsContext();
125
+
126
+ useEffect(() => {
127
+ if (!window.__tcfapi) return;
128
+
129
+ // Listen to CMP consent updates
130
+ window.__tcfapi('addEventListener', 2, (_tcData: TcData, success: boolean) => {
131
+ if (
132
+ !success ||
133
+ _tcData.eventStatus === eventStatus.tcLoaded ||
134
+ _tcData.eventStatus === eventStatus.userActionComplete
135
+ ) {
136
+ // Use old checkVendorConsent function
137
+ const consent = checkVendorConsent(vendorName);
138
+
139
+ setIsSocialEmbedAllowed(prev => ({
140
+ ...prev,
141
+ [vendorName]: consent
142
+ }));
143
+ }
144
+ });
145
+ }, [vendorName, setIsSocialEmbedAllowed]);
146
+
147
+ // Only render the social component if consent or allowed once
148
+ const allowed =
149
+ isSocialEmbedAllowed[vendorName] === true ||
150
+ isAllowedOnce[vendorName] === true;
151
+
152
+ return allowed ? (
153
+ <div id={id}>
154
+ <Vendor vendorName={vendorName} url={url} />
155
+ </div>
156
+ ) : (
157
+ <BlockedEmbedMessage vendorName={vendorName} />
158
+ );
159
+ };
@@ -3,12 +3,56 @@ import { Twitter } from './components/TwitterComponent';
3
3
  import { Youtube } from './components/YoutubeComponent';
4
4
  import { TikTok } from './components/TiktokComponent';
5
5
  import { Instagram } from './components/InstagramComponent';
6
+ import { Facebook } from './components/FacebookComponent';
7
+ import { useSocialEmbedsContext } from '../../contexts/SocialEmbedsProvider';
8
+ import { BlockedEmbedMessage } from './BlockedEmbedMessage';
9
+ import { VendorName } from './types';
6
10
 
7
11
  const vendors = {
8
12
  twitter: Twitter,
9
13
  youtube: Youtube,
10
14
  tiktok: TikTok,
11
- instagram: Instagram
15
+ instagram: Instagram,
16
+ facebook: Facebook
17
+ };
18
+
19
+
20
+ export const Vendor = ({
21
+ vendorName,
22
+ url
23
+ }: {
24
+ vendorName: VendorName;
25
+ url: string;
26
+ }) => {
27
+ const { isSocialEmbedAllowed, isAllowedOnce } = useSocialEmbedsContext();
28
+
29
+ // Step 2: Only mount the actual social vendor component after consent
30
+ const allowed =
31
+ isSocialEmbedAllowed[vendorName] === true ||
32
+ isAllowedOnce[vendorName] === true;
33
+
34
+
35
+ if (!allowed && ['instagram', 'twitter', 'facebook'].includes(vendorName)) {
36
+ return <BlockedEmbedMessage vendorName={vendorName as VendorName} />;
37
+ }
38
+
39
+ const Component = vendors[vendorName];
40
+ return <Component url={url} />;
41
+ };
42
+
43
+ /* import React from 'react';
44
+ import { Twitter } from './components/TwitterComponent';
45
+ import { Youtube } from './components/YoutubeComponent';
46
+ import { TikTok } from './components/TiktokComponent';
47
+ import { Instagram } from './components/InstagramComponent';
48
+ import { Facebook } from './components/FacebookComponent';
49
+
50
+ const vendors = {
51
+ twitter: Twitter,
52
+ youtube: Youtube,
53
+ tiktok: TikTok,
54
+ instagram: Instagram,
55
+ facebook: Facebook
12
56
  };
13
57
 
14
58
  export type VendorName = keyof typeof vendors;
@@ -23,3 +67,4 @@ export const Vendor = ({
23
67
  const Component = vendors[vendorName];
24
68
  return <Component url={url} />;
25
69
  };
70
+ */
@@ -29,6 +29,12 @@ jest.mock('../components/InstagramComponent', () => ({
29
29
  ))
30
30
  }));
31
31
 
32
+ jest.mock('../components/FacebookComponent', () => ({
33
+ Facebook: jest.fn(() => (
34
+ <div data-testid="facebook-component">Facebook Component</div>
35
+ ))
36
+ }));
37
+
32
38
  describe('Vendor Component', () => {
33
39
  const renderVendor = (vendorName: VendorName, url: string) =>
34
40
  render(<Vendor vendorName={vendorName} url={url} />);
@@ -56,6 +62,11 @@ describe('Vendor Component', () => {
56
62
  expect(screen.getByTestId('instagram-component')).toBeInTheDocument();
57
63
  });
58
64
 
65
+ it('renders the Facebook component when vendorName is "facebook"', () => {
66
+ renderVendor('facebook' as VendorName, 'https://facebook.com/some/video');
67
+ expect(screen.getByTestId('facebook-component')).toBeInTheDocument();
68
+ });
69
+
59
70
  it('throws an error if an invalid vendorName is provided', () => {
60
71
  const renderInvalidVendor = () =>
61
72
  render(
@@ -0,0 +1,93 @@
1
+ import React, { useEffect } from "react";
2
+ import { FacebookContainer } from "../styles";
3
+ import { useSocialEmbedsContext } from "../../../contexts/SocialEmbedsProvider";
4
+
5
+
6
+ interface FacebookProps {
7
+ url: string;
8
+ }
9
+
10
+ export const Facebook: React.FC<FacebookProps> = ({ url }) => {
11
+ const { isSocialEmbedAllowed, isAllowedOnce } = useSocialEmbedsContext();
12
+
13
+ // Only render and load SDK if consent is given
14
+ const allowed =
15
+ isSocialEmbedAllowed.facebook === true || isAllowedOnce.facebook === true;
16
+
17
+ useEffect(() => {
18
+ if (!allowed) return; // Don't load SDK if user hasn't consented
19
+
20
+ // Create fb-root only once
21
+ if (!document.getElementById("fb-root")) {
22
+ const fbRoot = document.createElement("div");
23
+ fbRoot.id = "fb-root";
24
+ document.body.appendChild(fbRoot);
25
+ }
26
+
27
+ // Load SDK only once
28
+ if (!(window as any).FB) {
29
+ const script = document.createElement("script");
30
+ script.src =
31
+ "https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v18.0";
32
+ script.async = true;
33
+ script.defer = true;
34
+ script.crossOrigin = "anonymous";
35
+ document.body.appendChild(script);
36
+ } else {
37
+ // Re-parse if SDK already loaded
38
+ (window as any).FB.XFBML.parse();
39
+ }
40
+ }, [allowed]); // Re-run if consent changes
41
+
42
+ if (!allowed) {
43
+ return null; // Block rendering if no consent
44
+ }
45
+
46
+ return (
47
+ <FacebookContainer
48
+ className="fb-post"
49
+ data-href={url}
50
+ data-width="500"
51
+ data-show-text="true"
52
+ />
53
+ );
54
+ };
55
+
56
+ /* import React, { useEffect } from 'react';
57
+ import { FacebookContainer } from '../styles';
58
+ import { Placeholder } from '@times-components/image';
59
+
60
+ export const Facebook = ({ url }: { url: string }) => {
61
+ useEffect(() => {
62
+ if (!document.getElementById('fb-root')) {
63
+ const fbRoot = document.createElement('div');
64
+ fbRoot.id = 'fb-root';
65
+ document.body.appendChild(fbRoot);
66
+ }
67
+
68
+ // Load SDK only once
69
+ if (!(window as any).FB) {
70
+ const script = document.createElement('script');
71
+ script.src = 'https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v18.0';
72
+ script.async = true;
73
+ script.defer = true;
74
+ script.crossOrigin = 'anonymous';
75
+ document.body.appendChild(script);
76
+ } else {
77
+ // If SDK already loaded, re-parse
78
+ (window as any).FB.XFBML.parse();
79
+ }
80
+ }, []);
81
+
82
+ return (
83
+ <FacebookContainer
84
+ className="fb-post"
85
+ data-href={url}
86
+ data-width="500"
87
+ data-show-text="true"
88
+ >
89
+ <Placeholder />
90
+ </FacebookContainer>
91
+ );
92
+ }; */
93
+
@@ -11,5 +11,6 @@ export const eventStatus = {
11
11
 
12
12
  export const vendors = {
13
13
  instagram: 'instagram',
14
- twitter: 'twitter'
14
+ twitter: 'twitter',
15
+ facebook: 'facebook'
15
16
  } as const;
@@ -20,5 +20,10 @@ export const socialMediaVendors: {
20
20
  id: '5e717c8e69966540e4554f05',
21
21
  status: 'pending',
22
22
  title: 'Instagram'
23
+ },
24
+ facebook: {
25
+ id: '5e8dj207kee725du372h892',
26
+ status: 'pending',
27
+ title: 'Facebook'
23
28
  }
24
29
  };
@@ -96,3 +96,33 @@ export const InstagramContainer = styled.blockquote`
96
96
  width: calc(100% - 2px);
97
97
  position: relative;
98
98
  `;
99
+
100
+
101
+ export const FacebookContainer = styled.div`
102
+ width: 100%;
103
+ max-width: 540px;
104
+ margin: 24px auto;
105
+
106
+ background: #ffffff;
107
+ border: 1px solid #dadde1;
108
+ border-radius: 8px;
109
+
110
+ min-height: 200px;
111
+
112
+ display: flex;
113
+ justify-content: center;
114
+ align-items: center;
115
+
116
+ iframe {
117
+ width: 100% !important;
118
+ border: none;
119
+ overflow: hidden;
120
+ }
121
+
122
+ span,
123
+ .fb-post,
124
+ .fb-video {
125
+ width: 100% !important;
126
+ }
127
+ `;
128
+
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 {
@@ -1 +0,0 @@
1
- import '@testing-library/jest-dom';
@@ -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 "TIMES HOLIDAYS"', () => {
53
- render(React.createElement(TravelMiniCTA, Object.assign({}, defaultProps)));
54
- const labels = screen.getAllByText('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>;