@vouchfor/embeds 0.0.0-experiment.f12b60a → 0.0.0-experiment.f27fcf4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/es/embeds.js CHANGED
@@ -9,13 +9,13 @@ import "@vouchfor/media-player";
9
9
  import { styleMap } from "lit/directives/style-map.js";
10
10
  import { classMap } from "lit/directives/class-map.js";
11
11
  import "@a11y/focus-trap";
12
- function forwardEvent(type2, fromElement, toElement) {
12
+ function forwardEvent(type, fromElement, toElement) {
13
13
  function forwarder(event) {
14
14
  toElement.dispatchEvent(new CustomEvent(event.type, event));
15
15
  }
16
- fromElement.addEventListener(type2, forwarder);
16
+ fromElement.addEventListener(type, forwarder);
17
17
  return () => {
18
- fromElement.removeEventListener(type2, forwarder);
18
+ fromElement.removeEventListener(type, forwarder);
19
19
  };
20
20
  }
21
21
  class EventForwardController {
@@ -195,112 +195,9 @@ class FetcherController {
195
195
  return this._fetching;
196
196
  }
197
197
  }
198
- const name = "@vouchfor/embeds";
199
- const version = "0.0.0-experiment.f12b60a";
200
- const license = "MIT";
201
- const author = "Aaron Williams";
202
- const main = "dist/es/embeds.js";
203
- const module = "dist/es/embeds.js";
204
- const type = "module";
205
- const types = "dist/es/src/index.d.ts";
206
- const exports = {
207
- ".": "./dist/es/embeds.js"
208
- };
209
- const files = [
210
- "dist",
211
- "src"
212
- ];
213
- const publishConfig = {
214
- tag: "experiment",
215
- access: "public"
216
- };
217
- const engines = {
218
- node: ">=18.18.0"
219
- };
220
- const scripts = {
221
- build: "rm -rf dist && tsc && yarn build:self",
222
- "build:deps": "yarn --cwd ../media-player build",
223
- "build:self": "vite build --mode iife && vite build --mode es && node scripts/build.cjs",
224
- "build:package": "yarn build",
225
- "build:storybook": "yarn prebuild && storybook build",
226
- "generate:manifest": "wca src --outFile custom-elements.json",
227
- lint: "eslint . --quiet",
228
- "lint:fix": "eslint . --fix",
229
- "lint:staged": "lint-staged",
230
- prepublishOnly: "yarn build",
231
- size: "size-limit",
232
- storybook: "yarn prebuild && storybook dev -p 6007",
233
- prebuild: "yarn build:deps && yarn generate:manifest",
234
- test: "rm -rf test/lib && yarn prebuild && vite build --mode test && web-test-runner",
235
- "test:ci": "yarn test --config web-test-runner.ci.config.js",
236
- "test:watch": "yarn test --watch"
237
- };
238
- const dependencies = {
239
- "@a11y/focus-trap": "^1.0.5",
240
- "@lit/task": "^1.0.0",
241
- "@vouchfor/canvas-video": "0.0.0-experiment.f12b60a",
242
- "@vouchfor/media-player": "0.0.0-experiment.f12b60a",
243
- uuid: "^9.0.1"
244
- };
245
- const peerDependencies = {
246
- lit: "^3.1.2"
247
- };
248
- const devDependencies = {
249
- "@esm-bundle/chai": "^4.3.4-fix.0",
250
- "@open-wc/testing": "^4.0.0",
251
- "@storybook/addon-essentials": "^8.0.4",
252
- "@storybook/addon-links": "^8.0.4",
253
- "@storybook/blocks": "^8.0.4",
254
- "@storybook/web-components": "^8.0.4",
255
- "@storybook/web-components-vite": "^8.0.4",
256
- "@svgr/core": "^8.1.0",
257
- "@types/flat": "^5.0.5",
258
- "@types/mocha": "^10.0.6",
259
- "@vouchfor/eslint-config": "^1.0.1",
260
- "@vouchfor/prettier-config": "^1.0.1",
261
- "@vouchfor/video-utils": "0.0.0-experiment.f12b60a",
262
- "@web/dev-server-esbuild": "^1.0.2",
263
- "@web/test-runner": "^0.18.1",
264
- "@web/test-runner-browserstack": "^0.7.1",
265
- "@web/test-runner-mocha": "^0.9.0",
266
- "@web/test-runner-playwright": "^0.11.0",
267
- glob: "^10.3.10",
268
- "lint-staged": "^15.2.2",
269
- lit: "^3.1.2",
270
- lodash: "^4.17.21",
271
- react: "^18.2.0",
272
- "react-dom": "^18.2.0",
273
- "rollup-plugin-tla": "^0.0.2",
274
- sinon: "^17.0.1",
275
- storybook: "^8.0.4",
276
- svgson: "^5.3.1",
277
- typescript: "^5.4.3",
278
- vite: "^5.2.2",
279
- "vite-plugin-commonjs": "^0.10.1",
280
- "vite-plugin-dts": "^3.7.3",
281
- "web-component-analyzer": "^2.0.0"
282
- };
198
+ const version = "0.0.0-experiment.f27fcf4";
283
199
  const packageJson = {
284
- name,
285
- version,
286
- license,
287
- author,
288
- main,
289
- module,
290
- type,
291
- types,
292
- exports,
293
- files,
294
- publishConfig,
295
- engines,
296
- scripts,
297
- "lint-staged": {
298
- "**/*.{ts,tsx,js}": "eslint --fix --quiet",
299
- "**/*.{md,json,yml}": "prettier --write"
300
- },
301
- dependencies,
302
- peerDependencies,
303
- devDependencies
200
+ version
304
201
  };
305
202
  function createVisitor(env) {
306
203
  const { publicApiUrl } = getEnvUrls(env);
@@ -533,8 +430,7 @@ var __decorateClass$3 = (decorators, target, key, kind) => {
533
430
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
534
431
  if (decorator = decorators[i])
535
432
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
536
- if (kind && result)
537
- __defProp$3(target, key, result);
433
+ if (kind && result) __defProp$3(target, key, result);
538
434
  return result;
539
435
  };
540
436
  let PlayerEmbed = class extends LitElement {
@@ -783,8 +679,7 @@ var __decorateClass$2 = (decorators, target, key, kind) => {
783
679
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
784
680
  if (decorator = decorators[i])
785
681
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
786
- if (kind && result)
787
- __defProp$2(target, key, result);
682
+ if (kind && result) __defProp$2(target, key, result);
788
683
  return result;
789
684
  };
790
685
  let DialogOverlay = class extends LitElement {
@@ -911,8 +806,7 @@ var __decorateClass$1 = (decorators, target, key, kind) => {
911
806
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
912
807
  if (decorator = decorators[i])
913
808
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
914
- if (kind && result)
915
- __defProp$1(target, key, result);
809
+ if (kind && result) __defProp$1(target, key, result);
916
810
  return result;
917
811
  };
918
812
  let DialogPortal = class extends LitElement {
@@ -1042,8 +936,7 @@ var __decorateClass = (decorators, target, key, kind) => {
1042
936
  for (var i = decorators.length - 1, decorator; i >= 0; i--)
1043
937
  if (decorator = decorators[i])
1044
938
  result = (kind ? decorator(target, key, result) : decorator(result)) || result;
1045
- if (kind && result)
1046
- __defProp(target, key, result);
939
+ if (kind && result) __defProp(target, key, result);
1047
940
  return result;
1048
941
  };
1049
942
  let DialogEmbed = class extends LitElement {
@@ -1 +1 @@
1
- {"version":3,"file":"embeds.js","sources":["../../src/utils/events.ts","../../src/components/PlayerEmbed/controllers/event-forwarder.ts","../../src/utils/env.ts","../../src/components/PlayerEmbed/controllers/fetcher.ts","../../src/components/PlayerEmbed/controllers/tracking/utils.ts","../../src/components/PlayerEmbed/controllers/tracking/index.ts","../../src/components/PlayerEmbed/index.ts","../../src/components/DialogEmbed/DialogOverlay.ts","../../src/components/DialogEmbed/DialogPortal.ts","../../src/components/DialogEmbed/index.ts"],"sourcesContent":["function forwardEvent(type: string, fromElement: HTMLElement, toElement: HTMLElement) {\n function forwarder(event: Event) {\n toElement.dispatchEvent(new CustomEvent(event.type, event));\n }\n\n fromElement.addEventListener(type, forwarder);\n\n return () => {\n fromElement.removeEventListener(type, forwarder);\n };\n}\n\nexport { forwardEvent };\n","import { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { PlayerEmbed } from '..';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { DirectiveResult } from 'lit/directive.js';\nimport type { Ref } from 'lit/directives/ref.js';\n\nimport { forwardEvent } from '~/utils/events';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\nclass EventForwardController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _events: string[] = [];\n private _cleanup: (() => void)[] = [];\n private _forwardElementRef: Ref<HTMLElement> = createRef();\n\n constructor(host: PlayerEmbedHost, events: string[]) {\n this.host = host;\n this._events = events;\n host.addController(this);\n }\n\n register(): DirectiveResult {\n return ref(this._forwardElementRef);\n }\n\n hostConnected() {\n // Guaranteed to have the element ref in the RAF callback because of how the lit lifecycle works\n requestAnimationFrame(() => {\n this._events.forEach((event) => {\n if (this._forwardElementRef.value) {\n this._cleanup.push(forwardEvent(event, this._forwardElementRef.value, this.host));\n }\n });\n });\n }\n\n hostDisconnected() {\n this._cleanup.forEach((fn) => {\n fn();\n });\n this._cleanup = [];\n }\n}\n\nexport { EventForwardController };\n","type Environment = 'local' | 'dev' | 'staging' | 'prod';\n\ntype GetEnvUrlsReturn = {\n videoUrl: string;\n publicApiUrl: string;\n embedApiUrl: string;\n};\n\nconst devVideoUrl = 'https://d2rxhdlm2q91uk.cloudfront.net';\nconst stagingVideoUrl = 'https://d1ix11aj5kfygl.cloudfront.net';\nconst prodVideoUrl = 'https://d157jlwnudd93d.cloudfront.net';\n\nconst devPublicApiUrl = 'https://bshyfw4h5a.execute-api.ap-southeast-2.amazonaws.com/dev';\nconst stagingPublicApiUrl = 'https://gyzw7rpbq3.execute-api.ap-southeast-2.amazonaws.com/staging';\nconst prodPublicApiUrl = 'https://vfcjuim1l3.execute-api.ap-southeast-2.amazonaws.com/prod';\n\nconst localEmbedApiUrl = 'http://localhost:6060/v2';\nconst devEmbedApiUrl = 'https://embed-dev.vouchfor.com/v2';\nconst stagingEmbedApiUrl = 'https://embed-staging.vouchfor.com/v2';\nconst prodEmbedApiUrl = 'https://embed.vouchfor.com/v2';\n\n// We are handling the case where env is an unknown string so the ts error is a lie\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nfunction getEnvUrls(env: Environment): GetEnvUrlsReturn {\n if (!['local', 'dev', 'staging', 'prod'].includes(env)) {\n throw new Error(`Unknown environment: ${env}`);\n }\n\n if (env === 'local') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: localEmbedApiUrl\n };\n }\n\n if (env === 'dev') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: devEmbedApiUrl\n };\n }\n\n if (env === 'staging') {\n return {\n videoUrl: stagingVideoUrl,\n publicApiUrl: stagingPublicApiUrl,\n embedApiUrl: stagingEmbedApiUrl\n };\n }\n\n if (env === 'prod') {\n return {\n videoUrl: prodVideoUrl,\n publicApiUrl: prodPublicApiUrl,\n embedApiUrl: prodEmbedApiUrl\n };\n }\n}\n\nexport { devEmbedApiUrl, stagingEmbedApiUrl, prodEmbedApiUrl, getEnvUrls };\nexport type { Environment };\n","import { Task } from '@lit/task';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbed, PlayerEmbedProps } from '..';\nimport type { ReactiveControllerHost } from 'lit';\nimport type { Environment } from '~/utils/env';\n\nimport { getEnvUrls } from '~/utils/env';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype FetchTaskDeps = [\n PlayerEmbedProps['env'],\n PlayerEmbedProps['apiKey'],\n PlayerEmbedProps['data'],\n PlayerEmbedProps['vouchId'],\n PlayerEmbedProps['templateId']\n];\n\ntype FilterTaskDeps = [PlayerEmbedProps['data'], PlayerEmbedProps['questions']];\n\nclass FetcherController {\n host: PlayerEmbedHost;\n\n private _fetching = false;\n private _vouch: PlayerEmbedProps['data'];\n\n set fetching(value) {\n if (this._fetching !== value) {\n this._fetching = value;\n this.host.requestUpdate();\n }\n }\n get fetching() {\n return this._fetching;\n }\n\n private getVouch = async (env: Environment, apiKey: string, vouchId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n\n const vouch = await res.json();\n this.host.dispatchEvent(new CustomEvent('vouch:loaded', { detail: vouch?.id }));\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return vouch;\n };\n\n private getTemplate = async (env: Environment, apiKey: string, templateId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n const template = await res.json();\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return template;\n };\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n new Task<FetchTaskDeps, void>(\n this.host,\n async ([env, apiKey, data, vouchId, templateId]: FetchTaskDeps) => {\n try {\n host.vouch = undefined;\n host.template = undefined;\n\n if (data) {\n let template;\n if (templateId) {\n this.fetching = true;\n template = await this.getTemplate(env, apiKey, templateId);\n }\n this._vouch = data;\n host.template = template ?? data?.settings?.template?.instance;\n } else if (vouchId) {\n this.fetching = true;\n\n const [vouch, template] = await Promise.all([\n this.getVouch(env, apiKey, vouchId),\n templateId ? this.getTemplate(env, apiKey, templateId) : null\n ]);\n this._vouch = vouch;\n host.template = template ?? vouch?.settings?.template?.instance;\n }\n } finally {\n this.fetching = false;\n }\n },\n () => [host.env, host.apiKey, host.data, host.vouchId, host.templateId]\n );\n\n // This second task is to be able to filter the vouch without fetching it again if only the questions changed\n new Task<FilterTaskDeps, void>(\n this.host,\n ([vouch, questions]: FilterTaskDeps) => {\n host.vouch = vouch\n ? {\n ...vouch,\n questions: {\n items: vouch?.questions.items.filter((_, index) => !questions?.length || questions?.includes(index + 1))\n }\n }\n : undefined;\n },\n () => [this._vouch, host.questions]\n );\n }\n}\n\nexport { FetcherController };\n","import { TEMPLATE_VERSION } from '@vouchfor/canvas-video';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { TrackingPayload } from '.';\nimport type { Vouch } from '@vouchfor/video-utils';\nimport type { Environment } from '~/utils/env';\n\nimport packageJson from '~/../package.json';\nimport { getEnvUrls } from '~/utils/env';\n\nfunction createVisitor(env: Environment) {\n const { publicApiUrl } = getEnvUrls(env);\n const visitorId = uuidv4();\n navigator.sendBeacon(`${publicApiUrl}/api/visitor`, JSON.stringify({ visitorId }));\n return visitorId;\n}\n\nfunction getUids(env: Environment) {\n if (typeof window === 'undefined') {\n return {\n client: null,\n tab: null,\n request: uuidv4()\n };\n }\n\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let visitorId = window.localStorage?.getItem?.('vouch-uid-visitor');\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let clientId = window.localStorage?.getItem?.('vouch-uid-client');\n // Persisted in session storage, so we can search for everything the user has done in a specific tab\n let tabId = window.sessionStorage?.getItem?.('vouch-uid-tab');\n // Not persisted, allows us to search for any logs related to a single FE request\n // E.g. BE should pass this request ID through all other services to be able to group logs\n const requestId = uuidv4();\n\n // Cache uids\n if (!visitorId) {\n visitorId = createVisitor(env);\n window.localStorage?.setItem?.('vouch-uid-visitor', visitorId);\n }\n\n if (!clientId) {\n clientId = uuidv4();\n window.localStorage?.setItem?.('vouch-uid-client', clientId);\n }\n\n if (!tabId) {\n tabId = uuidv4();\n window.sessionStorage?.setItem?.('vouch-uid-tab', tabId);\n }\n\n return {\n client: clientId,\n tab: tabId,\n request: requestId,\n visitor: visitorId\n };\n}\n\nfunction findVouchId(payload?: TrackingPayload, vouch?: Vouch) {\n if (payload && 'vouchId' in payload) {\n return payload.vouchId;\n }\n return vouch?.id ?? null;\n}\n\nfunction getReportingMetadata(source = 'embedded_player') {\n const [country, region] = Intl.DateTimeFormat().resolvedOptions().timeZone?.split?.('/') ?? [];\n\n const utmParams: any = {};\n [...new URLSearchParams(location.search).entries()].forEach(([key, value]) => {\n if (/utm/.test(key)) {\n const param = key.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\n utmParams[param] = value;\n }\n });\n\n return {\n source,\n time: new Date(),\n region,\n country,\n screenHeight: window.screen.height,\n screenWidth: window.screen.width,\n referrer: document.referrer,\n currentUrl: location.href,\n embedType: 'media-player-embed',\n embedVersion: packageJson.version,\n templateVersion: TEMPLATE_VERSION,\n ...utmParams\n };\n}\n\nexport { getUids, findVouchId, getReportingMetadata };\n","import type { PlayerEmbed } from '../..';\nimport type { MediaEventDetail } from '@vouchfor/media-player';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { findVouchId, getReportingMetadata, getUids } from './utils';\nimport { getEnvUrls } from '~/utils/env';\n\nconst MINIMUM_SEND_THRESHOLD = 1;\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';\ntype TrackingPayload = {\n vouchId?: string;\n answerId?: string;\n streamStart?: number;\n streamEnd?: number;\n};\n\ntype BatchEvent = {\n event: TrackingEvent;\n payload: TrackingPayload & {\n time: string;\n };\n};\n\ntype TimeMap = {\n [key: string]: number;\n};\n\ntype BooleanMap = {\n [key: string]: boolean;\n};\n\nclass TrackingController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _batchedEvents: BatchEvent[] = [];\n private _hasPlayed = false;\n private _hasLoaded: BooleanMap = {};\n private _answersViewed: BooleanMap = {};\n private _streamStartTime: TimeMap = {};\n private _streamLatestTime: TimeMap = {};\n private _currentlyPlayingVideo: MediaEventDetail | null = null;\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n host.addController(this);\n }\n\n private _createTrackingEvent = (event: TrackingEvent, payload?: TrackingPayload) => {\n const vouchId = findVouchId(payload, this.host.vouch);\n\n if (!vouchId || this.host.disableTracking) {\n return;\n }\n\n this._batchedEvents.push({\n event,\n payload: {\n ...payload,\n vouchId,\n time: new Date().toISOString()\n }\n });\n };\n\n private _sendTrackingEvent = () => {\n if (this._batchedEvents.length <= 0) {\n return;\n }\n\n const { publicApiUrl } = getEnvUrls(this.host.env);\n const { client, tab, request, visitor } = getUids(this.host.env);\n\n navigator.sendBeacon(\n `${publicApiUrl}/api/batchevents`,\n JSON.stringify({\n payload: {\n events: this._batchedEvents\n },\n context: {\n 'x-uid-client': client,\n 'x-uid-tab': tab,\n 'x-uid-request': request,\n 'x-uid-visitor': visitor,\n 'x-reporting-metadata': getReportingMetadata(this.host.trackingSource)\n }\n })\n );\n\n this._batchedEvents = [];\n };\n\n private _streamEnded = () => {\n if (this._currentlyPlayingVideo) {\n const { id, key } = this._currentlyPlayingVideo;\n // Don't send a tracking event when seeking backwards\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n // Send a video streamed event any time the stream ends to capture the time between starting\n // the video and the video stopping for any reason (pausing, deleting the embed node or closing the browser)\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n\n // Make sure these events are only sent once by deleting the start and latest times\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n }\n };\n\n private _handleVouchLoaded = ({ detail: vouchId }: CustomEvent<string>) => {\n if (!vouchId) {\n return;\n }\n\n // Only send loaded event once per session\n if (!this._hasLoaded[vouchId]) {\n this._createTrackingEvent('VOUCH_LOADED', { vouchId });\n this._hasLoaded[vouchId] = true;\n }\n };\n\n private _handlePlay = () => {\n // Only send the video played event once per session\n if (!this._hasPlayed) {\n this._createTrackingEvent('VIDEO_PLAYED', {\n streamStart: this.host.currentTime\n });\n this._hasPlayed = true;\n }\n };\n\n private _handleVideoPlay = ({ detail: { id, key } }: CustomEvent<MediaEventDetail>) => {\n // Only increment play count once per session\n if (!this._answersViewed[key]) {\n this._createTrackingEvent('VOUCH_RESPONSE_VIEWED', {\n answerId: id\n });\n this._answersViewed[key] = true;\n }\n };\n\n private _handleVideoTimeUpdate = ({ detail: { id, key, node } }: CustomEvent<MediaEventDetail>) => {\n if (\n // We only want to count any time that the video is actually playing\n !this.host.paused\n // Only update the latest time if this event fires for the currently active video\n // id === this.host.scene?.video?.id\n ) {\n this._currentlyPlayingVideo = { id, key, node };\n this._streamLatestTime[key] = node.currentTime;\n\n if (!this._streamStartTime[key]) {\n this._streamStartTime[key] = node.currentTime;\n this._streamLatestTime[key] = node.currentTime;\n }\n }\n };\n\n private _handleVideoPause = ({ detail: { id, key } }: CustomEvent<MediaEventDetail>) => {\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n };\n\n private _pageUnloading = () => {\n this._streamEnded();\n this._sendTrackingEvent();\n };\n\n private _handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._pageUnloading();\n }\n };\n\n private _handlePageHide = () => {\n this._pageUnloading();\n };\n\n hostConnected() {\n requestAnimationFrame(() => {\n if ('onvisibilitychange' in document) {\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.addEventListener('pagehide', this._handlePageHide);\n }\n this.host.addEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.addEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.addEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.addEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.addEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n });\n }\n\n hostDisconnected() {\n // Send events if DOM node is destroyed\n this._pageUnloading();\n\n if ('onvisibilitychange' in document) {\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.removeEventListener('pagehide', this._handlePageHide);\n }\n this.host.removeEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.removeEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.removeEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.removeEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.removeEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n }\n}\n\nexport { TrackingController };\nexport type { TrackingEvent, TrackingPayload };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { TemplateInstance } from '@vouchfor/canvas-video';\nimport type { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';\nimport type { Vouch } from '@vouchfor/video-utils';\nimport type { PropertyValueMap } from 'lit';\nimport type { Environment } from '~/utils/env';\n\nimport { EventForwardController } from './controllers/event-forwarder';\nimport { FetcherController } from './controllers/fetcher';\nimport { TrackingController } from './controllers/tracking';\n\nimport '@vouchfor/media-player';\n\ntype PlayerEmbedProps = Pick<MediaPlayerProps, 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'> & {\n data?: Vouch;\n env: Environment;\n apiKey: string;\n disableTracking?: boolean;\n trackingSource?: string;\n vouchId?: string;\n templateId?: string;\n // Index of the questions to include starting from 1\n questions?: number[];\n};\n\n@customElement('vouch-embed-player')\nclass PlayerEmbed extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n `\n ];\n\n @property({ type: Object }) data: PlayerEmbedProps['data'];\n @property({ type: String }) vouchId: PlayerEmbedProps['vouchId'];\n @property({ type: String }) templateId: PlayerEmbedProps['templateId'];\n @property({ type: Array }) questions: PlayerEmbedProps['questions'];\n\n @property({ type: String }) env: PlayerEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: PlayerEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: PlayerEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: PlayerEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: PlayerEmbedProps['controls'];\n @property({ type: String }) preload: PlayerEmbedProps['preload'] = 'auto';\n @property({ type: Boolean }) autoplay: PlayerEmbedProps['autoplay'] = false;\n @property({ type: Number }) aspectRatio: PlayerEmbedProps['aspectRatio'] = 0;\n @property({ type: String }) language?: MediaPlayerProps['language'];\n\n private eventController = new EventForwardController(this, [\n 'durationchange',\n 'ended',\n 'error',\n 'loadeddata',\n 'pause',\n 'stalled',\n 'play',\n 'playing',\n 'ratechange',\n 'scenechange',\n 'scenesupdate',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'volumechange',\n 'processing',\n 'waiting',\n\n 'video:loadeddata',\n 'video:seeking',\n 'video:seeked',\n 'video:play',\n 'video:playing',\n 'video:pause',\n 'video:stalled',\n 'video:timeupdate',\n 'video:ended',\n 'video:error'\n ]);\n private _fetcherController = new FetcherController(this);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n private _trackingController = new TrackingController(this);\n\n @state() vouch: PlayerEmbedProps['data'];\n @state() template: TemplateInstance | undefined;\n\n get fetching() {\n return this._fetcherController.fetching;\n }\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n get waiting() {\n return this._mediaPlayerRef.value?.waiting;\n }\n\n get initialised() {\n return this._mediaPlayerRef.value?.initialised;\n }\n\n get seeking() {\n return this._mediaPlayerRef.value?.seeking;\n }\n\n get paused() {\n return this._mediaPlayerRef.value?.paused;\n }\n\n get captions() {\n return this._mediaPlayerRef.value?.captions;\n }\n\n get fullscreen() {\n return this._mediaPlayerRef.value?.fullscreen;\n }\n\n get duration() {\n return this._mediaPlayerRef.value?.duration;\n }\n\n set currentTime(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.currentTime = value;\n }\n }\n get currentTime() {\n return this._mediaPlayerRef.value?.currentTime ?? 0;\n }\n\n set playbackRate(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.playbackRate = value;\n }\n }\n get playbackRate() {\n return this._mediaPlayerRef.value?.playbackRate ?? 1;\n }\n\n set volume(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.volume = value;\n }\n }\n get volume() {\n return this._mediaPlayerRef.value?.volume ?? 1;\n }\n\n set muted(value: boolean) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.muted = value;\n }\n }\n get muted() {\n return this._mediaPlayerRef.value?.muted ?? false;\n }\n\n // get scene(): Scene | null {\n // return this._mediaPlayerRef.value?.scene ?? null;\n // }\n\n // get scenes(): Scene[] {\n // return this._mediaPlayerRef.value?.scenes ?? [];\n // }\n\n // get sceneConfig(): Scenes | null {\n // return this._mediaPlayerRef.value?.sceneConfig ?? null;\n // }\n\n get mediaState() {\n return this._mediaPlayerRef.value?.mediaState;\n }\n\n get mediaPlayer() {\n return this._mediaPlayerRef.value;\n }\n\n play() {\n this._mediaPlayerRef.value?.play();\n }\n\n pause() {\n this._mediaPlayerRef.value?.pause();\n }\n\n reset(time = 0, play = false) {\n this._mediaPlayerRef.value?.reset(time, play);\n }\n\n // setScene(index: number) {\n // this._mediaPlayerRef.value?.setScene(index);\n // }\n\n private _renderStyles() {\n if (!this.aspectRatio) {\n return html`\n <style>\n :host {\n width: 100%;\n height: 100%;\n }\n </style>\n `;\n }\n\n if (typeof this.aspectRatio === 'number') {\n return html`\n <style>\n :host {\n aspect-ratio: ${this.aspectRatio};\n }\n </style>\n `;\n }\n\n return null;\n }\n\n protected willUpdate(changedProperties: PropertyValueMap<PlayerEmbedProps>) {\n // If the vouch this embed is pointing to changes then reset the player\n if (changedProperties.has('vouchId') && this.vouchId !== changedProperties.get('vouchId')) {\n this.reset(0, false);\n }\n }\n\n render() {\n return html`\n ${this._renderStyles()}\n <vmp-media-player\n ${ref(this._mediaPlayerRef)}\n ${this.eventController.register()}\n ?autoplay=${this.autoplay}\n ?loading=${this.fetching}\n aspectRatio=${ifDefined(this.aspectRatio)}\n preload=${ifDefined(this.preload)}\n language=${ifDefined(this.language)}\n .controls=${this.controls}\n ></vmp-media-player>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-player': PlayerEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-player': PlayerEmbed;\n }\n }\n}\n\nexport { PlayerEmbed };\nexport type { PlayerEmbedProps };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\n\nimport '@a11y/focus-trap';\n\n@customElement('vouch-embed-dialog-overlay')\nclass DialogOverlay extends LitElement {\n static styles = [\n css`\n :host {\n --vouch-media-player-border-radius: var(--vu-media-player-border-radius, 12px);\n --overlay-background-color: var(--vu-overlay-background-color, black);\n --overlay-background-opacity: var(--vu-overlay-background-opacity, 0.4);\n\n --dialog-width: var(--vu-dialog-width, 890px);\n --dialog-height: var(--vu-dialog-height, 500px);\n }\n\n .container {\n position: fixed;\n display: flex;\n inset: 0;\n opacity: 1;\n z-index: 2147483647;\n align-items: center;\n justify-content: center;\n transition: opacity 100ms ease-in;\n }\n\n .hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .background {\n position: absolute;\n inset: 0;\n opacity: var(--overlay-background-opacity);\n background-color: var(--overlay-background-color);\n }\n\n focus-trap {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 40px;\n width: var(--dialog-width);\n height: var(--dialog-height);\n max-width: calc(100% - 80px);\n max-height: calc(100% - 80px);\n }\n\n .video-frame {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 100%;\n max-height: 100%;\n }\n\n .video-frame.grow {\n width: 100%;\n height: 100%;\n }\n\n vmp-icon-button {\n position: absolute;\n top: 0;\n right: 0;\n margin: 10px;\n }\n `\n ];\n\n @property({ type: Boolean }) open = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n render() {\n return html`\n <div\n class=${classMap({\n container: true,\n hidden: !this.open\n })}\n >\n <div\n class=\"background\"\n @click=${() => this.dispatchEvent(new CustomEvent('overlay:click', { bubbles: true, composed: true }))}\n ></div>\n <focus-trap>\n <div\n class=${classMap({\n 'video-frame': true,\n grow: this.aspectRatio === 0\n })}\n style=${styleMap({\n aspectRatio: this.aspectRatio\n })}\n >\n <slot></slot>\n <vmp-icon-button\n icon=\"close\"\n rounded=\"full\"\n weight=\"heavy\"\n @click=${() => this.dispatchEvent(new CustomEvent('close:click', { bubbles: true, composed: true }))}\n ></vmp-icon-button>\n </div>\n </focus-trap>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n }\n}\n\nexport { DialogOverlay };\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\nimport type { MediaPlayer } from '@vouchfor/media-player';\n\nimport './DialogOverlay';\n\n@customElement('vouch-embed-dialog-portal')\nclass DialogPortal extends LitElement {\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n @state() open = false;\n\n private _handleToggle = ({ detail }: CustomEvent<string>) => {\n // Because we have to attach this listener to the document since this element is portalled outside of the button,\n // we also have to make sure that this player is actually the one we want to open and play by passing in an ID\n // from the button wrapper parent and checking against that same ID we pass as the event detail\n if (this.id === detail) {\n this.open = !this.open;\n\n if (this.open) {\n if (!this.disableAutoplay && this._mediaPlayerRef?.value) {\n this._mediaPlayerRef.value.muted = false;\n this._mediaPlayerRef.value.play();\n }\n } else {\n this._mediaPlayerRef?.value?.pause();\n }\n }\n };\n\n // We could do the same thing on close and check for the correct ID but it doesn't really matter\n private _handleClose = () => {\n this.open = false;\n this._mediaPlayerRef?.value?.pause();\n };\n\n private _handleDocumentKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this._handleClose();\n }\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('dialogembed:click', this._handleToggle);\n document.addEventListener('keyup', this._handleDocumentKeyUp);\n document.addEventListener('close:click', this._handleClose);\n document.addEventListener('overlay:click', this._handleClose);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('dialogembed:click', this._handleToggle);\n document.removeEventListener('keyup', this._handleDocumentKeyUp);\n document.removeEventListener('close:click', this._handleClose);\n document.removeEventListener('overlay:click', this._handleClose);\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // We must create a new node here because portalling into the same node (document.body) causes the second\n // element to overwrite the first for some reason (not behaviour really stated in the docs)\n // I am fairly certain this function is only run once as the default behaviour creates the open shadow root\n // and returns that shadow root in this function: https://lit.dev/docs/components/shadow-dom/#implementing-createrenderroot\n const newNode = document.createElement('div');\n document.body.appendChild(newNode);\n return newNode;\n }\n\n render() {\n return html`\n <vouch-embed-dialog-overlay ?open=${this.open} aspectRatio=${this.aspectRatio}>\n <vouch-embed-player\n ${ref(this._mediaPlayerRef)}\n style=${styleMap({\n maxWidth: '100%',\n maxHeight: '100%'\n })}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-player>\n </vouch-embed-dialog-overlay>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n }\n}\n\nexport { DialogPortal };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbedProps } from '../PlayerEmbed';\n\nimport '../PlayerEmbed';\nimport './DialogPortal';\n\ntype DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {\n disableAutoplay?: boolean;\n};\n\n@customElement('vouch-embed-dialog')\nclass DialogEmbed extends LitElement {\n static styles = [\n css`\n :host {\n --vu-button-padding: 10px 20px;\n --vu-button-background: #287179;\n --vu-button-background-hover: #4faab2;\n\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n `\n ];\n\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _id = uuidv4();\n\n private _handleRootClick = () => {\n this.dispatchEvent(new CustomEvent('dialogembed:click', { detail: this._id, bubbles: true, composed: true }));\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('click', this._handleRootClick);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this._handleRootClick);\n }\n\n render() {\n return html`\n <slot>\n <vmp-button size=\"large\">Play</vmp-button>\n </slot>\n <vouch-embed-dialog-portal\n id=${this._id}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-dialog-portal>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog': DialogEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog': DialogEmbed;\n }\n }\n}\n\nexport { DialogEmbed };\nexport type { DialogEmbedProps };\n"],"names":["type","uuidv4","__decorateClass"],"mappings":"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"}
1
+ {"version":3,"file":"embeds.js","sources":["../../src/utils/events.ts","../../src/components/PlayerEmbed/controllers/event-forwarder.ts","../../src/utils/env.ts","../../src/components/PlayerEmbed/controllers/fetcher.ts","../../src/components/PlayerEmbed/controllers/tracking/utils.ts","../../src/components/PlayerEmbed/controllers/tracking/index.ts","../../src/components/PlayerEmbed/index.ts","../../src/components/DialogEmbed/DialogOverlay.ts","../../src/components/DialogEmbed/DialogPortal.ts","../../src/components/DialogEmbed/index.ts"],"sourcesContent":["function forwardEvent(type: string, fromElement: HTMLElement, toElement: HTMLElement) {\n function forwarder(event: Event) {\n toElement.dispatchEvent(new CustomEvent(event.type, event));\n }\n\n fromElement.addEventListener(type, forwarder);\n\n return () => {\n fromElement.removeEventListener(type, forwarder);\n };\n}\n\nexport { forwardEvent };\n","import { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { PlayerEmbed } from '..';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { DirectiveResult } from 'lit/directive.js';\nimport type { Ref } from 'lit/directives/ref.js';\n\nimport { forwardEvent } from '~/utils/events';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\nclass EventForwardController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _events: string[] = [];\n private _cleanup: (() => void)[] = [];\n private _forwardElementRef: Ref<HTMLElement> = createRef();\n\n constructor(host: PlayerEmbedHost, events: string[]) {\n this.host = host;\n this._events = events;\n host.addController(this);\n }\n\n register(): DirectiveResult {\n return ref(this._forwardElementRef);\n }\n\n hostConnected() {\n // Guaranteed to have the element ref in the RAF callback because of how the lit lifecycle works\n requestAnimationFrame(() => {\n this._events.forEach((event) => {\n if (this._forwardElementRef.value) {\n this._cleanup.push(forwardEvent(event, this._forwardElementRef.value, this.host));\n }\n });\n });\n }\n\n hostDisconnected() {\n this._cleanup.forEach((fn) => {\n fn();\n });\n this._cleanup = [];\n }\n}\n\nexport { EventForwardController };\n","type Environment = 'local' | 'dev' | 'staging' | 'prod';\n\ntype GetEnvUrlsReturn = {\n videoUrl: string;\n publicApiUrl: string;\n embedApiUrl: string;\n};\n\nconst devVideoUrl = 'https://d2rxhdlm2q91uk.cloudfront.net';\nconst stagingVideoUrl = 'https://d1ix11aj5kfygl.cloudfront.net';\nconst prodVideoUrl = 'https://d157jlwnudd93d.cloudfront.net';\n\nconst devPublicApiUrl = 'https://bshyfw4h5a.execute-api.ap-southeast-2.amazonaws.com/dev';\nconst stagingPublicApiUrl = 'https://gyzw7rpbq3.execute-api.ap-southeast-2.amazonaws.com/staging';\nconst prodPublicApiUrl = 'https://vfcjuim1l3.execute-api.ap-southeast-2.amazonaws.com/prod';\n\nconst localEmbedApiUrl = 'http://localhost:6060/v2';\nconst devEmbedApiUrl = 'https://embed-dev.vouchfor.com/v2';\nconst stagingEmbedApiUrl = 'https://embed-staging.vouchfor.com/v2';\nconst prodEmbedApiUrl = 'https://embed.vouchfor.com/v2';\n\n// We are handling the case where env is an unknown string so the ts error is a lie\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nfunction getEnvUrls(env: Environment): GetEnvUrlsReturn {\n if (!['local', 'dev', 'staging', 'prod'].includes(env)) {\n throw new Error(`Unknown environment: ${env}`);\n }\n\n if (env === 'local') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: localEmbedApiUrl\n };\n }\n\n if (env === 'dev') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: devEmbedApiUrl\n };\n }\n\n if (env === 'staging') {\n return {\n videoUrl: stagingVideoUrl,\n publicApiUrl: stagingPublicApiUrl,\n embedApiUrl: stagingEmbedApiUrl\n };\n }\n\n if (env === 'prod') {\n return {\n videoUrl: prodVideoUrl,\n publicApiUrl: prodPublicApiUrl,\n embedApiUrl: prodEmbedApiUrl\n };\n }\n}\n\nexport { devEmbedApiUrl, stagingEmbedApiUrl, prodEmbedApiUrl, getEnvUrls };\nexport type { Environment };\n","import { Task } from '@lit/task';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbed, PlayerEmbedProps } from '..';\nimport type { ReactiveControllerHost } from 'lit';\nimport type { Environment } from '~/utils/env';\n\nimport { getEnvUrls } from '~/utils/env';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype FetchTaskDeps = [\n PlayerEmbedProps['env'],\n PlayerEmbedProps['apiKey'],\n PlayerEmbedProps['data'],\n PlayerEmbedProps['vouchId'],\n PlayerEmbedProps['templateId']\n];\n\ntype FilterTaskDeps = [PlayerEmbedProps['data'], PlayerEmbedProps['questions']];\n\nclass FetcherController {\n host: PlayerEmbedHost;\n\n private _fetching = false;\n private _vouch: PlayerEmbedProps['data'];\n\n set fetching(value) {\n if (this._fetching !== value) {\n this._fetching = value;\n this.host.requestUpdate();\n }\n }\n get fetching() {\n return this._fetching;\n }\n\n private getVouch = async (env: Environment, apiKey: string, vouchId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n\n const vouch = await res.json();\n this.host.dispatchEvent(new CustomEvent('vouch:loaded', { detail: vouch?.id }));\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return vouch;\n };\n\n private getTemplate = async (env: Environment, apiKey: string, templateId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n const template = await res.json();\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return template;\n };\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n new Task<FetchTaskDeps, void>(\n this.host,\n async ([env, apiKey, data, vouchId, templateId]: FetchTaskDeps) => {\n try {\n host.vouch = undefined;\n host.template = undefined;\n\n if (data) {\n let template;\n if (templateId) {\n this.fetching = true;\n template = await this.getTemplate(env, apiKey, templateId);\n }\n this._vouch = data;\n host.template = template ?? data?.settings?.template?.instance;\n } else if (vouchId) {\n this.fetching = true;\n\n const [vouch, template] = await Promise.all([\n this.getVouch(env, apiKey, vouchId),\n templateId ? this.getTemplate(env, apiKey, templateId) : null\n ]);\n this._vouch = vouch;\n host.template = template ?? vouch?.settings?.template?.instance;\n }\n } finally {\n this.fetching = false;\n }\n },\n () => [host.env, host.apiKey, host.data, host.vouchId, host.templateId]\n );\n\n // This second task is to be able to filter the vouch without fetching it again if only the questions changed\n new Task<FilterTaskDeps, void>(\n this.host,\n ([vouch, questions]: FilterTaskDeps) => {\n host.vouch = vouch\n ? {\n ...vouch,\n questions: {\n items: vouch?.questions.items.filter((_, index) => !questions?.length || questions?.includes(index + 1))\n }\n }\n : undefined;\n },\n () => [this._vouch, host.questions]\n );\n }\n}\n\nexport { FetcherController };\n","import { TEMPLATE_VERSION } from '@vouchfor/canvas-video';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { TrackingPayload } from '.';\nimport type { Vouch } from '@vouchfor/video-utils';\nimport type { Environment } from '~/utils/env';\n\nimport packageJson from '~/../package.json';\nimport { getEnvUrls } from '~/utils/env';\n\nfunction createVisitor(env: Environment) {\n const { publicApiUrl } = getEnvUrls(env);\n const visitorId = uuidv4();\n navigator.sendBeacon(`${publicApiUrl}/api/visitor`, JSON.stringify({ visitorId }));\n return visitorId;\n}\n\nfunction getUids(env: Environment) {\n if (typeof window === 'undefined') {\n return {\n client: null,\n tab: null,\n request: uuidv4()\n };\n }\n\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let visitorId = window.localStorage?.getItem?.('vouch-uid-visitor');\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let clientId = window.localStorage?.getItem?.('vouch-uid-client');\n // Persisted in session storage, so we can search for everything the user has done in a specific tab\n let tabId = window.sessionStorage?.getItem?.('vouch-uid-tab');\n // Not persisted, allows us to search for any logs related to a single FE request\n // E.g. BE should pass this request ID through all other services to be able to group logs\n const requestId = uuidv4();\n\n // Cache uids\n if (!visitorId) {\n visitorId = createVisitor(env);\n window.localStorage?.setItem?.('vouch-uid-visitor', visitorId);\n }\n\n if (!clientId) {\n clientId = uuidv4();\n window.localStorage?.setItem?.('vouch-uid-client', clientId);\n }\n\n if (!tabId) {\n tabId = uuidv4();\n window.sessionStorage?.setItem?.('vouch-uid-tab', tabId);\n }\n\n return {\n client: clientId,\n tab: tabId,\n request: requestId,\n visitor: visitorId\n };\n}\n\nfunction findVouchId(payload?: TrackingPayload, vouch?: Vouch) {\n if (payload && 'vouchId' in payload) {\n return payload.vouchId;\n }\n return vouch?.id ?? null;\n}\n\nfunction getReportingMetadata(source = 'embedded_player') {\n const [country, region] = Intl.DateTimeFormat().resolvedOptions().timeZone?.split?.('/') ?? [];\n\n const utmParams: any = {};\n [...new URLSearchParams(location.search).entries()].forEach(([key, value]) => {\n if (/utm/.test(key)) {\n const param = key.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\n utmParams[param] = value;\n }\n });\n\n return {\n source,\n time: new Date(),\n region,\n country,\n screenHeight: window.screen.height,\n screenWidth: window.screen.width,\n referrer: document.referrer,\n currentUrl: location.href,\n embedType: 'media-player-embed',\n embedVersion: packageJson.version,\n templateVersion: TEMPLATE_VERSION,\n ...utmParams\n };\n}\n\nexport { getUids, findVouchId, getReportingMetadata };\n","import type { PlayerEmbed } from '../..';\nimport type { MediaEventDetail } from '@vouchfor/media-player';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { findVouchId, getReportingMetadata, getUids } from './utils';\nimport { getEnvUrls } from '~/utils/env';\n\nconst MINIMUM_SEND_THRESHOLD = 1;\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';\ntype TrackingPayload = {\n vouchId?: string;\n answerId?: string;\n streamStart?: number;\n streamEnd?: number;\n};\n\ntype BatchEvent = {\n event: TrackingEvent;\n payload: TrackingPayload & {\n time: string;\n };\n};\n\ntype TimeMap = {\n [key: string]: number;\n};\n\ntype BooleanMap = {\n [key: string]: boolean;\n};\n\nclass TrackingController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _batchedEvents: BatchEvent[] = [];\n private _hasPlayed = false;\n private _hasLoaded: BooleanMap = {};\n private _answersViewed: BooleanMap = {};\n private _streamStartTime: TimeMap = {};\n private _streamLatestTime: TimeMap = {};\n private _currentlyPlayingVideo: MediaEventDetail | null = null;\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n host.addController(this);\n }\n\n private _createTrackingEvent = (event: TrackingEvent, payload?: TrackingPayload) => {\n const vouchId = findVouchId(payload, this.host.vouch);\n\n if (!vouchId || this.host.disableTracking) {\n return;\n }\n\n this._batchedEvents.push({\n event,\n payload: {\n ...payload,\n vouchId,\n time: new Date().toISOString()\n }\n });\n };\n\n private _sendTrackingEvent = () => {\n if (this._batchedEvents.length <= 0) {\n return;\n }\n\n const { publicApiUrl } = getEnvUrls(this.host.env);\n const { client, tab, request, visitor } = getUids(this.host.env);\n\n navigator.sendBeacon(\n `${publicApiUrl}/api/batchevents`,\n JSON.stringify({\n payload: {\n events: this._batchedEvents\n },\n context: {\n 'x-uid-client': client,\n 'x-uid-tab': tab,\n 'x-uid-request': request,\n 'x-uid-visitor': visitor,\n 'x-reporting-metadata': getReportingMetadata(this.host.trackingSource)\n }\n })\n );\n\n this._batchedEvents = [];\n };\n\n private _streamEnded = () => {\n if (this._currentlyPlayingVideo) {\n const { id, key } = this._currentlyPlayingVideo;\n // Don't send a tracking event when seeking backwards\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n // Send a video streamed event any time the stream ends to capture the time between starting\n // the video and the video stopping for any reason (pausing, deleting the embed node or closing the browser)\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n\n // Make sure these events are only sent once by deleting the start and latest times\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n }\n };\n\n private _handleVouchLoaded = ({ detail: vouchId }: CustomEvent<string>) => {\n if (!vouchId) {\n return;\n }\n\n // Only send loaded event once per session\n if (!this._hasLoaded[vouchId]) {\n this._createTrackingEvent('VOUCH_LOADED', { vouchId });\n this._hasLoaded[vouchId] = true;\n }\n };\n\n private _handlePlay = () => {\n // Only send the video played event once per session\n if (!this._hasPlayed) {\n this._createTrackingEvent('VIDEO_PLAYED', {\n streamStart: this.host.currentTime\n });\n this._hasPlayed = true;\n }\n };\n\n private _handleVideoPlay = ({ detail: { id, key } }: CustomEvent<MediaEventDetail>) => {\n // Only increment play count once per session\n if (!this._answersViewed[key]) {\n this._createTrackingEvent('VOUCH_RESPONSE_VIEWED', {\n answerId: id\n });\n this._answersViewed[key] = true;\n }\n };\n\n private _handleVideoTimeUpdate = ({ detail: { id, key, node } }: CustomEvent<MediaEventDetail>) => {\n if (\n // We only want to count any time that the video is actually playing\n !this.host.paused\n // Only update the latest time if this event fires for the currently active video\n // id === this.host.scene?.video?.id\n ) {\n this._currentlyPlayingVideo = { id, key, node };\n this._streamLatestTime[key] = node.currentTime;\n\n if (!this._streamStartTime[key]) {\n this._streamStartTime[key] = node.currentTime;\n this._streamLatestTime[key] = node.currentTime;\n }\n }\n };\n\n private _handleVideoPause = ({ detail: { id, key } }: CustomEvent<MediaEventDetail>) => {\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n };\n\n private _pageUnloading = () => {\n this._streamEnded();\n this._sendTrackingEvent();\n };\n\n private _handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._pageUnloading();\n }\n };\n\n private _handlePageHide = () => {\n this._pageUnloading();\n };\n\n hostConnected() {\n requestAnimationFrame(() => {\n if ('onvisibilitychange' in document) {\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.addEventListener('pagehide', this._handlePageHide);\n }\n this.host.addEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.addEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.addEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.addEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.addEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n });\n }\n\n hostDisconnected() {\n // Send events if DOM node is destroyed\n this._pageUnloading();\n\n if ('onvisibilitychange' in document) {\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.removeEventListener('pagehide', this._handlePageHide);\n }\n this.host.removeEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.removeEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.removeEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.removeEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.removeEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n }\n}\n\nexport { TrackingController };\nexport type { TrackingEvent, TrackingPayload };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { TemplateInstance } from '@vouchfor/canvas-video';\nimport type { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';\nimport type { Vouch } from '@vouchfor/video-utils';\nimport type { PropertyValueMap } from 'lit';\nimport type { Environment } from '~/utils/env';\n\nimport { EventForwardController } from './controllers/event-forwarder';\nimport { FetcherController } from './controllers/fetcher';\nimport { TrackingController } from './controllers/tracking';\n\nimport '@vouchfor/media-player';\n\ntype PlayerEmbedProps = Pick<MediaPlayerProps, 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'> & {\n data?: Vouch;\n env: Environment;\n apiKey: string;\n disableTracking?: boolean;\n trackingSource?: string;\n vouchId?: string;\n templateId?: string;\n // Index of the questions to include starting from 1\n questions?: number[];\n};\n\n@customElement('vouch-embed-player')\nclass PlayerEmbed extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n `\n ];\n\n @property({ type: Object }) data: PlayerEmbedProps['data'];\n @property({ type: String }) vouchId: PlayerEmbedProps['vouchId'];\n @property({ type: String }) templateId: PlayerEmbedProps['templateId'];\n @property({ type: Array }) questions: PlayerEmbedProps['questions'];\n\n @property({ type: String }) env: PlayerEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: PlayerEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: PlayerEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: PlayerEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: PlayerEmbedProps['controls'];\n @property({ type: String }) preload: PlayerEmbedProps['preload'] = 'auto';\n @property({ type: Boolean }) autoplay: PlayerEmbedProps['autoplay'] = false;\n @property({ type: Number }) aspectRatio: PlayerEmbedProps['aspectRatio'] = 0;\n @property({ type: String }) language?: MediaPlayerProps['language'];\n\n private eventController = new EventForwardController(this, [\n 'durationchange',\n 'ended',\n 'error',\n 'loadeddata',\n 'pause',\n 'stalled',\n 'play',\n 'playing',\n 'ratechange',\n 'scenechange',\n 'scenesupdate',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'volumechange',\n 'processing',\n 'waiting',\n\n 'video:loadeddata',\n 'video:seeking',\n 'video:seeked',\n 'video:play',\n 'video:playing',\n 'video:pause',\n 'video:stalled',\n 'video:timeupdate',\n 'video:ended',\n 'video:error'\n ]);\n private _fetcherController = new FetcherController(this);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n private _trackingController = new TrackingController(this);\n\n @state() vouch: PlayerEmbedProps['data'];\n @state() template: TemplateInstance | undefined;\n\n get fetching() {\n return this._fetcherController.fetching;\n }\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n get waiting() {\n return this._mediaPlayerRef.value?.waiting;\n }\n\n get initialised() {\n return this._mediaPlayerRef.value?.initialised;\n }\n\n get seeking() {\n return this._mediaPlayerRef.value?.seeking;\n }\n\n get paused() {\n return this._mediaPlayerRef.value?.paused;\n }\n\n get captions() {\n return this._mediaPlayerRef.value?.captions;\n }\n\n get fullscreen() {\n return this._mediaPlayerRef.value?.fullscreen;\n }\n\n get duration() {\n return this._mediaPlayerRef.value?.duration;\n }\n\n set currentTime(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.currentTime = value;\n }\n }\n get currentTime() {\n return this._mediaPlayerRef.value?.currentTime ?? 0;\n }\n\n set playbackRate(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.playbackRate = value;\n }\n }\n get playbackRate() {\n return this._mediaPlayerRef.value?.playbackRate ?? 1;\n }\n\n set volume(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.volume = value;\n }\n }\n get volume() {\n return this._mediaPlayerRef.value?.volume ?? 1;\n }\n\n set muted(value: boolean) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.muted = value;\n }\n }\n get muted() {\n return this._mediaPlayerRef.value?.muted ?? false;\n }\n\n // get scene(): Scene | null {\n // return this._mediaPlayerRef.value?.scene ?? null;\n // }\n\n // get scenes(): Scene[] {\n // return this._mediaPlayerRef.value?.scenes ?? [];\n // }\n\n // get sceneConfig(): Scenes | null {\n // return this._mediaPlayerRef.value?.sceneConfig ?? null;\n // }\n\n get mediaState() {\n return this._mediaPlayerRef.value?.mediaState;\n }\n\n get mediaPlayer() {\n return this._mediaPlayerRef.value;\n }\n\n play() {\n this._mediaPlayerRef.value?.play();\n }\n\n pause() {\n this._mediaPlayerRef.value?.pause();\n }\n\n reset(time = 0, play = false) {\n this._mediaPlayerRef.value?.reset(time, play);\n }\n\n // setScene(index: number) {\n // this._mediaPlayerRef.value?.setScene(index);\n // }\n\n private _renderStyles() {\n if (!this.aspectRatio) {\n return html`\n <style>\n :host {\n width: 100%;\n height: 100%;\n }\n </style>\n `;\n }\n\n if (typeof this.aspectRatio === 'number') {\n return html`\n <style>\n :host {\n aspect-ratio: ${this.aspectRatio};\n }\n </style>\n `;\n }\n\n return null;\n }\n\n protected willUpdate(changedProperties: PropertyValueMap<PlayerEmbedProps>) {\n // If the vouch this embed is pointing to changes then reset the player\n if (changedProperties.has('vouchId') && this.vouchId !== changedProperties.get('vouchId')) {\n this.reset(0, false);\n }\n }\n\n render() {\n return html`\n ${this._renderStyles()}\n <vmp-media-player\n ${ref(this._mediaPlayerRef)}\n ${this.eventController.register()}\n ?autoplay=${this.autoplay}\n ?loading=${this.fetching}\n aspectRatio=${ifDefined(this.aspectRatio)}\n preload=${ifDefined(this.preload)}\n language=${ifDefined(this.language)}\n .controls=${this.controls}\n ></vmp-media-player>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-player': PlayerEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-player': PlayerEmbed;\n }\n }\n}\n\nexport { PlayerEmbed };\nexport type { PlayerEmbedProps };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\n\nimport '@a11y/focus-trap';\n\n@customElement('vouch-embed-dialog-overlay')\nclass DialogOverlay extends LitElement {\n static styles = [\n css`\n :host {\n --vouch-media-player-border-radius: var(--vu-media-player-border-radius, 12px);\n --overlay-background-color: var(--vu-overlay-background-color, black);\n --overlay-background-opacity: var(--vu-overlay-background-opacity, 0.4);\n\n --dialog-width: var(--vu-dialog-width, 890px);\n --dialog-height: var(--vu-dialog-height, 500px);\n }\n\n .container {\n position: fixed;\n display: flex;\n inset: 0;\n opacity: 1;\n z-index: 2147483647;\n align-items: center;\n justify-content: center;\n transition: opacity 100ms ease-in;\n }\n\n .hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .background {\n position: absolute;\n inset: 0;\n opacity: var(--overlay-background-opacity);\n background-color: var(--overlay-background-color);\n }\n\n focus-trap {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 40px;\n width: var(--dialog-width);\n height: var(--dialog-height);\n max-width: calc(100% - 80px);\n max-height: calc(100% - 80px);\n }\n\n .video-frame {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 100%;\n max-height: 100%;\n }\n\n .video-frame.grow {\n width: 100%;\n height: 100%;\n }\n\n vmp-icon-button {\n position: absolute;\n top: 0;\n right: 0;\n margin: 10px;\n }\n `\n ];\n\n @property({ type: Boolean }) open = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n render() {\n return html`\n <div\n class=${classMap({\n container: true,\n hidden: !this.open\n })}\n >\n <div\n class=\"background\"\n @click=${() => this.dispatchEvent(new CustomEvent('overlay:click', { bubbles: true, composed: true }))}\n ></div>\n <focus-trap>\n <div\n class=${classMap({\n 'video-frame': true,\n grow: this.aspectRatio === 0\n })}\n style=${styleMap({\n aspectRatio: this.aspectRatio\n })}\n >\n <slot></slot>\n <vmp-icon-button\n icon=\"close\"\n rounded=\"full\"\n weight=\"heavy\"\n @click=${() => this.dispatchEvent(new CustomEvent('close:click', { bubbles: true, composed: true }))}\n ></vmp-icon-button>\n </div>\n </focus-trap>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n }\n}\n\nexport { DialogOverlay };\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\nimport type { MediaPlayer } from '@vouchfor/media-player';\n\nimport './DialogOverlay';\n\n@customElement('vouch-embed-dialog-portal')\nclass DialogPortal extends LitElement {\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n @state() open = false;\n\n private _handleToggle = ({ detail }: CustomEvent<string>) => {\n // Because we have to attach this listener to the document since this element is portalled outside of the button,\n // we also have to make sure that this player is actually the one we want to open and play by passing in an ID\n // from the button wrapper parent and checking against that same ID we pass as the event detail\n if (this.id === detail) {\n this.open = !this.open;\n\n if (this.open) {\n if (!this.disableAutoplay && this._mediaPlayerRef?.value) {\n this._mediaPlayerRef.value.muted = false;\n this._mediaPlayerRef.value.play();\n }\n } else {\n this._mediaPlayerRef?.value?.pause();\n }\n }\n };\n\n // We could do the same thing on close and check for the correct ID but it doesn't really matter\n private _handleClose = () => {\n this.open = false;\n this._mediaPlayerRef?.value?.pause();\n };\n\n private _handleDocumentKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this._handleClose();\n }\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('dialogembed:click', this._handleToggle);\n document.addEventListener('keyup', this._handleDocumentKeyUp);\n document.addEventListener('close:click', this._handleClose);\n document.addEventListener('overlay:click', this._handleClose);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('dialogembed:click', this._handleToggle);\n document.removeEventListener('keyup', this._handleDocumentKeyUp);\n document.removeEventListener('close:click', this._handleClose);\n document.removeEventListener('overlay:click', this._handleClose);\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // We must create a new node here because portalling into the same node (document.body) causes the second\n // element to overwrite the first for some reason (not behaviour really stated in the docs)\n // I am fairly certain this function is only run once as the default behaviour creates the open shadow root\n // and returns that shadow root in this function: https://lit.dev/docs/components/shadow-dom/#implementing-createrenderroot\n const newNode = document.createElement('div');\n document.body.appendChild(newNode);\n return newNode;\n }\n\n render() {\n return html`\n <vouch-embed-dialog-overlay ?open=${this.open} aspectRatio=${this.aspectRatio}>\n <vouch-embed-player\n ${ref(this._mediaPlayerRef)}\n style=${styleMap({\n maxWidth: '100%',\n maxHeight: '100%'\n })}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-player>\n </vouch-embed-dialog-overlay>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n }\n}\n\nexport { DialogPortal };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbedProps } from '../PlayerEmbed';\n\nimport '../PlayerEmbed';\nimport './DialogPortal';\n\ntype DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {\n disableAutoplay?: boolean;\n};\n\n@customElement('vouch-embed-dialog')\nclass DialogEmbed extends LitElement {\n static styles = [\n css`\n :host {\n --vu-button-padding: 10px 20px;\n --vu-button-background: #287179;\n --vu-button-background-hover: #4faab2;\n\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n `\n ];\n\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _id = uuidv4();\n\n private _handleRootClick = () => {\n this.dispatchEvent(new CustomEvent('dialogembed:click', { detail: this._id, bubbles: true, composed: true }));\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('click', this._handleRootClick);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this._handleRootClick);\n }\n\n render() {\n return html`\n <slot>\n <vmp-button size=\"large\">Play</vmp-button>\n </slot>\n <vouch-embed-dialog-portal\n id=${this._id}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-dialog-portal>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog': DialogEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog': DialogEmbed;\n }\n }\n}\n\nexport { DialogEmbed };\nexport type { DialogEmbedProps };\n"],"names":["uuidv4","__decorateClass"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { LitElement } from 'lit';
2
- import type { DialogEmbedProps } from '.';
3
- import '@a11y/focus-trap';
2
+ import { DialogEmbedProps } from '.';
3
+
4
4
  declare class DialogOverlay extends LitElement {
5
- static styles: import("lit").CSSResult[];
5
+ static styles: import('lit').CSSResult[];
6
6
  open: boolean;
7
7
  aspectRatio: DialogEmbedProps['aspectRatio'];
8
- render(): import("lit-html").TemplateResult<1>;
8
+ render(): import('lit').TemplateResult<1>;
9
9
  }
10
10
  declare global {
11
11
  interface HTMLElementTagNameMap {
@@ -1,6 +1,6 @@
1
1
  import { LitElement } from 'lit';
2
- import type { DialogEmbedProps } from '.';
3
- import './DialogOverlay';
2
+ import { DialogEmbedProps } from '.';
3
+
4
4
  declare class DialogPortal extends LitElement {
5
5
  vouchId: DialogEmbedProps['vouchId'];
6
6
  templateId: DialogEmbedProps['templateId'];
@@ -21,7 +21,7 @@ declare class DialogPortal extends LitElement {
21
21
  connectedCallback(): void;
22
22
  disconnectedCallback(): void;
23
23
  protected createRenderRoot(): HTMLElement | DocumentFragment;
24
- render(): import("lit-html").TemplateResult<1>;
24
+ render(): import('lit').TemplateResult<1>;
25
25
  }
26
26
  declare global {
27
27
  interface HTMLElementTagNameMap {
@@ -1,12 +1,11 @@
1
1
  import { LitElement } from 'lit';
2
- import type { PlayerEmbedProps } from '../PlayerEmbed';
3
- import '../PlayerEmbed';
4
- import './DialogPortal';
2
+ import { PlayerEmbedProps } from '../PlayerEmbed';
3
+
5
4
  type DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {
6
5
  disableAutoplay?: boolean;
7
6
  };
8
7
  declare class DialogEmbed extends LitElement {
9
- static styles: import("lit").CSSResult[];
8
+ static styles: import('lit').CSSResult[];
10
9
  vouchId: DialogEmbedProps['vouchId'];
11
10
  templateId: DialogEmbedProps['templateId'];
12
11
  questions: DialogEmbedProps['questions'];
@@ -22,7 +21,7 @@ declare class DialogEmbed extends LitElement {
22
21
  private _handleRootClick;
23
22
  connectedCallback(): void;
24
23
  disconnectedCallback(): void;
25
- render(): import("lit-html").TemplateResult<1>;
24
+ render(): import('lit').TemplateResult<1>;
26
25
  }
27
26
  declare global {
28
27
  interface HTMLElementTagNameMap {
@@ -1,6 +1,7 @@
1
- import type { PlayerEmbed } from '..';
2
- import type { ReactiveController, ReactiveControllerHost } from 'lit';
3
- import type { DirectiveResult } from 'lit/directive.js';
1
+ import { PlayerEmbed } from '..';
2
+ import { ReactiveController, ReactiveControllerHost } from 'lit';
3
+ import { DirectiveResult } from 'lit/directive.js';
4
+
4
5
  type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
5
6
  declare class EventForwardController implements ReactiveController {
6
7
  host: PlayerEmbedHost;
@@ -1,5 +1,6 @@
1
- import type { PlayerEmbed } from '..';
2
- import type { ReactiveControllerHost } from 'lit';
1
+ import { PlayerEmbed } from '..';
2
+ import { ReactiveControllerHost } from 'lit';
3
+
3
4
  type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
4
5
  declare class FetcherController {
5
6
  host: PlayerEmbedHost;
@@ -1,5 +1,6 @@
1
- import type { PlayerEmbed } from '../..';
2
- import type { ReactiveController, ReactiveControllerHost } from 'lit';
1
+ import { PlayerEmbed } from '../..';
2
+ import { ReactiveController, ReactiveControllerHost } from 'lit';
3
+
3
4
  type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
4
5
  type TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';
5
6
  type TrackingPayload = {
@@ -1,6 +1,7 @@
1
- import type { TrackingPayload } from '.';
2
- import type { Vouch } from '@vouchfor/video-utils';
3
- import type { Environment } from '../../../../utils/env';
1
+ import { TrackingPayload } from '.';
2
+ import { Vouch } from '@vouchfor/video-utils';
3
+ import { Environment } from '../../../../utils/env';
4
+
4
5
  declare function getUids(env: Environment): {
5
6
  client: null;
6
7
  tab: null;
@@ -1,10 +1,9 @@
1
- import { LitElement } from 'lit';
2
- import type { TemplateInstance } from '@vouchfor/canvas-video';
3
- import type { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';
4
- import type { Vouch } from '@vouchfor/video-utils';
5
- import type { PropertyValueMap } from 'lit';
6
- import type { Environment } from '../../utils/env';
7
- import '@vouchfor/media-player';
1
+ import { LitElement, PropertyValueMap } from 'lit';
2
+ import { TemplateInstance } from '@vouchfor/canvas-video';
3
+ import { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';
4
+ import { Vouch } from '@vouchfor/video-utils';
5
+ import { Environment } from '../../utils/env';
6
+
8
7
  type PlayerEmbedProps = Pick<MediaPlayerProps, 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'> & {
9
8
  data?: Vouch;
10
9
  env: Environment;
@@ -16,7 +15,7 @@ type PlayerEmbedProps = Pick<MediaPlayerProps, 'aspectRatio' | 'language' | 'pre
16
15
  questions?: number[];
17
16
  };
18
17
  declare class PlayerEmbed extends LitElement {
19
- static styles: import("lit").CSSResult[];
18
+ static styles: import('lit').CSSResult[];
20
19
  data: PlayerEmbedProps['data'];
21
20
  vouchId: PlayerEmbedProps['vouchId'];
22
21
  templateId: PlayerEmbedProps['templateId'];
@@ -52,14 +51,14 @@ declare class PlayerEmbed extends LitElement {
52
51
  get volume(): number;
53
52
  set muted(value: boolean);
54
53
  get muted(): boolean;
55
- get mediaState(): import("@vouchfor/media-player").MediaStateMap | undefined;
54
+ get mediaState(): import('@vouchfor/media-player').MediaStateMap | undefined;
56
55
  get mediaPlayer(): MediaPlayer | undefined;
57
56
  play(): void;
58
57
  pause(): void;
59
58
  reset(time?: number, play?: boolean): void;
60
59
  private _renderStyles;
61
60
  protected willUpdate(changedProperties: PropertyValueMap<PlayerEmbedProps>): void;
62
- render(): import("lit-html").TemplateResult<1>;
61
+ render(): import('lit').TemplateResult<1>;
63
62
  }
64
63
  declare global {
65
64
  interface HTMLElementTagNameMap {
@@ -1,4 +1,5 @@
1
- import type { Vouch } from '@vouchfor/video-utils';
1
+ import { Vouch } from '@vouchfor/video-utils';
2
+
2
3
  declare const data: Vouch;
3
4
  declare const withNullAnswer: Vouch;
4
5
  export { data, withNullAnswer };