@vouchfor/embeds 0.0.0-experiment.f80a91a → 0.0.0-experiment.f90d920
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/es/embeds.js +1142 -9
- package/dist/es/embeds.js.map +1 -1
- package/dist/es/src/components/DialogEmbed/DialogOverlay.d.ts +2 -1
- package/dist/es/src/components/DialogEmbed/DialogPortal.d.ts +2 -1
- package/dist/es/src/components/DialogEmbed/index.d.ts +4 -1
- package/dist/es/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +1 -1
- package/dist/es/src/components/PlayerEmbed/index.d.ts +75 -0
- package/dist/es/src/components/PlayerEmbed/tests/data.d.ts +3 -2
- package/dist/es/src/components/PlayerEmbed/tests/media-data.d.ts +19 -0
- package/dist/iife/dialog-embed/embed.iife.js +2732 -411
- package/dist/iife/dialog-embed/embed.iife.js.map +1 -1
- package/dist/iife/embeds.iife.js +2732 -411
- package/dist/iife/embeds.iife.js.map +1 -1
- package/dist/iife/player-embed/embed.iife.js +2706 -387
- package/dist/iife/player-embed/embed.iife.js.map +1 -1
- package/package.json +36 -31
- package/src/components/DialogEmbed/Dialog.stories.ts +12 -0
- package/src/components/DialogEmbed/DialogOverlay.ts +2 -1
- package/src/components/DialogEmbed/DialogPortal.ts +22 -10
- package/src/components/DialogEmbed/index.ts +5 -1
- package/src/components/PlayerEmbed/MultiEmbed.stories.ts +135 -0
- package/src/components/PlayerEmbed/PlayerEmbed.stories.ts +15 -1
- package/src/components/PlayerEmbed/controllers/tracking/index.ts +7 -7
- package/src/components/PlayerEmbed/controllers/tracking/utils.ts +1 -1
- package/src/components/PlayerEmbed/index.ts +120 -7
- package/src/components/PlayerEmbed/tests/PlayerEmbed.spec.ts +14 -7
- package/src/components/PlayerEmbed/tests/data.ts +121 -77
- package/src/components/PlayerEmbed/tests/media-data.ts +22 -0
- package/dist/es/browser-07a8b7dc.js +0 -433
- package/dist/es/browser-07a8b7dc.js.map +0 -1
- package/dist/es/index-0c298932.js +0 -10473
- package/dist/es/index-0c298932.js.map +0 -1
- package/dist/iife/dialog-embed/browser-450a324f.js +0 -433
- package/dist/iife/dialog-embed/browser-450a324f.js.map +0 -1
- package/dist/iife/dialog-embed/embed.js +0 -5
- package/dist/iife/dialog-embed/embed.js.map +0 -1
- package/dist/iife/dialog-embed/index-62750303.js +0 -32932
- package/dist/iife/dialog-embed/index-62750303.js.map +0 -1
- package/dist/iife/dialog-embed/src/components/DialogEmbed/DialogOverlay.d.ts +0 -19
- package/dist/iife/dialog-embed/src/components/DialogEmbed/DialogPortal.d.ts +0 -35
- package/dist/iife/dialog-embed/src/components/DialogEmbed/index.d.ts +0 -35
- package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +0 -15
- package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/fetcher.d.ts +0 -14
- package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/tracking/index.d.ts +0 -36
- package/dist/iife/dialog-embed/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +0 -17
- package/dist/iife/dialog-embed/src/components/PlayerEmbed/tests/data.d.ts +0 -3
- package/dist/iife/dialog-embed/src/index.d.ts +0 -2
- package/dist/iife/dialog-embed/src/utils/env.d.ts +0 -12
- package/dist/iife/dialog-embed/src/utils/events.d.ts +0 -2
- package/dist/iife/player-embed/browser-c51cdddb.js +0 -433
- package/dist/iife/player-embed/browser-c51cdddb.js.map +0 -1
- package/dist/iife/player-embed/embed.js +0 -5
- package/dist/iife/player-embed/embed.js.map +0 -1
- package/dist/iife/player-embed/index-0d71c577.js +0 -32489
- package/dist/iife/player-embed/index-0d71c577.js.map +0 -1
- package/dist/iife/player-embed/src/components/DialogEmbed/DialogOverlay.d.ts +0 -19
- package/dist/iife/player-embed/src/components/DialogEmbed/DialogPortal.d.ts +0 -35
- package/dist/iife/player-embed/src/components/DialogEmbed/index.d.ts +0 -35
- package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +0 -15
- package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/fetcher.d.ts +0 -14
- package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/tracking/index.d.ts +0 -36
- package/dist/iife/player-embed/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +0 -17
- package/dist/iife/player-embed/src/components/PlayerEmbed/tests/data.d.ts +0 -3
- package/dist/iife/player-embed/src/index.d.ts +0 -2
- package/dist/iife/player-embed/src/utils/env.d.ts +0 -12
- package/dist/iife/player-embed/src/utils/events.d.ts +0 -2
- package/src/mixins/media-player-proxy.ts +0 -116
package/dist/es/embeds.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"embeds.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;"}
|
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,10 +1,11 @@
|
|
1
1
|
import { LitElement } from 'lit';
|
2
2
|
import type { DialogEmbedProps } from '.';
|
3
|
+
import '@a11y/focus-trap';
|
3
4
|
declare class DialogOverlay extends LitElement {
|
4
5
|
static styles: import("lit").CSSResult[];
|
5
6
|
open: boolean;
|
6
7
|
aspectRatio: DialogEmbedProps['aspectRatio'];
|
7
|
-
render(): import("lit").TemplateResult<1>;
|
8
|
+
render(): import("lit-html").TemplateResult<1>;
|
8
9
|
}
|
9
10
|
declare global {
|
10
11
|
interface HTMLElementTagNameMap {
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import { LitElement } from 'lit';
|
2
2
|
import type { DialogEmbedProps } from '.';
|
3
|
+
import './DialogOverlay';
|
3
4
|
declare class DialogPortal extends LitElement {
|
4
5
|
vouchId: DialogEmbedProps['vouchId'];
|
5
6
|
templateId: DialogEmbedProps['templateId'];
|
@@ -20,7 +21,7 @@ declare class DialogPortal extends LitElement {
|
|
20
21
|
connectedCallback(): void;
|
21
22
|
disconnectedCallback(): void;
|
22
23
|
protected createRenderRoot(): HTMLElement | DocumentFragment;
|
23
|
-
render(): import("lit").TemplateResult<1>;
|
24
|
+
render(): import("lit-html").TemplateResult<1>;
|
24
25
|
}
|
25
26
|
declare global {
|
26
27
|
interface HTMLElementTagNameMap {
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import { LitElement } from 'lit';
|
2
2
|
import type { PlayerEmbedProps } from '../PlayerEmbed';
|
3
|
+
import '../PlayerEmbed';
|
4
|
+
import './DialogPortal';
|
3
5
|
type DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {
|
4
6
|
disableAutoplay?: boolean;
|
5
7
|
};
|
@@ -16,10 +18,11 @@ declare class DialogEmbed extends LitElement {
|
|
16
18
|
preload: DialogEmbedProps['preload'];
|
17
19
|
disableAutoplay: DialogEmbedProps['disableAutoplay'];
|
18
20
|
aspectRatio: DialogEmbedProps['aspectRatio'];
|
21
|
+
private _id;
|
19
22
|
private _handleRootClick;
|
20
23
|
connectedCallback(): void;
|
21
24
|
disconnectedCallback(): void;
|
22
|
-
render(): import("lit").TemplateResult<1>;
|
25
|
+
render(): import("lit-html").TemplateResult<1>;
|
23
26
|
}
|
24
27
|
declare global {
|
25
28
|
interface HTMLElementTagNameMap {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { TrackingPayload } from '.';
|
2
|
-
import type { Vouch } from '@vouchfor/
|
2
|
+
import type { Vouch } from '@vouchfor/video-utils';
|
3
3
|
import type { Environment } from '../../../../utils/env';
|
4
4
|
declare function getUids(env: Environment): {
|
5
5
|
client: null;
|
@@ -0,0 +1,75 @@
|
|
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';
|
8
|
+
type PlayerEmbedProps = Pick<MediaPlayerProps, 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'> & {
|
9
|
+
data?: Vouch;
|
10
|
+
env: Environment;
|
11
|
+
apiKey: string;
|
12
|
+
disableTracking?: boolean;
|
13
|
+
trackingSource?: string;
|
14
|
+
vouchId?: string;
|
15
|
+
templateId?: string;
|
16
|
+
questions?: number[];
|
17
|
+
};
|
18
|
+
declare class PlayerEmbed extends LitElement {
|
19
|
+
static styles: import("lit").CSSResult[];
|
20
|
+
data: PlayerEmbedProps['data'];
|
21
|
+
vouchId: PlayerEmbedProps['vouchId'];
|
22
|
+
templateId: PlayerEmbedProps['templateId'];
|
23
|
+
questions: PlayerEmbedProps['questions'];
|
24
|
+
env: PlayerEmbedProps['env'];
|
25
|
+
apiKey: PlayerEmbedProps['apiKey'];
|
26
|
+
disableTracking: PlayerEmbedProps['disableTracking'];
|
27
|
+
trackingSource: PlayerEmbedProps['trackingSource'];
|
28
|
+
controls: PlayerEmbedProps['controls'];
|
29
|
+
preload: PlayerEmbedProps['preload'];
|
30
|
+
autoplay: PlayerEmbedProps['autoplay'];
|
31
|
+
aspectRatio: PlayerEmbedProps['aspectRatio'];
|
32
|
+
language?: MediaPlayerProps['language'];
|
33
|
+
private eventController;
|
34
|
+
private _fetcherController;
|
35
|
+
private _trackingController;
|
36
|
+
vouch: PlayerEmbedProps['data'];
|
37
|
+
template: TemplateInstance | undefined;
|
38
|
+
get fetching(): boolean;
|
39
|
+
private _mediaPlayerRef;
|
40
|
+
get waiting(): boolean | undefined;
|
41
|
+
get initialised(): Promise<boolean> | undefined;
|
42
|
+
get seeking(): boolean | undefined;
|
43
|
+
get paused(): boolean | undefined;
|
44
|
+
get captions(): boolean | undefined;
|
45
|
+
get fullscreen(): boolean | undefined;
|
46
|
+
get duration(): number | undefined;
|
47
|
+
set currentTime(value: number);
|
48
|
+
get currentTime(): number;
|
49
|
+
set playbackRate(value: number);
|
50
|
+
get playbackRate(): number;
|
51
|
+
set volume(value: number);
|
52
|
+
get volume(): number;
|
53
|
+
set muted(value: boolean);
|
54
|
+
get muted(): boolean;
|
55
|
+
get mediaState(): import("@vouchfor/media-player").MediaStateMap | undefined;
|
56
|
+
get mediaPlayer(): MediaPlayer | undefined;
|
57
|
+
play(): void;
|
58
|
+
pause(): void;
|
59
|
+
reset(time?: number, play?: boolean): void;
|
60
|
+
private _renderStyles;
|
61
|
+
protected willUpdate(changedProperties: PropertyValueMap<PlayerEmbedProps>): void;
|
62
|
+
render(): import("lit-html").TemplateResult<1>;
|
63
|
+
}
|
64
|
+
declare global {
|
65
|
+
interface HTMLElementTagNameMap {
|
66
|
+
'vouch-embed-player': PlayerEmbed;
|
67
|
+
}
|
68
|
+
namespace JSX {
|
69
|
+
interface IntrinsicElements {
|
70
|
+
'vouch-embed-player': PlayerEmbed;
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
export { PlayerEmbed };
|
75
|
+
export type { PlayerEmbedProps };
|
@@ -0,0 +1,19 @@
|
|
1
|
+
declare const VIDEOA: {
|
2
|
+
mp4: string;
|
3
|
+
m3u8: string;
|
4
|
+
jpg: string;
|
5
|
+
duration: number;
|
6
|
+
};
|
7
|
+
declare const VIDEOB: {
|
8
|
+
mp4: string;
|
9
|
+
m3u8: string;
|
10
|
+
jpg: string;
|
11
|
+
duration: number;
|
12
|
+
};
|
13
|
+
declare const VIDEOC: {
|
14
|
+
mp4: string;
|
15
|
+
m3u8: string;
|
16
|
+
jpg: string;
|
17
|
+
duration: number;
|
18
|
+
};
|
19
|
+
export { VIDEOA, VIDEOB, VIDEOC };
|