@vouchfor/embeds 0.0.0-experiment.f4df018 → 0.0.0-experiment.f6e3687

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. package/dist/es/browser-0cb0f446.js +433 -0
  2. package/dist/es/browser-0cb0f446.js.map +1 -0
  3. package/dist/es/embeds.js +12 -1499
  4. package/dist/es/embeds.js.map +1 -1
  5. package/dist/es/index-326f29ee.js +9536 -0
  6. package/dist/es/index-326f29ee.js.map +1 -0
  7. package/dist/es/src/components/DialogEmbed/DialogOverlay.d.ts +19 -0
  8. package/dist/es/src/components/DialogEmbed/DialogPortal.d.ts +35 -0
  9. package/dist/es/src/components/DialogEmbed/index.d.ts +36 -0
  10. package/dist/es/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +15 -0
  11. package/dist/es/{components/Embed → src/components/PlayerEmbed}/controllers/fetcher.d.ts +5 -4
  12. package/dist/es/src/components/PlayerEmbed/controllers/tracking/index.d.ts +36 -0
  13. package/dist/es/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +17 -0
  14. package/dist/es/{components/Embed → src/components/PlayerEmbed}/index.d.ts +28 -19
  15. package/dist/es/src/components/PlayerEmbed/tests/data.d.ts +3 -0
  16. package/dist/es/src/index.d.ts +2 -0
  17. package/dist/iife/dialog-embed/browser-fcb64823.js +433 -0
  18. package/dist/iife/dialog-embed/browser-fcb64823.js.map +1 -0
  19. package/dist/iife/dialog-embed/embed.iife.js +1723 -0
  20. package/dist/iife/dialog-embed/embed.iife.js.map +1 -0
  21. package/dist/iife/dialog-embed/embed.js +5 -0
  22. package/dist/iife/dialog-embed/embed.js.map +1 -0
  23. package/dist/iife/dialog-embed/index-804846ae.js +33256 -0
  24. package/dist/iife/dialog-embed/index-804846ae.js.map +1 -0
  25. package/dist/iife/dialog-embed/src/components/DialogEmbed/DialogOverlay.d.ts +19 -0
  26. package/dist/iife/dialog-embed/src/components/DialogEmbed/DialogPortal.d.ts +35 -0
  27. package/dist/iife/dialog-embed/src/components/DialogEmbed/index.d.ts +36 -0
  28. package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +15 -0
  29. package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/fetcher.d.ts +14 -0
  30. package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/tracking/index.d.ts +36 -0
  31. package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +17 -0
  32. package/dist/iife/dialog-embed/src/components/PlayerEmbed/index.d.ts +73 -0
  33. package/dist/iife/dialog-embed/src/components/PlayerEmbed/tests/data.d.ts +3 -0
  34. package/dist/iife/dialog-embed/src/index.d.ts +2 -0
  35. package/dist/iife/dialog-embed/src/utils/env.d.ts +12 -0
  36. package/dist/iife/dialog-embed/src/utils/events.d.ts +2 -0
  37. package/dist/iife/embeds.iife.js +637 -344
  38. package/dist/iife/embeds.iife.js.map +1 -1
  39. package/dist/iife/player-embed/browser-910b9dcb.js +433 -0
  40. package/dist/iife/player-embed/browser-910b9dcb.js.map +1 -0
  41. package/dist/iife/player-embed/embed.iife.js +1585 -0
  42. package/dist/iife/player-embed/embed.iife.js.map +1 -0
  43. package/dist/iife/player-embed/embed.js +5 -0
  44. package/dist/iife/player-embed/embed.js.map +1 -0
  45. package/dist/iife/player-embed/index-154c6a23.js +32811 -0
  46. package/dist/iife/player-embed/index-154c6a23.js.map +1 -0
  47. package/dist/iife/player-embed/src/components/DialogEmbed/DialogOverlay.d.ts +19 -0
  48. package/dist/iife/player-embed/src/components/DialogEmbed/DialogPortal.d.ts +35 -0
  49. package/dist/iife/player-embed/src/components/DialogEmbed/index.d.ts +36 -0
  50. package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +15 -0
  51. package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/fetcher.d.ts +14 -0
  52. package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/tracking/index.d.ts +36 -0
  53. package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +17 -0
  54. package/dist/iife/player-embed/src/components/PlayerEmbed/index.d.ts +73 -0
  55. package/dist/iife/player-embed/src/components/PlayerEmbed/tests/data.d.ts +3 -0
  56. package/dist/iife/player-embed/src/index.d.ts +2 -0
  57. package/dist/iife/player-embed/src/utils/env.d.ts +12 -0
  58. package/dist/iife/player-embed/src/utils/events.d.ts +2 -0
  59. package/package.json +13 -5
  60. package/src/components/DialogEmbed/Dialog.stories.ts +91 -0
  61. package/src/components/DialogEmbed/DialogOverlay.ts +131 -0
  62. package/src/components/DialogEmbed/DialogPortal.ts +126 -0
  63. package/src/components/DialogEmbed/index.ts +97 -0
  64. package/src/components/{Embed/Embed.stories.ts → PlayerEmbed/PlayerEmbed.stories.ts} +27 -14
  65. package/src/components/{Embed → PlayerEmbed}/controllers/event-forwarder.ts +6 -5
  66. package/src/components/PlayerEmbed/controllers/fetcher.ts +152 -0
  67. package/src/components/PlayerEmbed/controllers/tracking/index.ts +224 -0
  68. package/src/components/PlayerEmbed/controllers/tracking/utils.ts +95 -0
  69. package/src/components/{Embed → PlayerEmbed}/index.ts +78 -27
  70. package/src/components/PlayerEmbed/tests/PlayerEmbed.spec.ts +80 -0
  71. package/src/components/PlayerEmbed/tests/data.ts +183 -0
  72. package/src/index.ts +2 -1
  73. package/dist/es/components/Embed/controllers/tracking.d.ts +0 -28
  74. package/dist/es/index.d.ts +0 -1
  75. package/src/components/Embed/controllers/fetcher.ts +0 -113
  76. package/src/components/Embed/controllers/tracking.ts +0 -261
  77. /package/dist/es/{utils → src/utils}/env.d.ts +0 -0
  78. /package/dist/es/{utils → src/utils}/events.d.ts +0 -0
