@times-components/ts-components 1.112.1 → 1.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/components/social-embed/BlockedEmbedMessage.d.ts +6 -0
  3. package/dist/components/social-embed/BlockedEmbedMessage.js +39 -0
  4. package/dist/components/social-embed/SocialMediaEmbed.d.ts +19 -0
  5. package/dist/components/social-embed/SocialMediaEmbed.js +27 -0
  6. package/dist/components/social-embed/SocialVendor.d.ts +17 -0
  7. package/dist/components/social-embed/SocialVendor.js +14 -0
  8. package/dist/components/social-embed/__tests__/BlockedEmbedMessage.test.d.ts +1 -0
  9. package/dist/components/social-embed/__tests__/BlockedEmbedMessage.test.js +70 -0
  10. package/dist/components/social-embed/__tests__/SocialMediaEmbed.test.d.ts +1 -0
  11. package/dist/components/social-embed/__tests__/SocialMediaEmbed.test.js +99 -0
  12. package/dist/components/social-embed/__tests__/SocialVendor.test.d.ts +1 -0
  13. package/dist/components/social-embed/__tests__/SocialVendor.test.js +34 -0
  14. package/dist/components/social-embed/components/TiktokComponent.d.ts +3 -0
  15. package/dist/components/social-embed/components/TiktokComponent.js +17 -0
  16. package/dist/components/social-embed/components/TwitterComponent.d.ts +3 -0
  17. package/dist/components/social-embed/components/TwitterComponent.js +6 -0
  18. package/dist/components/social-embed/components/YoutubeComponent.d.ts +3 -0
  19. package/dist/components/social-embed/components/YoutubeComponent.js +5 -0
  20. package/dist/components/social-embed/components/__tests__/TiktokComponent.test.d.ts +1 -0
  21. package/dist/components/social-embed/components/__tests__/TiktokComponent.test.js +36 -0
  22. package/dist/components/social-embed/components/__tests__/TwitterComponent.test.d.ts +1 -0
  23. package/dist/components/social-embed/components/__tests__/TwitterComponent.test.js +18 -0
  24. package/dist/components/social-embed/components/__tests__/YoutubeComponent.test.d.ts +1 -0
  25. package/dist/components/social-embed/components/__tests__/YoutubeComponent.test.js +20 -0
  26. package/dist/components/social-embed/constants.d.ts +12 -0
  27. package/dist/components/social-embed/constants.js +13 -0
  28. package/dist/components/social-embed/helpers/__tests__/enableCookies.test.d.ts +1 -0
  29. package/dist/components/social-embed/helpers/__tests__/enableCookies.test.js +46 -0
  30. package/dist/components/social-embed/helpers/__tests__/getVendorTitle.test.d.ts +1 -0
  31. package/dist/components/social-embed/helpers/__tests__/getVendorTitle.test.js +20 -0
  32. package/dist/components/social-embed/helpers/__tests__/privacyModal.test.d.ts +1 -0
  33. package/dist/components/social-embed/helpers/__tests__/privacyModal.test.js +36 -0
  34. package/dist/components/social-embed/helpers/__tests__/vendorConsent.test.d.ts +1 -0
  35. package/dist/components/social-embed/helpers/__tests__/vendorConsent.test.js +49 -0
  36. package/dist/components/social-embed/helpers/enableCookies.d.ts +2 -0
  37. package/dist/components/social-embed/helpers/enableCookies.js +32 -0
  38. package/dist/components/social-embed/helpers/getVendorTitle.d.ts +1 -0
  39. package/dist/components/social-embed/helpers/getVendorTitle.js +7 -0
  40. package/dist/components/social-embed/helpers/privacyModal.d.ts +2 -0
  41. package/dist/components/social-embed/helpers/privacyModal.js +12 -0
  42. package/dist/components/social-embed/helpers/socialMediaVendors.d.ts +7 -0
  43. package/dist/components/social-embed/helpers/socialMediaVendors.js +14 -0
  44. package/dist/components/social-embed/helpers/vendorConsent.d.ts +2 -0
  45. package/dist/components/social-embed/helpers/vendorConsent.js +17 -0
  46. package/dist/components/social-embed/styles.d.ts +8 -0
  47. package/dist/components/social-embed/styles.js +78 -0
  48. package/dist/components/social-embed/types.d.ts +9 -0
  49. package/dist/components/social-embed/types.js +2 -0
  50. package/dist/components/updated-timestamp/__tests__/UpdatedTimestamp.test.js +18 -12
  51. package/dist/contexts/SocialEmbedsProvider.d.ts +10 -0
  52. package/dist/contexts/SocialEmbedsProvider.js +36 -0
  53. package/dist/contexts/__tests__/SocialEmbedsProvider.test.d.ts +1 -0
  54. package/dist/contexts/__tests__/SocialEmbedsProvider.test.js +55 -0
  55. package/dist/fixtures/analytics-actions/__tests__/analytics-actions.test.d.ts +1 -0
  56. package/dist/fixtures/analytics-actions/__tests__/analytics-actions.test.js +35 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.js +4 -1
  59. package/jest.config.js +1 -1
  60. package/package.json +5 -4
  61. package/rnw.js +1 -1
  62. package/src/components/social-embed/BlockedEmbedMessage.tsx +75 -0
  63. package/src/components/social-embed/SocialMediaEmbed.tsx +71 -0
  64. package/src/components/social-embed/SocialVendor.tsx +23 -0
  65. package/src/components/social-embed/__tests__/BlockedEmbedMessage.test.tsx +98 -0
  66. package/src/components/social-embed/__tests__/SocialMediaEmbed.test.tsx +140 -0
  67. package/src/components/social-embed/__tests__/SocialVendor.test.tsx +58 -0
  68. package/src/components/social-embed/components/TiktokComponent.tsx +29 -0
  69. package/src/components/social-embed/components/TwitterComponent.tsx +9 -0
  70. package/src/components/social-embed/components/YoutubeComponent.tsx +13 -0
  71. package/src/components/social-embed/components/__tests__/TiktokComponent.test.tsx +51 -0
  72. package/src/components/social-embed/components/__tests__/TwitterComponent.test.tsx +21 -0
  73. package/src/components/social-embed/components/__tests__/YoutubeComponent.test.tsx +27 -0
  74. package/src/components/social-embed/constants.ts +14 -0
  75. package/src/components/social-embed/helpers/__tests__/enableCookies.test.ts +73 -0
  76. package/src/components/social-embed/helpers/__tests__/getVendorTitle.test.ts +23 -0
  77. package/src/components/social-embed/helpers/__tests__/privacyModal.test.ts +55 -0
  78. package/src/components/social-embed/helpers/__tests__/vendorConsent.test.ts +62 -0
  79. package/src/components/social-embed/helpers/enableCookies.ts +48 -0
  80. package/src/components/social-embed/helpers/getVendorTitle.ts +9 -0
  81. package/src/components/social-embed/helpers/privacyModal.ts +13 -0
  82. package/src/components/social-embed/helpers/socialMediaVendors.ts +15 -0
  83. package/src/components/social-embed/helpers/vendorConsent.ts +28 -0
  84. package/src/components/social-embed/styles.ts +85 -0
  85. package/src/components/social-embed/types.ts +13 -0
  86. package/src/components/updated-timestamp/__tests__/UpdatedTimestamp.test.tsx +17 -17
  87. package/src/components/updated-timestamp/__tests__/__snapshots__/UpdatedTimestamp.test.tsx.snap +0 -20
  88. package/src/contexts/SocialEmbedsProvider.tsx +67 -0
  89. package/src/contexts/__tests__/SocialEmbedsProvider.test.tsx +86 -0
  90. package/src/fixtures/analytics-actions/__tests__/analytics-actions.test.tsx +47 -0
  91. package/src/index.ts +8 -0