@@ -0,0 +1,183 @@
1
+ import type { Vouch } from '@vouchfor/media-player';
2
+
3
+ /* eslint-disable max-lines */
4
+ const data = {
5
+ id: '85a7f7fb-897c-41a4-be7b-2636cf991f2c',
6
+ hashId: '6JQEIPeStt',
7
+ questions: {
8
+ items: [
9
+ {
10
+ id: '5c66bb3a-ed68-41a0-a601-a49865104418',
11
+ title: `"Emoji": 🇯🇵 🙏
12
+ Arabic: خَرَجَ الوَلَدُ.
13
+ Chinese: 简化字不讲理
14
+ Hebrew: עִבְרִית
15
+ Japanese Kanji: 漢字
16
+ Japanese Hiragana: 平仮名
17
+ Japanese Katakana: 片仮名
18
+ Devangari Hindi: ॳॴॶॷऎऒऔ
19
+ Korean Hangul: 정음/正音
20
+ Cyrillic: АБВГДЕЖЗИКЛМН
21
+ Greek: αβγδ`,
22
+ answer: {
23
+ id: '5c66bb3a-ed68-41a0-a601-a49865104418',
24
+ label: null,
25
+ metadata: {
26
+ duration: 18.5
27
+ },
28
+ settings: {
29
+ endOffset: 0,
30
+ startOffset: 0
31
+ },
32
+ media: {
33
+ input:
34
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418_input.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
35
+ video:
36
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
37
+ playlist:
38
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
39
+ thumbnail:
40
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418_poster.0000001.jpg?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTYzMjM0Mjl9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=SGA54MFpy4jaqKJHKEuxRfjk-~NBFAh1tdW9Y6uYJwc0LFjDDgX1sraerSyohmVhj~-QVIrglY5BvglDIhrFcLJWGTkgj4vhyLprk1a7EDckv0HBgp-k1ZKvoDtt3wBOzrL4GicfXBkuMpIu5jv5MY3xemlJj2a6V~h65XJuLO4u-xS~McH6rS3mRxoNl4GcYUVm4upre1DGQx-5Suy6Ateoxl6xxoF8kg5EL02KxkIGiRpwXJTvVmUuVF0rpBj-IE40MfmhLBQ1NNSXiqb3-HjpkKwhYPvB5APVh23mzGmqJ0P3jbr2F1cU4Jvlqsjb6GVP61wGOz9ITeWPZkOy8A__'
41
+ },
42
+ client: {
43
+ id: '03540d70-1c75-4867-a235-bac842ed6ce4',
44
+ name: 'Not Supplied',
45
+ logoSrc: 'https://logo.clearbit.com/vouchfor.com?size=260'
46
+ },
47
+ contact: {
48
+ id: 'b62f62a3-0cd4-4512-9b52-121cb2f3e72f',
49
+ name: 'Aaron Williams'
50
+ },
51
+ captions: {
52
+ current:
53
+ 'WEBVTT\n\n1\n00:00:01.549 --> 00:00:05.920\n🇯🇵 🙏 こんにちは 藤森 章 です 。 え ? 今 日本 の え ? 東京 に 住ん で\n\n2\n00:00:05.929 --> 00:00:11.359\nいる 高校 三 年 生 です 。 えっと 父親 が 日本 人 で 母親 が は\n\n3\n00:00:11.619 --> 00:00:13.130\nえー 中国 人 な ん です けれど も 。\n\n4\n00:00:13.939 --> 00:00:17.889\nえ ? 上海 に 行っ た 時 に 国際 学校 に 通っ て い た の で 。\n\n5\n00:00:17.899 --> 00:00:20.389\nえー 英語 を 日本 語 、 中国 語 、 三 語 を しゃ ます\n\n6\n00:00:21.030 --> 00:00:23.549\nえー で 、 その 中 で 経験 し た こと な ん です けれど も 、\n\n7\n00:00:24.040 --> 00:00:26.700\n日本 語 の 素晴らしい ところ って いう の は 、\n\n8\n00:00:27.260 --> 00:00:27.809\nやっぱり\n\n9\n00:00:28.489 --> 00:00:31.540\n和歌 に も 見 られる よう な 多彩 な 表現 力 と\n\n10\n00:00:32.349 --> 00:00:33.819\nえ 奥深い\n\n11\n00:00:34.770 --> 00:00:38.520\nえー 、 感情 表現 など に ある と 思い ます 。 えー これ を 見 て\n\n12\n00:00:38.759 --> 00:00:41.599\n日本 語 に 興味 を 持っ た 方 は 、 是非 その\n\n13\n00:00:43.180 --> 00:00:43.770\n奥深い\n\n14\n00:00:44.299 --> 00:00:45.630\n表現 など を え 、\n\n15\n00:00:46.299 --> 00:00:49.209\n見 て 、 感じ て えー 、 触れ て み て ください 。 ありがとう\n\n16\n00:00:49.220 --> 00:00:49.599\nござい まし た 。\n'
54
+ }
55
+ }
56
+ },
57
+ {
58
+ id: '5c66bb3a-ed68-41a0-a601-a49865104418',
59
+ // title: "What is the business problem you're trying to solve?",
60
+ answer: {
61
+ id: '5c66bb3a-ed68-41a0-a601-a49865104418',
62
+ label: 'Hello this label is overridden',
63
+ metadata: {
64
+ duration: 18.5
65
+ },
66
+ settings: {
67
+ endOffset: 0.385945945945946,
68
+ startOffset: 0.3037837837837838,
69
+ crop: {
70
+ x: 0.4,
71
+ y: 0.4,
72
+ width: 0.4,
73
+ height: 0.4
74
+ }
75
+ },
76
+ media: {
77
+ input:
78
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418_input.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
79
+ video:
80
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
81
+ playlist:
82
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
83
+ thumbnail:
84
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/5c66bb3a-ed68-41a0-a601-a49865104418/5c66bb3a-ed68-41a0-a601-a49865104418_poster.0000001.jpg?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTYzMjM0Mjl9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=SGA54MFpy4jaqKJHKEuxRfjk-~NBFAh1tdW9Y6uYJwc0LFjDDgX1sraerSyohmVhj~-QVIrglY5BvglDIhrFcLJWGTkgj4vhyLprk1a7EDckv0HBgp-k1ZKvoDtt3wBOzrL4GicfXBkuMpIu5jv5MY3xemlJj2a6V~h65XJuLO4u-xS~McH6rS3mRxoNl4GcYUVm4upre1DGQx-5Suy6Ateoxl6xxoF8kg5EL02KxkIGiRpwXJTvVmUuVF0rpBj-IE40MfmhLBQ1NNSXiqb3-HjpkKwhYPvB5APVh23mzGmqJ0P3jbr2F1cU4Jvlqsjb6GVP61wGOz9ITeWPZkOy8A__'
85
+ },
86
+ client: {
87
+ id: '03540d70-1c75-4867-a235-bac842ed6ce4',
88
+ logoSrc: 'https://logo.clearbit.com/vouchfor.com?size=260'
89
+ },
90
+ contact: {
91
+ id: 'b62f62a3-0cd4-4512-9b52-121cb2f3e72f',
92
+ name: 'Aaron Williams',
93
+ roleTitle: 'Software Engineer'
94
+ },
95
+ captions: {
96
+ current:
97
+ "WEBVTT\r\n\r\n1\r\n00:00:01.710 --> 00:00:05.250\r\nwe are trying to solve, uh, world hunger.\r\n\r\n2\r\n00:00:05.420 --> 00:00:08.369\r\nI think it's an important goal. Uh, we\r\n\r\n3\r\n00:00:08.380 --> 00:00:09.489\r\nalso would like to get rid of\r\n\r\n4\r\n00:00:09.500 --> 00:00:12.050\r\ntuberculosis. Um, in general. And\r\n\r\n5\r\n00:00:12.060 --> 00:00:15.329\r\nprobably malaria, too. Uh, it's gonna be\r\n\r\n6\r\n00:00:15.340 --> 00:00:17.180\r\na couple of weeks, but I think we can do\r\n\r\n7\r\n00:00:17.190 --> 00:00:17.319\r\nit.\r\n"
98
+ }
99
+ }
100
+ },
101
+ {
102
+ id: 'e77c81a7-f6ef-4eae-91fc-b620d092d8d6',
103
+ title: 'What are the priorities for your business/team this quarter?',
104
+ answer: {
105
+ id: 'e77c81a7-f6ef-4eae-91fc-b620d092d8d6',
106
+ label: null,
107
+ metadata: {
108
+ duration: 16.167
109
+ },
110
+ settings: {
111
+ endOffset: 0,
112
+ startOffset: 0
113
+ },
114
+ media: {
115
+ input:
116
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/e77c81a7-f6ef-4eae-91fc-b620d092d8d6/e77c81a7-f6ef-4eae-91fc-b620d092d8d6_input.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
117
+ video:
118
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/e77c81a7-f6ef-4eae-91fc-b620d092d8d6/e77c81a7-f6ef-4eae-91fc-b620d092d8d6.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
119
+ playlist:
120
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/e77c81a7-f6ef-4eae-91fc-b620d092d8d6/e77c81a7-f6ef-4eae-91fc-b620d092d8d6.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
121
+ thumbnail:
122
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/e77c81a7-f6ef-4eae-91fc-b620d092d8d6/e77c81a7-f6ef-4eae-91fc-b620d092d8d6_poster.0000001.jpg?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTYzMjM0Mjl9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=SGA54MFpy4jaqKJHKEuxRfjk-~NBFAh1tdW9Y6uYJwc0LFjDDgX1sraerSyohmVhj~-QVIrglY5BvglDIhrFcLJWGTkgj4vhyLprk1a7EDckv0HBgp-k1ZKvoDtt3wBOzrL4GicfXBkuMpIu5jv5MY3xemlJj2a6V~h65XJuLO4u-xS~McH6rS3mRxoNl4GcYUVm4upre1DGQx-5Suy6Ateoxl6xxoF8kg5EL02KxkIGiRpwXJTvVmUuVF0rpBj-IE40MfmhLBQ1NNSXiqb3-HjpkKwhYPvB5APVh23mzGmqJ0P3jbr2F1cU4Jvlqsjb6GVP61wGOz9ITeWPZkOy8A__'
123
+ },
124
+ client: {
125
+ id: '03540d70-1c75-4867-a235-bac842ed6ce4',
126
+ name: 'Vouch',
127
+ logoSrc: 'https://logo.clearbit.com/vouchfor.com?size=260'
128
+ },
129
+ contact: {
130
+ id: 'b62f62a3-0cd4-4512-9b52-121cb2f3e72f',
131
+ name: 'Aaron Williams',
132
+ roleTitle: 'Software Engineer'
133
+ },
134
+ captions: {
135
+ current:
136
+ 'WEBVTT\r\n\r\n1\r\n00:00:00.709 --> 00:00:03.059\r\npriorities for this business. Uh, for\r\n\r\n2\r\n00:00:03.069 --> 00:00:06.010\r\nthis quarter, uh, to make more money,\r\n\r\n3\r\n00:00:06.019 --> 00:00:09.050\r\nmore profits, Uh, get everything, uh,\r\n\r\n4\r\n00:00:09.069 --> 00:00:13.439\r\nswept away. All our heuristics should be\r\n\r\n5\r\n00:00:13.529 --> 00:00:15.119\r\ntop of the line.\r\n'
137
+ }
138
+ }
139
+ },
140
+ {
141
+ id: '39fd188d-a4dc-43b9-bac8-32fd71bfbc90',
142
+ title: 'What are your biggest pain points?',
143
+ answer: {
144
+ id: '39fd188d-a4dc-43b9-bac8-32fd71bfbc90',
145
+ label: null,
146
+ metadata: {
147
+ duration: 13.792
148
+ },
149
+ settings: {
150
+ endOffset: 0,
151
+ startOffset: 0
152
+ },
153
+ media: {
154
+ input:
155
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/39fd188d-a4dc-43b9-bac8-32fd71bfbc90/39fd188d-a4dc-43b9-bac8-32fd71bfbc90_input.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
156
+ video:
157
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/39fd188d-a4dc-43b9-bac8-32fd71bfbc90/39fd188d-a4dc-43b9-bac8-32fd71bfbc90.mp4?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
158
+ playlist:
159
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/39fd188d-a4dc-43b9-bac8-32fd71bfbc90/39fd188d-a4dc-43b9-bac8-32fd71bfbc90.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTQ1NDI2MzV9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=vh-ZjBnHDhIIKRe4vr8GHppegY2VIRwXvC~QdX8aV9b5eylmQ~I~EmQ2MKwLOWuQ14DHOF~GU8oAfjXTMWgmZdeu1YzHkDHpQzi1b~NLgipJmpYe9-9OR67MC8jvNTva6OQ5PKsdN6tQBn9vWbBOP5gXEMZLtBP1tsopNu7ZpaUduyPiSVIH5VlWi~KRvMRZnQpHWxfVvnvvxifuk8bODDHh1Ba7MJxrAkdoskzP7xVYO3NbROscTPZ5tKnK9SVt2tnpdW0Aqxj1e2kH6WJhqwgxFfCDqDojMEesx-om71R99U0hMjwDHUF~EDEk6L6wrmD0OfXxbeKd-g5FoTPdJg__',
160
+ thumbnail:
161
+ 'https://d2rxhdlm2q91uk.cloudfront.net/TVik9uTMgE/6JQEIPeStt/39fd188d-a4dc-43b9-bac8-32fd71bfbc90/39fd188d-a4dc-43b9-bac8-32fd71bfbc90_poster.0000001.jpg?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cHM6Ly9kMnJ4aGRsbTJxOTF1ay5jbG91ZGZyb250Lm5ldC9UVmlrOXVUTWdFLyoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjIwMTYzMjM0Mjl9fX1dfQ__&Key-Pair-Id=K2SWKOH0FA5F6M&Signature=SGA54MFpy4jaqKJHKEuxRfjk-~NBFAh1tdW9Y6uYJwc0LFjDDgX1sraerSyohmVhj~-QVIrglY5BvglDIhrFcLJWGTkgj4vhyLprk1a7EDckv0HBgp-k1ZKvoDtt3wBOzrL4GicfXBkuMpIu5jv5MY3xemlJj2a6V~h65XJuLO4u-xS~McH6rS3mRxoNl4GcYUVm4upre1DGQx-5Suy6Ateoxl6xxoF8kg5EL02KxkIGiRpwXJTvVmUuVF0rpBj-IE40MfmhLBQ1NNSXiqb3-HjpkKwhYPvB5APVh23mzGmqJ0P3jbr2F1cU4Jvlqsjb6GVP61wGOz9ITeWPZkOy8A__'
162
+ },
163
+ client: {
164
+ id: '03540d70-1c75-4867-a235-bac842ed6ce4',
165
+ name: 'Vouch',
166
+ logoSrc: 'https://logo.clearbit.com/vouchfor.com?size=260'
167
+ },
168
+ contact: {
169
+ id: 'b62f62a3-0cd4-4512-9b52-121cb2f3e72f',
170
+ name: 'Aaron Williams',
171
+ roleTitle: 'Software Engineer'
172
+ },
173
+ captions: {
174
+ current:
175
+ "WEBVTT\r\n\r\n1\r\n00:00:00.790 --> 00:00:03.269\r\nuh, the biggest pain points this this\r\n\r\n2\r\n00:00:03.279 --> 00:00:07.170\r\nquarter. Um, Jerry has been doing the\r\n\r\n3\r\n00:00:07.179 --> 00:00:09.180\r\nworst work that he's ever been doing.\r\n\r\n4\r\n00:00:09.390 --> 00:00:11.680\r\nAnd we must fire him, Jerry. Goodbye,\r\n\r\n5\r\n00:00:11.689 --> 00:00:12.149\r\nJerry.\r\n"
176
+ }
177
+ }
178
+ }
179
+ ]
180
+ }
181
+ } as Vouch;
182
+
183
+ export { data };
package/src/index.ts CHANGED
@@ -1 +1,2 @@
1
- export { Embed } from '~/components/Embed';
1
+ export { PlayerEmbed } from '~/components/PlayerEmbed';
2
+ export { DialogEmbed } from '~/components/DialogEmbed';
@@ -1,28 +0,0 @@
1
- import type { Embed } from '..';
2
- import type { ReactiveController, ReactiveControllerHost } from 'lit';
3
- type EmbedHost = ReactiveControllerHost & Embed;
4
- declare class TrackingController implements ReactiveController {
5
- host: EmbedHost;
6
- private _tabId;
7
- private _clientId;
8
- private _visitorId;
9
- private _hasPlayed;
10
- private _hasLoaded;
11
- private _answersViewed;
12
- private _streamedTime;
13
- private _streamedPrevTimestamp;
14
- constructor(host: EmbedHost);
15
- private _findVouchId;
16
- private _createVisitor;
17
- private _getUids;
18
- private _getReportingMetadata;
19
- private _sendTrackingEvent;
20
- private _handleVouchLoaded;
21
- private _handlePlay;
22
- private _handleVideoPlay;
23
- private _handleVideoTimeUpdate;
24
- private _handleVideoPause;
25
- hostConnected(): void;
26
- hostDisconnected(): void;
27
- }
28
- export { TrackingController };
@@ -1 +0,0 @@
1
- export { Embed } from './components/Embed';
@@ -1,113 +0,0 @@
1
- import { Task } from '@lit/task';
2
-
3
- import type { Embed, EmbedProps } from '..';
4
- import type { ReactiveControllerHost } from 'lit';
5
- import type { Environment } from '~/utils/env';
6
-
7
- import { getEnvUrls } from '~/utils/env';
8
-
9
- type EmbedHost = ReactiveControllerHost & Embed;
10
-
11
- type TaskDeps = [
12
- EmbedProps['env'],
13
- EmbedProps['apiKey'],
14
- EmbedProps['data'],
15
- EmbedProps['vouchId'],
16
- EmbedProps['templateId']
17
- ];
18
-
19
- class FetcherController {
20
- host: EmbedHost;
21
-
22
- private _fetching = false;
23
-
24
- set fetching(value) {
25
- if (this._fetching !== value) {
26
- this._fetching = value;
27
- this.host.requestUpdate();
28
- }
29
- }
30
- get fetching() {
31
- return this._fetching;
32
- }
33
-
34
- private getVouch = async (env: Environment, apiKey: string, vouchId: string) => {
35
- const { embedApiUrl } = getEnvUrls(env);
36
-
37
- const vouch = await fetch(`${embedApiUrl}/vouches/${vouchId}`, {
38
- method: 'GET',
39
- headers: [['X-Api-Key', apiKey]]
40
- }).then((response) => {
41
- this.host.dispatchEvent(new CustomEvent('vouch:loaded', { detail: vouchId }));
42
- return response.json();
43
- });
44
-
45
- // HACK: trigger another fetch after we received the data to update the cache in the background
46
- fetch(`${embedApiUrl}/vouches/${vouchId}`, {
47
- method: 'GET',
48
- headers: [
49
- ['X-Api-Key', apiKey],
50
- ['Cache-Control', 'max-age=0']
51
- ]
52
- });
53
-
54
- return vouch;
55
- };
56
-
57
- private getTemplate = async (env: Environment, apiKey: string, templateId: string) => {
58
- const { embedApiUrl } = getEnvUrls(env);
59
-
60
- const template = await fetch(`${embedApiUrl}/templates/${templateId}`, {
61
- method: 'GET',
62
- headers: [['X-Api-Key', apiKey]]
63
- }).then((response) => response.json());
64
-
65
- // HACK: trigger another fetch after we received the data to update the cache in the background
66
- fetch(`${embedApiUrl}/templates/${templateId}`, {
67
- method: 'GET',
68
- headers: [
69
- ['X-Api-Key', apiKey],
70
- ['Cache-Control', 'max-age=0']
71
- ]
72
- });
73
-
74
- return template;
75
- };
76
-
77
- constructor(host: EmbedHost) {
78
- this.host = host;
79
- new Task<TaskDeps, void>(
80
- this.host,
81
- async ([env, apiKey, data, vouchId, templateId]: TaskDeps) => {
82
- try {
83
- host.vouch = undefined;
84
- host.template = undefined;
85
-
86
- if (data) {
87
- let template;
88
- if (templateId) {
89
- this.fetching = true;
90
- template = await this.getTemplate(env, apiKey, templateId);
91
- }
92
- host.vouch = data;
93
- host.template = template ?? data?.settings?.template?.instance;
94
- } else if (vouchId) {
95
- this.fetching = true;
96
-
97
- const [vouch, template] = await Promise.all([
98
- this.getVouch(env, apiKey, vouchId),
99
- templateId ? this.getTemplate(env, apiKey, templateId) : null
100
- ]);
101
- host.vouch = vouch;
102
- host.template = template ?? vouch?.settings?.template?.instance;
103
- }
104
- } finally {
105
- this.fetching = false;
106
- }
107
- },
108
- () => [host.env, host.apiKey, host.data, host.vouchId, host.templateId]
109
- );
110
- }
111
- }
112
-
113
- export { FetcherController };
@@ -1,261 +0,0 @@
1
- import { v4 as uuidv4 } from 'uuid';
2
-
3
- import type { Embed } from '..';
4
- import type { VideoEventDetail } from '@vouchfor/media-player';
5
- import type { ReactiveController, ReactiveControllerHost } from 'lit';
6
-
7
- import { getEnvUrls } from '~/utils/env';
8
-
9
- const STREAMED_THROTTLE = 2000;
10
-
11
- type EmbedHost = ReactiveControllerHost & Embed;
12
-
13
- type TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';
14
- type TrackingPayload = {
15
- vouchId: string;
16
- answerId?: string;
17
- streamStart?: number;
18
- streamEnd?: number;
19
- };
20
-
21
- type TimeMap = {
22
- [key: string]: number;
23
- };
24
-
25
- type BooleanMap = {
26
- [key: string]: boolean;
27
- };
28
-
29
- class TrackingController implements ReactiveController {
30
- host: EmbedHost;
31
-
32
- private _tabId: string | undefined = undefined;
33
- private _clientId: string | undefined = undefined;
34
- private _visitorId: string | undefined = undefined;
35
-
36
- private _hasPlayed = false;
37
- private _hasLoaded: BooleanMap = {};
38
- private _answersViewed: BooleanMap = {};
39
- private _streamedTime: TimeMap = {};
40
- private _streamedPrevTimestamp: TimeMap = {};
41
-
42
- constructor(host: EmbedHost) {
43
- this.host = host;
44
- host.addController(this);
45
- }
46
-
47
- private _findVouchId() {
48
- if (this.host.data) {
49
- if ('uuid' in this.host.data) {
50
- return this.host.data.uuid;
51
- }
52
- return this.host.data.id;
53
- }
54
- }
55
-
56
- private _createVisitor = (visitorId: string) => {
57
- const { publicApiUrl } = getEnvUrls(this.host.env);
58
- window.localStorage?.setItem?.('vouch-uid-visitor', visitorId);
59
- navigator.sendBeacon(`${publicApiUrl}/api/visitor`, JSON.stringify({ visitorId }));
60
- return visitorId;
61
- };
62
-
63
- private _getUids() {
64
- if (typeof window === 'undefined') {
65
- return {
66
- client: null,
67
- tab: null,
68
- request: uuidv4()
69
- };
70
- }
71
-
72
- // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser
73
- const visitorId =
74
- this._visitorId || window.localStorage?.getItem?.('vouch-uid-visitor') || this._createVisitor(uuidv4());
75
- // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser
76
- const clientId = this._clientId || window.localStorage?.getItem?.('vouch-uid-client') || uuidv4();
77
- // Persisted in session storage, so we can search for everything the user has done in a specific tab
78
- const tabId = this._tabId || window.sessionStorage?.getItem?.('vouch-uid-tab') || uuidv4();
79
- // Not persisted, allows us to search for any logs related to a single FE request
80
- // E.g. BE should pass this request ID through all other services to be able to group logs
81
- const requestId = uuidv4();
82
-
83
- // Cache and persist uids
84
- if (visitorId !== this._visitorId) {
85
- this._visitorId = visitorId;
86
- window.localStorage?.setItem?.('vouch-uid-visitor', visitorId);
87
- }
88
-
89
- if (clientId !== this._clientId) {
90
- this._clientId = clientId;
91
- window.localStorage?.setItem?.('vouch-uid-client', clientId);
92
- }
93
-
94
- if (tabId !== this._tabId) {
95
- this._tabId = tabId;
96
- window.sessionStorage?.setItem?.('vouch-uid-tab', tabId);
97
- }
98
-
99
- return {
100
- client: clientId,
101
- tab: tabId,
102
- request: requestId,
103
- visitor: visitorId
104
- };
105
- }
106
-
107
- private _getReportingMetadata = () => {
108
- const [country, region] = Intl.DateTimeFormat().resolvedOptions().timeZone?.split?.('/') ?? [];
109
-
110
- const utmParams: any = {};
111
- [...new URLSearchParams(location.search).entries()].forEach(([key, value]) => {
112
- if (/utm/.test(key)) {
113
- const param = key.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());
114
- utmParams[param] = value;
115
- }
116
- });
117
-
118
- return {
119
- source: this.host.trackingSource,
120
- time: new Date(),
121
- region,
122
- country,
123
- screenHeight: window.screen.height,
124
- screenWidth: window.screen.width,
125
- referrer: document.referrer,
126
- currentUrl: location.href,
127
- ...utmParams
128
- };
129
- };
130
-
131
- private _sendTrackingEvent = (event: TrackingEvent, payload: TrackingPayload) => {
132
- const { publicApiUrl } = getEnvUrls(this.host.env);
133
- const { client, tab, request, visitor } = this._getUids();
134
-
135
- // Don't send tracking if we don't have a source
136
- navigator.sendBeacon(
137
- `${publicApiUrl}/api/events`,
138
- JSON.stringify({
139
- event,
140
- payload,
141
- context: {
142
- 'x-uid-client': client,
143
- 'x-uid-tab': tab,
144
- 'x-uid-request': request,
145
- 'x-uid-visitor': visitor,
146
- 'x-reporting-metadata': this._getReportingMetadata()
147
- }
148
- })
149
- );
150
- };
151
-
152
- private _handleVouchLoaded = ({ detail: vouchId }: CustomEvent<string>) => {
153
- if (!vouchId) {
154
- return;
155
- }
156
-
157
- // Only send loaded event once per session
158
- if (!this._hasLoaded[vouchId]) {
159
- this._sendTrackingEvent('VOUCH_LOADED', {
160
- vouchId
161
- });
162
- this._hasLoaded[vouchId] = true;
163
- }
164
- };
165
-
166
- private _handlePlay = () => {
167
- const vouchId = this._findVouchId();
168
-
169
- if (!vouchId) {
170
- return;
171
- }
172
-
173
- // Only send the video played event once per session
174
- if (!this._hasPlayed) {
175
- this._sendTrackingEvent('VIDEO_PLAYED', {
176
- vouchId,
177
- streamStart: this.host.currentTime
178
- });
179
- this._hasPlayed = true;
180
- }
181
- };
182
-
183
- private _handleVideoPlay = ({ detail: { id, node } }: CustomEvent<VideoEventDetail>) => {
184
- const vouchId = this._findVouchId();
185
- if (!vouchId) {
186
- return;
187
- }
188
- // Only increment play count once per session
189
- if (!this._answersViewed[id]) {
190
- this._sendTrackingEvent('VOUCH_RESPONSE_VIEWED', {
191
- vouchId,
192
- answerId: id
193
- });
194
- this._answersViewed[id] = true;
195
- }
196
- this._streamedTime[id] = node.currentTime;
197
- this._streamedPrevTimestamp[id] = Date.now();
198
- };
199
-
200
- private _handleVideoTimeUpdate = ({ detail: { id, node } }: CustomEvent<VideoEventDetail>) => {
201
- const vouchId = this._findVouchId();
202
- if (!vouchId) {
203
- return;
204
- }
205
- const currentTimestamp = Date.now();
206
- if (
207
- !this.host.paused &&
208
- // Only fire the video seeked event when this video is the active one
209
- id === this.host.scene?.video?.id &&
210
- // Throttle the frequency that we send streamed events while playing
211
- currentTimestamp - this._streamedPrevTimestamp[id] > STREAMED_THROTTLE
212
- ) {
213
- this._sendTrackingEvent('VIDEO_STREAMED', {
214
- vouchId,
215
- answerId: id,
216
- streamStart: this._streamedTime[id],
217
- streamEnd: node.currentTime
218
- });
219
- this._streamedTime[id] = node.currentTime;
220
- this._streamedPrevTimestamp[id] = currentTimestamp;
221
- }
222
- };
223
-
224
- private _handleVideoPause = ({ detail: { id, node } }: CustomEvent<VideoEventDetail>) => {
225
- const vouchId = this._findVouchId();
226
- if (!vouchId) {
227
- return;
228
- }
229
- // Send a video streamed event any time the video pauses then reset the streamed state
230
- // We do this to capture the last bit of time that the video was played between the previous
231
- // stream event and the video being paused manually or stopping because it ended
232
- this._sendTrackingEvent('VIDEO_STREAMED', {
233
- vouchId,
234
- answerId: id,
235
- streamStart: this._streamedTime[id],
236
- streamEnd: node.currentTime
237
- });
238
- delete this._streamedTime[id];
239
- delete this._streamedPrevTimestamp[id];
240
- };
241
-
242
- hostConnected() {
243
- requestAnimationFrame(() => {
244
- this.host.addEventListener('vouch:loaded', this._handleVouchLoaded);
245
- this.host.mediaPlayer?.addEventListener('play', this._handlePlay);
246
- this.host.mediaPlayer?.addEventListener('video:play', this._handleVideoPlay);
247
- this.host.mediaPlayer?.addEventListener('video:pause', this._handleVideoPause);
248
- this.host.mediaPlayer?.addEventListener('video:timeupdate', this._handleVideoTimeUpdate);
249
- });
250
- }
251
-
252
- hostDisconnected() {
253
- this.host.removeEventListener('vouch:loaded', this._handleVouchLoaded);
254
- this.host.mediaPlayer?.removeEventListener('play', this._handlePlay);
255
- this.host.mediaPlayer?.removeEventListener('video:play', this._handleVideoPlay);
256
- this.host.mediaPlayer?.removeEventListener('video:pause', this._handleVideoPause);
257
- this.host.mediaPlayer?.removeEventListener('video:timeupdate', this._handleVideoTimeUpdate);
258
- }
259
- }
260
-
261
- export { TrackingController };
File without changes
File without changes