package/CHANGELOG.md CHANGED
@@ -3,6 +3,17 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [1.113.0](https://github.com/newsuk/times-components/compare/@times-components/ts-components@1.112.1...@times-components/ts-components@1.113.0) (2024-12-05)
7
+
8
+
9
+ ### Features
10
+
11
+ * **TMC-0000:** Implement social embeds ([#3989](https://github.com/newsuk/times-components/issues/3989)) ([4a4e7cd](https://github.com/newsuk/times-components/commit/4a4e7cdceec5fe7402b4403170013f325eec8a84))
12
+
13
+
14
+
15
+
16
+
6
17
  ## [1.112.1](https://github.com/newsuk/times-components/compare/@times-components/ts-components@1.112.0...@times-components/ts-components@1.112.1) (2024-12-03)
7
18
 
8
19
  **Note:** Version bump only for package @times-components/ts-components
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { VendorName } from './types';
3
+ export declare type BlockedEmbedMessageProps = {
4
+ vendorName: VendorName;
5
+ };
6
+ export declare const BlockedEmbedMessage: FC<BlockedEmbedMessageProps>;
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { AllowButton, CardContainer, CustomIconContainer, EnableButton, Header, LinkPrivacyManager, Paragraph, Title } from './styles';
3
+ import { InfoIcon } from '../inline-message/InfoIcon';
4
+ import { getVendorTitle } from './helpers/getVendorTitle';
5
+ import { enableCookies } from './helpers/enableCookies';
6
+ import { openPrivacyModal } from './helpers/privacyModal';
7
+ import { socialMediaVendors } from './helpers/socialMediaVendors';
8
+ import { modalType } from './constants';
9
+ import { useSocialEmbedsContext } from '../../contexts/SocialEmbedsProvider';
10
+ export const BlockedEmbedMessage = ({ vendorName }) => {
11
+ const { setIsSocialEmbedAllowed, setIsAllowedOnce } = useSocialEmbedsContext();
12
+ const allowCookiesOnce = () => {
13
+ setIsAllowedOnce(prev => ({
14
+ ...prev,
15
+ [vendorName]: true
16
+ }));
17
+ };
18
+ const handleEnableCookies = () => {
19
+ enableCookies(vendorName, setIsSocialEmbedAllowed);
20
+ };
21
+ const handlePrivacyManagerClick = (e) => {
22
+ e.preventDefault();
23
+ openPrivacyModal(modalType.GDPR, window.__TIMES_CONFIG__.sourcepoint.gdprMessageId);
24
+ };
25
+ return (React.createElement(CardContainer, null,
26
+ React.createElement(Header, null,
27
+ React.createElement(CustomIconContainer, null,
28
+ React.createElement(InfoIcon, null)),
29
+ React.createElement(Title, null,
30
+ getVendorTitle(vendorName, socialMediaVendors),
31
+ " content blocked")),
32
+ React.createElement(Paragraph, null,
33
+ "Please enable cookies and other technologies to view this content. You can update your cookies preferences any time using",
34
+ ' ',
35
+ React.createElement(LinkPrivacyManager, { href: "#", onClick: handlePrivacyManagerClick }, "privacy manager.")),
36
+ React.createElement(EnableButton, { onClick: handleEnableCookies }, "Enable cookies"),
37
+ React.createElement(AllowButton, { onClick: () => allowCookiesOnce() }, "Allow cookies once")));
38
+ };
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tlZEVtYmVkTWVzc2FnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NvY2lhbC1lbWJlZC9CbG9ja2VkRW1iZWRNZXNzYWdlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQXlCLE1BQU0sT0FBTyxDQUFDO0FBQzlDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixZQUFZLEVBQ1osTUFBTSxFQUNOLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsS0FBSyxFQUNOLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWxFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFNN0UsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlDLENBQUMsRUFDaEUsVUFBVSxFQUNYLEVBQUUsRUFBRTtJQUNILE1BQU0sRUFDSix1QkFBdUIsRUFDdkIsZ0JBQWdCLEVBQ2pCLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztJQUU3QixNQUFNLGdCQUFnQixHQUFHLEdBQUcsRUFBRTtRQUM1QixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEIsR0FBRyxJQUFJO1lBQ1AsQ0FBQyxVQUFVLENBQUMsRUFBRSxJQUFJO1NBQ25CLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0lBRUYsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLEVBQUU7UUFDL0IsYUFBYSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUVGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFnQyxFQUFFLEVBQUU7UUFDckUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ25CLGdCQUFnQixDQUNkLFNBQVMsQ0FBQyxJQUFJLEVBQ2QsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQ2xELENBQUM7SUFDSixDQUFDLENBQUM7SUFFRixPQUFPLENBQ0wsb0JBQUMsYUFBYTtRQUNaLG9CQUFDLE1BQU07WUFDTCxvQkFBQyxtQkFBbUI7Z0JBQ2xCLG9CQUFDLFFBQVEsT0FBRyxDQUNRO1lBQ3RCLG9CQUFDLEtBQUs7Z0JBQ0gsY0FBYyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQzttQ0FDekMsQ0FDRDtRQUNULG9CQUFDLFNBQVM7O1lBRTJDLEdBQUc7WUFDdEQsb0JBQUMsa0JBQWtCLElBQUMsSUFBSSxFQUFDLEdBQUcsRUFBQyxPQUFPLEVBQUUseUJBQXlCLHVCQUUxQyxDQUNYO1FBQ1osb0JBQUMsWUFBWSxJQUFDLE9BQU8sRUFBRSxtQkFBbUIscUJBQStCO1FBQ3pFLG9CQUFDLFdBQVcsSUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUseUJBRWhDLENBQ0EsQ0FDakIsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,19 @@
1
+ import { FC } from 'react';
2
+ import { TcData, VendorName } from './types';
3
+ declare global {
4
+ interface Window {
5
+ __tcfapi?: (command: string, version: number, callback: (data: TcData, success: boolean) => void, listenerId?: number) => void;
6
+ twttr?: {
7
+ widgets: {
8
+ load: (element?: HTMLElement) => void;
9
+ };
10
+ };
11
+ }
12
+ }
13
+ export declare type SocialMediaEmbedProps = {
14
+ element?: any;
15
+ url: string;
16
+ vendorName: VendorName;
17
+ id: string;
18
+ };
19
+ export declare const SocialMediaEmbed: FC<SocialMediaEmbedProps>;
@@ -0,0 +1,27 @@
1
+ import React, { useEffect } from 'react';
2
+ import { BlockedEmbedMessage } from './BlockedEmbedMessage';
3
+ import { checkVendorConsent } from './helpers/vendorConsent';
4
+ import { eventStatus } from './constants';
5
+ import { useSocialEmbedsContext } from '../../contexts/SocialEmbedsProvider';
6
+ import { Vendor } from './SocialVendor';
7
+ export const SocialMediaEmbed = ({ id, url, vendorName }) => {
8
+ const { setIsSocialEmbedAllowed, isAllowedOnce, isSocialEmbedAllowed } = useSocialEmbedsContext();
9
+ useEffect(() => {
10
+ if (window.__tcfapi) {
11
+ window.__tcfapi('addEventListener', 2, (tcData, success) => {
12
+ if (success &&
13
+ (tcData.eventStatus === eventStatus.tcLoaded ||
14
+ tcData.eventStatus === eventStatus.userActionComplete)) {
15
+ const consent = checkVendorConsent(vendorName);
16
+ setIsSocialEmbedAllowed(prev => ({
17
+ ...prev,
18
+ [vendorName]: consent
19
+ }));
20
+ }
21
+ });
22
+ }
23
+ }, [vendorName, setIsSocialEmbedAllowed]);
24
+ return isSocialEmbedAllowed[vendorName] || isAllowedOnce[vendorName] ? (React.createElement("div", { id: id },
25
+ React.createElement(Vendor, { vendorName: vendorName, url: url }))) : (React.createElement(BlockedEmbedMessage, { vendorName: vendorName }));
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29jaWFsTWVkaWFFbWJlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NvY2lhbC1lbWJlZC9Tb2NpYWxNZWRpYUVtYmVkLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFNLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQXlCeEMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQThCLENBQUMsRUFDMUQsRUFBRSxFQUNGLEdBQUcsRUFDSCxVQUFVLEVBQ1gsRUFBRSxFQUFFO0lBQ0gsTUFBTSxFQUNKLHVCQUF1QixFQUN2QixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3JCLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztJQUU3QixTQUFTLENBQ1AsR0FBRyxFQUFFO1FBQ0gsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUN6RCxJQUNFLE9BQU87b0JBQ1AsQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxRQUFRO3dCQUMxQyxNQUFNLENBQUMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxFQUN4RDtvQkFDQSxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDL0MsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUMvQixHQUFHLElBQUk7d0JBQ1AsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPO3FCQUN0QixDQUFDLENBQUMsQ0FBQztpQkFDTDtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDLEVBQ0QsQ0FBQyxVQUFVLEVBQUUsdUJBQXVCLENBQUMsQ0FDdEMsQ0FBQztJQUVGLE9BQU8sb0JBQW9CLENBQUMsVUFBVSxDQUFDLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNyRSw2QkFBSyxFQUFFLEVBQUUsRUFBRTtRQUNULG9CQUFDLE1BQU0sSUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUksQ0FDeEMsQ0FDUCxDQUFDLENBQUMsQ0FBQyxDQUNGLG9CQUFDLG1CQUFtQixJQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUksQ0FDaEQsQ0FBQztBQUNKLENBQUMsQ0FBQyJ9
@@ -0,0 +1,17 @@
1
+ declare const vendors: {
2
+ twitter: ({ url }: {
3
+ url: string;
4
+ }) => JSX.Element;
5
+ youtube: ({ url }: {
6
+ url: string;
7
+ }) => JSX.Element;
8
+ tiktok: ({ url }: {
9
+ url: string;
10
+ }) => JSX.Element;
11
+ };
12
+ export declare type VendorName = keyof typeof vendors;
13
+ export declare const Vendor: ({ vendorName, url }: {
14
+ vendorName: VendorName;
15
+ url: string;
16
+ }) => JSX.Element;
17
+ export {};
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ import { Twitter } from './components/TwitterComponent';
3
+ import { Youtube } from './components/YoutubeComponent';
4
+ import { TikTok } from './components/TiktokComponent';
5
+ const vendors = {
6
+ twitter: Twitter,
7
+ youtube: Youtube,
8
+ tiktok: TikTok
9
+ };
10
+ export const Vendor = ({ vendorName, url }) => {
11
+ const Component = vendors[vendorName];
12
+ return React.createElement(Component, { url: url });
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29jaWFsVmVuZG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL1NvY2lhbFZlbmRvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHO0lBQ2QsT0FBTyxFQUFFLE9BQU87SUFDaEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsTUFBTSxFQUFFLE1BQU07Q0FDZixDQUFDO0FBSUYsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsRUFDckIsVUFBVSxFQUNWLEdBQUcsRUFJSixFQUFFLEVBQUU7SUFDSCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEMsT0FBTyxvQkFBQyxTQUFTLElBQUMsR0FBRyxFQUFFLEdBQUcsR0FBSSxDQUFDO0FBQ2pDLENBQUMsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,70 @@
1
+ import React from 'react';
2
+ import { render, screen, fireEvent } from '@testing-library/react';
3
+ import { BlockedEmbedMessage } from '../BlockedEmbedMessage';
4
+ import { enableCookies } from '../helpers/enableCookies';
5
+ import { openPrivacyModal } from '../helpers/privacyModal';
6
+ import '@testing-library/jest-dom/extend-expect';
7
+ import { useSocialEmbedsContext } from '../../../contexts/SocialEmbedsProvider';
8
+ // Mock dependencies
9
+ jest.mock('../helpers/enableCookies', () => ({
10
+ enableCookies: jest.fn()
11
+ }));
12
+ jest.mock('../helpers/privacyModal', () => ({
13
+ openPrivacyModal: jest.fn()
14
+ }));
15
+ jest.mock('../../../contexts/SocialEmbedsProvider', () => ({
16
+ useSocialEmbedsContext: jest.fn()
17
+ }));
18
+ jest.mock('../helpers/getVendorTitle', () => ({
19
+ getVendorTitle: jest.fn(() => 'Vendor Title')
20
+ }));
21
+ describe('BlockedEmbedMessage Component', () => {
22
+ const vendorName = 'twitter';
23
+ const defaultProps = {
24
+ vendorName
25
+ };
26
+ const mockContext = {
27
+ setIsSocialEmbedAllowed: jest.fn(),
28
+ setIsAllowedOnce: jest.fn(),
29
+ isSocialEmbedAllowed: { twitter: false, facebook: false },
30
+ isAllowedOnce: { twitter: false, facebook: false }
31
+ };
32
+ beforeEach(() => {
33
+ jest.clearAllMocks();
34
+ useSocialEmbedsContext.mockReturnValue(mockContext);
35
+ window.__TIMES_CONFIG__ = {
36
+ sourcepoint: {
37
+ gdprMessageId: 'mockMessageId'
38
+ }
39
+ };
40
+ });
41
+ afterEach(() => {
42
+ delete window.__TIMES_CONFIG__;
43
+ });
44
+ it('renders the component with correct content', () => {
45
+ render(React.createElement(BlockedEmbedMessage, Object.assign({}, defaultProps)));
46
+ expect(screen.getByText('Vendor Title content blocked')).toBeInTheDocument();
47
+ expect(screen.getByText('Enable cookies')).toBeInTheDocument();
48
+ expect(screen.getByText('Allow cookies once')).toBeInTheDocument();
49
+ expect(screen.getByText('privacy manager.')).toBeInTheDocument();
50
+ });
51
+ it('calls enableCookies when the Enable cookies button is clicked', () => {
52
+ render(React.createElement(BlockedEmbedMessage, Object.assign({}, defaultProps)));
53
+ const enableButton = screen.getByText('Enable cookies');
54
+ fireEvent.click(enableButton);
55
+ expect(enableCookies).toHaveBeenCalledWith(vendorName, mockContext.setIsSocialEmbedAllowed);
56
+ });
57
+ it('calls setIsAllowedOnce when Allow cookies once button is clicked', () => {
58
+ render(React.createElement(BlockedEmbedMessage, Object.assign({}, defaultProps)));
59
+ const allowButton = screen.getByText('Allow cookies once');
60
+ fireEvent.click(allowButton);
61
+ expect(mockContext.setIsAllowedOnce).toHaveBeenCalledWith(expect.any(Function));
62
+ });
63
+ it('calls openPrivacyModal when the privacy manager link is clicked', () => {
64
+ render(React.createElement(BlockedEmbedMessage, Object.assign({}, defaultProps)));
65
+ const privacyLink = screen.getByText('privacy manager.');
66
+ fireEvent.click(privacyLink);
67
+ expect(openPrivacyModal).toHaveBeenCalledWith('gdpr', 'mockMessageId');
68
+ });
69
+ });
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tlZEVtYmVkTWVzc2FnZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL19fdGVzdHNfXy9CbG9ja2VkRW1iZWRNZXNzYWdlLnRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsbUJBQW1CLEVBRXBCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTNELE9BQU8seUNBQXlDLENBQUM7QUFDakQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFaEYsb0JBQW9CO0FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzQyxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUN6QixDQUFDLENBQUMsQ0FBQztBQUVKLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0NBQzVCLENBQUMsQ0FBQyxDQUFDO0FBRUosSUFBSSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELHNCQUFzQixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Q0FDbEMsQ0FBQyxDQUFDLENBQUM7QUFFSixJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDNUMs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
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,99 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import { SocialMediaEmbed } from '../SocialMediaEmbed';
4
+ import { BlockedEmbedMessage } from '../BlockedEmbedMessage';
5
+ import { Vendor } from '../SocialVendor';
6
+ import { checkVendorConsent } from '../helpers/vendorConsent';
7
+ import { eventStatus } from '../constants';
8
+ import '@testing-library/jest-dom/extend-expect';
9
+ import { useSocialEmbedsContext } from '../../../contexts/SocialEmbedsProvider';
10
+ jest.mock('../../../contexts/SocialEmbedsProvider', () => ({
11
+ useSocialEmbedsContext: jest.fn()
12
+ }));
13
+ jest.mock('../BlockedEmbedMessage', () => ({
14
+ BlockedEmbedMessage: jest.fn(() => React.createElement("div", null, "Blocked Embed Message"))
15
+ }));
16
+ jest.mock('../SocialVendor', () => ({
17
+ Vendor: jest.fn(() => React.createElement("div", null, "Vendor Component"))
18
+ }));
19
+ jest.mock('../helpers/vendorConsent', () => ({
20
+ checkVendorConsent: jest.fn(() => true)
21
+ }));
22
+ describe('SocialMediaEmbed Component', () => {
23
+ const vendorName = 'twitter';
24
+ const defaultProps = {
25
+ id: 'test-id',
26
+ url: 'https://twitter.com/test/status/12345',
27
+ vendorName
28
+ };
29
+ const mockContext = {
30
+ setIsSocialEmbedAllowed: jest.fn(),
31
+ isAllowedOnce: { twitter: false },
32
+ isSocialEmbedAllowed: { twitter: false }
33
+ };
34
+ beforeEach(() => {
35
+ jest.clearAllMocks();
36
+ useSocialEmbedsContext.mockReturnValue(mockContext);
37
+ // Mock __tcfapi
38
+ window.__tcfapi = jest.fn();
39
+ });
40
+ afterEach(() => {
41
+ delete window.__tcfapi;
42
+ });
43
+ it('renders BlockedEmbedMessage when social embed is not allowed', () => {
44
+ render(React.createElement(SocialMediaEmbed, Object.assign({}, defaultProps)));
45
+ expect(screen.getByText('Blocked Embed Message')).toBeInTheDocument();
46
+ expect(BlockedEmbedMessage).toHaveBeenCalledWith(expect.objectContaining({
47
+ vendorName: defaultProps.vendorName
48
+ }), {});
49
+ });
50
+ it('renders Vendor component when social embed is allowed', () => {
51
+ useSocialEmbedsContext.mockReturnValue({
52
+ ...mockContext,
53
+ isSocialEmbedAllowed: { twitter: true }
54
+ });
55
+ render(React.createElement(SocialMediaEmbed, Object.assign({}, defaultProps)));
56
+ expect(screen.getByText('Vendor Component')).toBeInTheDocument();
57
+ expect(Vendor).toHaveBeenCalledWith(expect.objectContaining({
58
+ vendorName: defaultProps.vendorName,
59
+ url: defaultProps.url
60
+ }), {});
61
+ });
62
+ it('calls checkVendorConsent and updates context state when __tcfapi is available', () => {
63
+ const tcData = { eventStatus: eventStatus.tcLoaded };
64
+ const updatedProps = {
65
+ ...defaultProps
66
+ };
67
+ render(React.createElement(SocialMediaEmbed, Object.assign({}, updatedProps)));
68
+ const [command, version, callback] = window.__tcfapi.mock.calls[0];
69
+ expect(command).toBe('addEventListener');
70
+ expect(version).toBe(2);
71
+ // Simulate the callback
72
+ callback(tcData, true);
73
+ expect(checkVendorConsent).toHaveBeenCalledWith(vendorName);
74
+ expect(mockContext.setIsSocialEmbedAllowed).toHaveBeenCalledWith(expect.any(Function));
75
+ // Verify the updated state
76
+ const updateFunction = mockContext.setIsSocialEmbedAllowed.mock.calls[0][0];
77
+ const updatedState = updateFunction({ twitter: false });
78
+ expect(updatedState).toEqual({ twitter: true });
79
+ });
80
+ it('does not render Twitter widget if __tcfapi is unavailable', () => {
81
+ delete window.__tcfapi;
82
+ render(React.createElement(SocialMediaEmbed, Object.assign({}, defaultProps)));
83
+ expect(screen.getByText('Blocked Embed Message')).toBeInTheDocument();
84
+ expect(BlockedEmbedMessage).toHaveBeenCalled();
85
+ });
86
+ it('renders Vendor component if isAllowedOnce for the vendor is true', () => {
87
+ useSocialEmbedsContext.mockReturnValue({
88
+ ...mockContext,
89
+ isAllowedOnce: { twitter: true }
90
+ });
91
+ render(React.createElement(SocialMediaEmbed, Object.assign({}, defaultProps)));
92
+ expect(screen.getByText('Vendor Component')).toBeInTheDocument();
93
+ expect(Vendor).toHaveBeenCalledWith(expect.objectContaining({
94
+ vendorName: defaultProps.vendorName,
95
+ url: defaultProps.url
96
+ }), {});
97
+ });
98
+ });
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29jaWFsTWVkaWFFbWJlZC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL19fdGVzdHNfXy9Tb2NpYWxNZWRpYUVtYmVkLnRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUIsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLHlDQUF5QyxDQUFDO0FBQ2pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBRWhGLElBQUksQ0FBQyxJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6RCxzQkFBc0IsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0NBQ2xDLENBQUMsQ0FBQyxDQUFDO0FBRUosSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMseURBQWdDLENBQUM7Q0FDckUsQ0FBQyxDQUFDLENBQUM7QUFFSixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbEMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMs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
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
@@ -0,0 +1,34 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom';
4
+ import { Vendor } from '../SocialVendor';
5
+ // Mock components
6
+ jest.mock('../components/TwitterComponent', () => ({
7
+ Twitter: jest.fn(() => (React.createElement("div", { "data-testid": "twitter-component" }, "Twitter Component")))
8
+ }));
9
+ jest.mock('../components/YoutubeComponent', () => ({
10
+ Youtube: jest.fn(() => (React.createElement("div", { "data-testid": "youtube-component" }, "Youtube Component")))
11
+ }));
12
+ jest.mock('../components/TiktokComponent', () => ({
13
+ TikTok: jest.fn(() => (React.createElement("div", { "data-testid": "tiktok-component" }, "TikTok Component")))
14
+ }));
15
+ describe('Vendor Component', () => {
16
+ const renderVendor = (vendorName, url) => render(React.createElement(Vendor, { vendorName: vendorName, url: url }));
17
+ it('renders the Twitter component when vendorName is "twitter"', () => {
18
+ renderVendor('twitter', 'https://twitter.com/some/tweet');
19
+ expect(screen.getByTestId('twitter-component')).toBeInTheDocument();
20
+ });
21
+ it('renders the Youtube component when vendorName is "youtube"', () => {
22
+ renderVendor('youtube', 'https://youtube.com/some/video');
23
+ expect(screen.getByTestId('youtube-component')).toBeInTheDocument();
24
+ });
25
+ it('renders the TikTok component when vendorName is "tiktok"', () => {
26
+ renderVendor('tiktok', 'https://www.tiktok.com/@user/video/1234567890');
27
+ expect(screen.getByTestId('tiktok-component')).toBeInTheDocument();
28
+ });
29
+ it('throws an error if an invalid vendorName is provided', () => {
30
+ const renderInvalidVendor = () => render(React.createElement(Vendor, { vendorName: 'invalid', url: "https://example.com" }));
31
+ expect(renderInvalidVendor).toThrowError();
32
+ });
33
+ });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29jaWFsVmVuZG9yLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zb2NpYWwtZW1iZWQvX190ZXN0c19fL1NvY2lhbFZlbmRvci50ZXN0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLDJCQUEyQixDQUFDO0FBRW5DLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxrQkFBa0I7QUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQ3JCLDRDQUFpQixtQkFBbUIsd0JBQXdCLENBQzdELENBQUM7Q0FDSCxDQUFDLENBQUMsQ0FBQztBQUVKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNqRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUNyQiw0Q0FBaUIsbUJBQW1CLHdCQUF3QixDQUM3RCxDQUFDO0NBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSixJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEQsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FDcEIsNENBQWlCLGtCQUFrQix1QkFBdUIsQ0FDM0QsQ0FBQztDQUNILENBQUMsQ0FBQyxDQUFDO0FBRUosUUFBUSxDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtJQUNoQyxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQXNCLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDM0QsTUFBTSxDQUFDLG9CQUFDLE1BQU0sSUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUksQ0FBQyxDQUFDO0lBRXZELEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxHQUFHLEVBQUU7UUFDcEUsWUFBWSxDQUFDLFNBQXVCLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0REFBNEQsRUFBRSxHQUFHLEVBQUU7UUFDcEUsWUFBWSxDQUFDLFNBQXVCLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUN4RSxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwREFBMEQsRUFBRSxHQUFHLEVBQUU7UUFDbEUsWUFBWSxDQUNWLFFBQXNCLEVBQ3RCLCtDQUErQyxDQUNoRCxDQUFDO1FBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDckUsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsc0RBQXNELEVBQUUsR0FBRyxFQUFFO1FBQzlELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFLENBQy9CLE1BQU0sQ0FDSixvQkFBQyxNQUFNLElBQ0wsVUFBVSxFQUFFLFNBQXVCLEVBQ25DLEdBQUcsRUFBQyxxQkFBcUIsR0FDekIsQ0FDSCxDQUFDO1FBQ0osTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,3 @@
1
+ export declare const TikTok: ({ url }: {
2
+ url: string;
3
+ }) => JSX.Element;
@@ -0,0 +1,17 @@
1
+ import React, { useEffect } from 'react';
2
+ export const TikTok = ({ url }) => {
3
+ useEffect(() => {
4
+ const script = document.createElement('script');
5
+ script.src = 'https://www.tiktok.com/embed.js';
6
+ script.async = true;
7
+ document.body.appendChild(script);
8
+ return () => {
9
+ document.body.removeChild(script);
10
+ };
11
+ }, []);
12
+ const videoId = new URL(url).pathname.split('/').pop();
13
+ const citeUrl = new URL(url).origin + url;
14
+ return (React.createElement("blockquote", { className: "tiktok-embed", cite: citeUrl, "data-video-id": videoId, style: { maxWidth: '605px', minWidth: '325px' }, "data-testid": "tiktok-embed" },
15
+ React.createElement("section", null)));
16
+ };
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlrdG9rQ29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL2NvbXBvbmVudHMvVGlrdG9rQ29tcG9uZW50LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBbUIsRUFBRSxFQUFFO0lBQ2pELFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxHQUFHLEdBQUcsaUNBQWlDLENBQUM7UUFDL0MsTUFBTSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEMsT0FBTyxHQUFHLEVBQUU7WUFDVixRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUM7SUFDSixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3ZELE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7SUFFMUMsT0FBTyxDQUNMLG9DQUNFLFNBQVMsRUFBQyxjQUFjLEVBQ3hCLElBQUksRUFBRSxPQUFPLG1CQUNFLE9BQU8sRUFDdEIsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGlCQUNuQyxjQUFjO1FBRTFCLG9DQUFXLENBQ0EsQ0FDZCxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -0,0 +1,3 @@
1
+ export declare const Twitter: ({ url }: {
2
+ url: string;
3
+ }) => JSX.Element;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export const Twitter = ({ url }) => {
3
+ return (React.createElement("blockquote", { className: "twitter-tweet", "data-testid": "twitter-embed" },
4
+ React.createElement("a", { href: url })));
5
+ };
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHdpdHRlckNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NvY2lhbC1lbWJlZC9jb21wb25lbnRzL1R3aXR0ZXJDb21wb25lbnQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBbUIsRUFBRSxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxvQ0FBWSxTQUFTLEVBQUMsZUFBZSxpQkFBYSxlQUFlO1FBQy9ELDJCQUFHLElBQUksRUFBRSxHQUFHLEdBQUksQ0FDTCxDQUNkLENBQUM7QUFDSixDQUFDLENBQUMifQ==
@@ -0,0 +1,3 @@
1
+ export declare const Youtube: ({ url }: {
2
+ url: string;
3
+ }) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export const Youtube = ({ url }) => {
3
+ return (React.createElement("iframe", { width: "560", height: "315", src: url, title: "YouTube video player", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" }));
4
+ };
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWW91dHViZUNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NvY2lhbC1lbWJlZC9jb21wb25lbnRzL1lvdXR1YmVDb21wb25lbnQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBbUIsRUFBRSxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxnQ0FDRSxLQUFLLEVBQUMsS0FBSyxFQUNYLE1BQU0sRUFBQyxLQUFLLEVBQ1osR0FBRyxFQUFFLEdBQUcsRUFDUixLQUFLLEVBQUMsc0JBQXNCLEVBQzVCLEtBQUssRUFBQyxxR0FBcUcsR0FDM0csQ0FDSCxDQUFDO0FBQ0osQ0FBQyxDQUFDIn0=
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import { render, cleanup } from '@testing-library/react';
3
+ import { TikTok } from '../TiktokComponent';
4
+ describe('TikTok Component', () => {
5
+ const tiktokUrl = 'https://www.tiktok.com/@user/video/1234567890123456789';
6
+ afterEach(() => {
7
+ cleanup();
8
+ jest.restoreAllMocks();
9
+ });
10
+ it('injects the TikTok embed script on mount', () => {
11
+ const appendChildSpy = jest.spyOn(document.body, 'appendChild');
12
+ render(React.createElement(TikTok, { url: tiktokUrl }));
13
+ const script = Array.from(document.body.getElementsByTagName('script')).find(el => el.src === 'https://www.tiktok.com/embed.js');
14
+ expect(script).toBeTruthy();
15
+ expect(appendChildSpy).toHaveBeenCalledWith(expect.any(HTMLScriptElement));
16
+ });
17
+ it('removes the TikTok embed script on unmount', () => {
18
+ const removeChildSpy = jest.spyOn(document.body, 'removeChild');
19
+ const { unmount } = render(React.createElement(TikTok, { url: tiktokUrl }));
20
+ unmount();
21
+ const script = Array.from(document.body.getElementsByTagName('script')).find(el => el.src === 'https://www.tiktok.com/embed.js');
22
+ expect(script).toBeFalsy();
23
+ expect(removeChildSpy).toHaveBeenCalledWith(expect.any(HTMLScriptElement));
24
+ });
25
+ it('does not throw an error if the script is already removed during unmount', () => {
26
+ jest.spyOn(document.body, 'removeChild').mockImplementation(node => {
27
+ if (!document.body.contains(node)) {
28
+ throw new Error('The node to be removed is not a child of this node');
29
+ }
30
+ return node; // Ensure the removed node is returned
31
+ });
32
+ const { unmount } = render(React.createElement(TikTok, { url: tiktokUrl }));
33
+ expect(() => unmount()).not.toThrow();
34
+ });
35
+ });
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlrdG9rQ29tcG9uZW50LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9zb2NpYWwtZW1iZWQvY29tcG9uZW50cy9fX3Rlc3RzX18vVGlrdG9rQ29tcG9uZW50LnRlc3QudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU1QyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2hDLE1BQU0sU0FBUyxHQUFHLHdEQUF3RCxDQUFDO0lBRTNFLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixPQUFPLEVBQUUsQ0FBQztRQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywwQ0FBMEMsRUFBRSxHQUFHLEVBQUU7UUFDbEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sQ0FBQyxvQkFBQyxNQUFNLElBQUMsR0FBRyxFQUFFLFNBQVMsR0FBSSxDQUFDLENBQUM7UUFFbkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FDN0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLGlDQUFpQyxDQUFDLENBQUM7UUFFM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyw0Q0FBNEMsRUFBRSxHQUFHLEVBQUU7UUFDcEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsb0JBQUMsTUFBTSxJQUFDLEdBQUcsRUFBRSxTQUFTLEdBQUksQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sRUFBRSxDQUFDO1FBRVYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FDN0MsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLGlDQUFpQyxDQUFDLENBQUM7UUFFM0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5RUFBeUUsRUFBRSxHQUFHLEVBQUU7UUFDakYsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO2FBQ3ZFO1lBQ0QsT0FBTyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLG9CQUFDLE1BQU0sSUFBQyxHQUFHLEVBQUUsU0FBUyxHQUFJLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyJ9
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/extend-expect';
4
+ import { Twitter } from '../TwitterComponent';
5
+ describe('Twitter Component', () => {
6
+ const twitterUrl = 'https://twitter.com/user/status/1234567890';
7
+ it('renders the Twitter blockquote with the correct URL', () => {
8
+ render(React.createElement(Twitter, { url: twitterUrl }));
9
+ // Find the blockquote using class name or test ID
10
+ const blockquote = screen.getByTestId('twitter-embed');
11
+ expect(blockquote).toHaveClass('twitter-tweet');
12
+ // Check if the anchor tag is rendered with the correct href
13
+ const anchor = blockquote.querySelector('a');
14
+ expect(anchor).toBeInTheDocument();
15
+ expect(anchor).toHaveAttribute('href', twitterUrl);
16
+ });
17
+ });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHdpdHRlckNvbXBvbmVudC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL2NvbXBvbmVudHMvX190ZXN0c19fL1R3aXR0ZXJDb21wb25lbnQudGVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxNQUFNLFVBQVUsR0FBRyw0Q0FBNEMsQ0FBQztJQUVoRSxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1FBQzdELE1BQU0sQ0FBQyxvQkFBQyxPQUFPLElBQUMsR0FBRyxFQUFFLFVBQVUsR0FBSSxDQUFDLENBQUM7UUFFckMsa0RBQWtEO1FBQ2xELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUVoRCw0REFBNEQ7UUFDNUQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNuQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/extend-expect';
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import { render, screen } from '@testing-library/react';
3
+ import '@testing-library/jest-dom/extend-expect';
4
+ import { Youtube } from '../YoutubeComponent';
5
+ describe('Youtube Component', () => {
6
+ const youtubeUrl = 'https://www.youtube.com/embed/dQw4w9WgXcQ';
7
+ it('renders the YouTube iframe with the correct attributes', () => {
8
+ render(React.createElement(Youtube, { url: youtubeUrl }));
9
+ // Get the iframe element
10
+ const iframe = screen.getByTitle('YouTube video player');
11
+ // Check if the iframe is rendered
12
+ expect(iframe).toBeInTheDocument();
13
+ // Check if the iframe has the correct attributes
14
+ expect(iframe).toHaveAttribute('src', youtubeUrl);
15
+ expect(iframe).toHaveAttribute('width', '560');
16
+ expect(iframe).toHaveAttribute('height', '315');
17
+ expect(iframe).toHaveAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share');
18
+ });
19
+ });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWW91dHViZUNvbXBvbmVudC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL2NvbXBvbmVudHMvX190ZXN0c19fL1lvdXR1YmVDb21wb25lbnQudGVzdC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyx5Q0FBeUMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFOUMsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxNQUFNLFVBQVUsR0FBRywyQ0FBMkMsQ0FBQztJQUUvRCxFQUFFLENBQUMsd0RBQXdELEVBQUUsR0FBRyxFQUFFO1FBQ2hFLE1BQU0sQ0FBQyxvQkFBQyxPQUFPLElBQUMsR0FBRyxFQUFFLFVBQVUsR0FBSSxDQUFDLENBQUM7UUFFckMseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUV6RCxrQ0FBa0M7UUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFbkMsaURBQWlEO1FBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxlQUFlLENBQzVCLE9BQU8sRUFDUCxxR0FBcUcsQ0FDdEcsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
@@ -0,0 +1,12 @@
1
+ export declare const modalType: {
2
+ readonly GDPR: "gdpr";
3
+ readonly CCPA: "ccpa";
4
+ };
5
+ export declare const eventStatus: {
6
+ readonly tcLoaded: "tcloaded";
7
+ readonly cmpIsShown: "cmpuishown";
8
+ readonly userActionComplete: "useractioncomplete";
9
+ };
10
+ export declare const vendors: {
11
+ readonly twitter: "twitter";
12
+ };
@@ -0,0 +1,13 @@
1
+ export const modalType = {
2
+ GDPR: 'gdpr',
3
+ CCPA: 'ccpa'
4
+ };
5
+ export const eventStatus = {
6
+ tcLoaded: 'tcloaded',
7
+ cmpIsShown: 'cmpuishown',
8
+ userActionComplete: 'useractioncomplete'
9
+ };
10
+ export const vendors = {
11
+ twitter: 'twitter'
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDdkIsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsTUFBTTtDQUNKLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsUUFBUSxFQUFFLFVBQVU7SUFDcEIsVUFBVSxFQUFFLFlBQVk7SUFDeEIsa0JBQWtCLEVBQUUsb0JBQW9CO0NBQ2hDLENBQUM7QUFFWCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7SUFDckIsT0FBTyxFQUFFLFNBQVM7Q0FDVixDQUFDIn0=
@@ -0,0 +1,46 @@
1
+ import { enableCookies } from '../enableCookies';
2
+ jest.mock('../socialMediaVendors', () => ({
3
+ socialMediaVendors: {
4
+ facebook: { id: 'facebookId' },
5
+ twitter: { id: 'twitterId' }
6
+ }
7
+ }));
8
+ describe('enableCookies', () => {
9
+ const mockVendorId = 'facebookId';
10
+ const setIsSocialEmbedAllowed = jest.fn();
11
+ beforeEach(() => {
12
+ jest.clearAllMocks();
13
+ window.__tcfapi = jest.fn();
14
+ });
15
+ it('should call __tcfapi with "getCustomVendorConsents" for the vendor', () => {
16
+ window.__tcfapi = jest.fn((command, version, callback) => {
17
+ // tslint:disable-next-line:no-console
18
+ console.log('command, version', command, version);
19
+ callback({
20
+ grants: { [mockVendorId]: { purposeGrants: { 1: true } } }
21
+ }, true);
22
+ });
23
+ enableCookies('facebook', setIsSocialEmbedAllowed);
24
+ expect(window.__tcfapi).toHaveBeenCalledWith('getCustomVendorConsents', 2, expect.any(Function));
25
+ });
26
+ it('should call postCustomConsent if consent data and grants are available', () => {
27
+ const purposeGrants = { 1: true };
28
+ window.__tcfapi = jest.fn((command, version, callback) => {
29
+ // tslint:disable-next-line:no-console
30
+ console.log('command, version', command, version);
31
+ if (command === 'getCustomVendorConsents') {
32
+ callback({
33
+ grants: { [mockVendorId]: { purposeGrants } }
34
+ }, true);
35
+ }
36
+ });
37
+ enableCookies('facebook', setIsSocialEmbedAllowed);
38
+ expect(window.__tcfapi).toHaveBeenCalledWith('postCustomConsent', 2, expect.any(Function), [mockVendorId], Object.keys(purposeGrants), []);
39
+ });
40
+ it('should not call __tcfapi if __tcfapi is not defined', () => {
41
+ delete window.__tcfapi;
42
+ enableCookies('facebook', setIsSocialEmbedAllowed);
43
+ expect(window.__tcfapi).toBeUndefined();
44
+ });
45
+ });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5hYmxlQ29va2llcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc29jaWFsLWVtYmVkL2hlbHBlcnMvX190ZXN0c19fL2VuYWJsZUNvb2tpZXMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFakQsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLGtCQUFrQixFQUFFO1FBQ2xCLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUU7UUFDOUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRTtLQUM3QjtDQUNGLENBQUMsQ0FBQyxDQUFDO0FBRUosUUFBUSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDN0IsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0lBQ2xDLE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRTFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDcEIsTUFBYyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1FBQzNFLE1BQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDaEUsc0NBQXNDO1lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xELFFBQVEsQ0FDTjtnQkFDRSxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUU7YUFDM0QsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsYUFBYSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsb0JBQW9CLENBQzFDLHlCQUF5QixFQUN6QixDQUFDLEVBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FDckIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHdFQUF3RSxFQUFFLEdBQUcsRUFBRTtRQUNoRixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqQyxNQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ2hFLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNsRCxJQUFJLE9BQU8sS0FBSyx5QkFBeUIsRUFBRTtnQkFDekMsUUFBUSxDQUNOO29CQUNFLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxhQUFhLEVBQUUsRUFBRTtpQkFDOUMsRUFDRCxJQUFJLENBQ0wsQ0FBQzthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxvQkFBb0IsQ0FDMUMsbUJBQW1CLEVBQ25CLENBQUMsRUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUNwQixDQUFDLFlBQVksQ0FBQyxFQUNkLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQzFCLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMscURBQXFELEVBQUUsR0FBRyxFQUFFO1FBQzdELE9BQVEsTUFBYyxDQUFDLFFBQVEsQ0FBQztRQUVoQyxhQUFhLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7UUFFbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIn0=