@se-studio/core-ui 1.17.2 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/analytics/video/classifySeek.d.ts +15 -0
- package/dist/analytics/video/classifySeek.d.ts.map +1 -0
- package/dist/analytics/video/classifySeek.js +32 -0
- package/dist/analytics/video/classifySeek.js.map +1 -0
- package/dist/analytics/video/createVideoEngagementSession.d.ts +51 -0
- package/dist/analytics/video/createVideoEngagementSession.d.ts.map +1 -0
- package/dist/analytics/video/createVideoEngagementSession.js +225 -0
- package/dist/analytics/video/createVideoEngagementSession.js.map +1 -0
- package/dist/analytics/video/index.d.ts +6 -0
- package/dist/analytics/video/index.d.ts.map +1 -0
- package/dist/analytics/video/index.js +6 -0
- package/dist/analytics/video/index.js.map +1 -0
- package/dist/analytics/video/loadYouTubeIframeApi.d.ts +50 -0
- package/dist/analytics/video/loadYouTubeIframeApi.d.ts.map +1 -0
- package/dist/analytics/video/loadYouTubeIframeApi.js +52 -0
- package/dist/analytics/video/loadYouTubeIframeApi.js.map +1 -0
- package/dist/analytics/video/useHtml5VideoEngagement.d.ts +8 -0
- package/dist/analytics/video/useHtml5VideoEngagement.d.ts.map +1 -0
- package/dist/analytics/video/useHtml5VideoEngagement.js +67 -0
- package/dist/analytics/video/useHtml5VideoEngagement.js.map +1 -0
- package/dist/analytics/video/useVideoEngagement.d.ts +19 -0
- package/dist/analytics/video/useVideoEngagement.d.ts.map +1 -0
- package/dist/analytics/video/useVideoEngagement.js +80 -0
- package/dist/analytics/video/useVideoEngagement.js.map +1 -0
- package/dist/analytics/video/videoEngagementTypes.d.ts +52 -0
- package/dist/analytics/video/videoEngagementTypes.d.ts.map +1 -0
- package/dist/analytics/video/videoEngagementTypes.js +45 -0
- package/dist/analytics/video/videoEngagementTypes.js.map +1 -0
- package/dist/components/ExternalVimeoEmbed.d.ts +1 -1
- package/dist/components/ExternalVimeoEmbed.d.ts.map +1 -1
- package/dist/components/ExternalVimeoEmbed.js +134 -9
- package/dist/components/ExternalVimeoEmbed.js.map +1 -1
- package/dist/components/ExternalYouTubeEmbed.d.ts +1 -1
- package/dist/components/ExternalYouTubeEmbed.d.ts.map +1 -1
- package/dist/components/ExternalYouTubeEmbed.js +167 -9
- package/dist/components/ExternalYouTubeEmbed.js.map +1 -1
- package/dist/components/ImageKitClientVideo.d.ts +6 -1
- package/dist/components/ImageKitClientVideo.d.ts.map +1 -1
- package/dist/components/ImageKitClientVideo.js +69 -7
- package/dist/components/ImageKitClientVideo.js.map +1 -1
- package/dist/components/ImageKitHlsVideoClient.d.ts +7 -1
- package/dist/components/ImageKitHlsVideoClient.d.ts.map +1 -1
- package/dist/components/ImageKitHlsVideoClient.js +65 -8
- package/dist/components/ImageKitHlsVideoClient.js.map +1 -1
- package/dist/components/LazyVideo.d.ts +5 -0
- package/dist/components/LazyVideo.d.ts.map +1 -1
- package/dist/components/LazyVideo.js +61 -36
- package/dist/components/LazyVideo.js.map +1 -1
- package/dist/components/LocalVideo.d.ts.map +1 -1
- package/dist/components/LocalVideo.js +8 -2
- package/dist/components/LocalVideo.js.map +1 -1
- package/dist/components/LocalVideoPlayChrome.d.ts +20 -0
- package/dist/components/LocalVideoPlayChrome.d.ts.map +1 -0
- package/dist/components/LocalVideoPlayChrome.js +22 -0
- package/dist/components/LocalVideoPlayChrome.js.map +1 -0
- package/dist/components/LocalVideoPlayOverlay.d.ts +19 -0
- package/dist/components/LocalVideoPlayOverlay.d.ts.map +1 -0
- package/dist/components/LocalVideoPlayOverlay.js +49 -0
- package/dist/components/LocalVideoPlayOverlay.js.map +1 -0
- package/dist/components/Video.d.ts +5 -0
- package/dist/components/Video.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/docs/llms.md +15 -0
- package/package.json +4 -3
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useEffect, useRef } from 'react';
|
|
3
|
+
import { useAnalytics } from '../useAnalytics';
|
|
4
|
+
import { createVideoEngagementSession, } from './createVideoEngagementSession';
|
|
5
|
+
import { VIDEO_ENGAGEMENT_THRESHOLDS } from './videoEngagementTypes';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a video engagement session bound to `trackEvent` when analytics context is present.
|
|
8
|
+
* Observes `rootRef` for impression; disposes on unmount / pagehide.
|
|
9
|
+
*/
|
|
10
|
+
export function useVideoEngagement({ identity, analyticsContext, enabled = true, }) {
|
|
11
|
+
const { trackEvent } = useAnalytics();
|
|
12
|
+
const sessionRef = useRef(null);
|
|
13
|
+
const rootRef = useRef(null);
|
|
14
|
+
const trackEventRef = useRef(trackEvent);
|
|
15
|
+
trackEventRef.current = trackEvent;
|
|
16
|
+
const canTrack = Boolean(enabled && analyticsContext);
|
|
17
|
+
const identityRef = useRef(identity);
|
|
18
|
+
identityRef.current = identity;
|
|
19
|
+
// Primitive deps only — avoid recreating the session when parent passes a new
|
|
20
|
+
// analyticsContext object with the same slug/title/type.
|
|
21
|
+
const slug = analyticsContext?.slug ?? '';
|
|
22
|
+
const pageTitle = analyticsContext?.title ?? '';
|
|
23
|
+
const pageType = analyticsContext?.type ?? '';
|
|
24
|
+
const videoProvider = identity.video_provider;
|
|
25
|
+
const videoId = identity.video_id;
|
|
26
|
+
const videoLocation = identity.location ?? '';
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
if (!canTrack) {
|
|
29
|
+
sessionRef.current = null;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const currentIdentity = identityRef.current;
|
|
33
|
+
const session = createVideoEngagementSession({
|
|
34
|
+
identity: {
|
|
35
|
+
...currentIdentity,
|
|
36
|
+
video_provider: videoProvider,
|
|
37
|
+
video_id: videoId,
|
|
38
|
+
location: videoLocation || currentIdentity.location,
|
|
39
|
+
slug: slug || currentIdentity.slug,
|
|
40
|
+
title: pageTitle || currentIdentity.title,
|
|
41
|
+
type: pageType || currentIdentity.type,
|
|
42
|
+
},
|
|
43
|
+
track: (event, properties) => {
|
|
44
|
+
trackEventRef.current(event, properties);
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
sessionRef.current = session;
|
|
48
|
+
const onPageHide = () => {
|
|
49
|
+
session.dispose();
|
|
50
|
+
};
|
|
51
|
+
window.addEventListener('pagehide', onPageHide);
|
|
52
|
+
return () => {
|
|
53
|
+
window.removeEventListener('pagehide', onPageHide);
|
|
54
|
+
session.dispose();
|
|
55
|
+
if (sessionRef.current === session) {
|
|
56
|
+
sessionRef.current = null;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}, [canTrack, videoProvider, videoId, videoLocation, slug, pageTitle, pageType]);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (!canTrack)
|
|
62
|
+
return;
|
|
63
|
+
const el = rootRef.current;
|
|
64
|
+
if (!el)
|
|
65
|
+
return;
|
|
66
|
+
const observer = new IntersectionObserver((entries) => {
|
|
67
|
+
const entry = entries[0];
|
|
68
|
+
if (entry?.isIntersecting) {
|
|
69
|
+
sessionRef.current?.markImpression();
|
|
70
|
+
}
|
|
71
|
+
}, { threshold: VIDEO_ENGAGEMENT_THRESHOLDS.impressionRatio });
|
|
72
|
+
observer.observe(el);
|
|
73
|
+
return () => observer.disconnect();
|
|
74
|
+
// videoProvider/videoId/location/slug: re-bind when tracked video identity changes
|
|
75
|
+
// (session is recreated in the effect above; observer must re-run for a new impression).
|
|
76
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: intentional identity key
|
|
77
|
+
}, [canTrack, videoProvider, videoId, videoLocation, slug]);
|
|
78
|
+
return { sessionRef, rootRef };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=useVideoEngagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useVideoEngagement.js","sourceRoot":"","sources":["../../../src/analytics/video/useVideoEngagement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party video engagement events fired via `trackEvent`.
|
|
3
|
+
* Sites map these names to GTM tags or HubSpot behavioural events.
|
|
4
|
+
*/
|
|
5
|
+
export declare const VIDEO_ENGAGEMENT_EVENTS: {
|
|
6
|
+
readonly impression: "video_impression";
|
|
7
|
+
readonly start: "video_start";
|
|
8
|
+
readonly progress: "video_progress";
|
|
9
|
+
readonly complete: "video_complete";
|
|
10
|
+
readonly seek: "video_seek";
|
|
11
|
+
readonly unmute: "video_unmute";
|
|
12
|
+
readonly fullscreen: "video_fullscreen";
|
|
13
|
+
readonly exit: "video_exit";
|
|
14
|
+
};
|
|
15
|
+
export type VideoEngagementEventName = (typeof VIDEO_ENGAGEMENT_EVENTS)[keyof typeof VIDEO_ENGAGEMENT_EVENTS];
|
|
16
|
+
/** All engagement event name strings (for HubSpot eventNameMap keys, etc.). */
|
|
17
|
+
export declare const VIDEO_ENGAGEMENT_EVENT_NAMES: readonly VideoEngagementEventName[];
|
|
18
|
+
export type VideoProvider = 'vimeo' | 'youtube' | 'local';
|
|
19
|
+
/**
|
|
20
|
+
* Thresholds for progress, completion, skip, and seek classification.
|
|
21
|
+
* Tuned for marketing-site explainer videos (not long-form).
|
|
22
|
+
*/
|
|
23
|
+
export declare const VIDEO_ENGAGEMENT_THRESHOLDS: {
|
|
24
|
+
/** Treat as completed when high-water mark reaches this % (or player ended). */
|
|
25
|
+
readonly completePercent: 95;
|
|
26
|
+
/** Exit with low % + short watch time counts as skipped. */
|
|
27
|
+
readonly skipMaxPercent: 10;
|
|
28
|
+
readonly skipMaxWatchSeconds: 3;
|
|
29
|
+
/** Large forward seek: at least this % of duration OR this many seconds. */
|
|
30
|
+
readonly seekMinPercent: 15;
|
|
31
|
+
readonly seekMinSeconds: 10;
|
|
32
|
+
/** After a large forward seek, incomplete exit with max_percent below this is skipped. */
|
|
33
|
+
readonly skipAfterSeekMaxPercent: 50;
|
|
34
|
+
readonly quartiles: readonly [25, 50, 75];
|
|
35
|
+
/** IntersectionObserver threshold for video_impression. */
|
|
36
|
+
readonly impressionRatio: 0.5;
|
|
37
|
+
};
|
|
38
|
+
export interface VideoEngagementIdentity {
|
|
39
|
+
video_provider: VideoProvider;
|
|
40
|
+
video_id: string;
|
|
41
|
+
video_title: string;
|
|
42
|
+
video_url?: string;
|
|
43
|
+
location?: string;
|
|
44
|
+
/** Page slug from IAnalyticsContext */
|
|
45
|
+
slug?: string;
|
|
46
|
+
/** Page title from IAnalyticsContext */
|
|
47
|
+
title?: string;
|
|
48
|
+
/** Page type from IAnalyticsContext */
|
|
49
|
+
type?: string;
|
|
50
|
+
}
|
|
51
|
+
export type VideoEngagementTrackFn = (event: string, properties: Record<string, unknown>) => void;
|
|
52
|
+
//# sourceMappingURL=videoEngagementTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoEngagementTypes.d.ts","sourceRoot":"","sources":["../../../src/analytics/video/videoEngagementTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;CAS1B,CAAC;AAEX,MAAM,MAAM,wBAAwB,GAClC,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,OAAO,uBAAuB,CAAC,CAAC;AAEzE,+EAA+E;AAC/E,eAAO,MAAM,4BAA4B,EAAE,SAAS,wBAAwB,EAS3E,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,gFAAgF;;IAEhF,4DAA4D;;;IAG5D,4EAA4E;;;IAG5E,0FAA0F;;;IAG1F,2DAA2D;;CAEnD,CAAC;AAEX,MAAM,WAAW,uBAAuB;IACtC,cAAc,EAAE,aAAa,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* First-party video engagement events fired via `trackEvent`.
|
|
3
|
+
* Sites map these names to GTM tags or HubSpot behavioural events.
|
|
4
|
+
*/
|
|
5
|
+
export const VIDEO_ENGAGEMENT_EVENTS = {
|
|
6
|
+
impression: 'video_impression',
|
|
7
|
+
start: 'video_start',
|
|
8
|
+
progress: 'video_progress',
|
|
9
|
+
complete: 'video_complete',
|
|
10
|
+
seek: 'video_seek',
|
|
11
|
+
unmute: 'video_unmute',
|
|
12
|
+
fullscreen: 'video_fullscreen',
|
|
13
|
+
exit: 'video_exit',
|
|
14
|
+
};
|
|
15
|
+
/** All engagement event name strings (for HubSpot eventNameMap keys, etc.). */
|
|
16
|
+
export const VIDEO_ENGAGEMENT_EVENT_NAMES = [
|
|
17
|
+
VIDEO_ENGAGEMENT_EVENTS.impression,
|
|
18
|
+
VIDEO_ENGAGEMENT_EVENTS.start,
|
|
19
|
+
VIDEO_ENGAGEMENT_EVENTS.progress,
|
|
20
|
+
VIDEO_ENGAGEMENT_EVENTS.complete,
|
|
21
|
+
VIDEO_ENGAGEMENT_EVENTS.seek,
|
|
22
|
+
VIDEO_ENGAGEMENT_EVENTS.unmute,
|
|
23
|
+
VIDEO_ENGAGEMENT_EVENTS.fullscreen,
|
|
24
|
+
VIDEO_ENGAGEMENT_EVENTS.exit,
|
|
25
|
+
];
|
|
26
|
+
/**
|
|
27
|
+
* Thresholds for progress, completion, skip, and seek classification.
|
|
28
|
+
* Tuned for marketing-site explainer videos (not long-form).
|
|
29
|
+
*/
|
|
30
|
+
export const VIDEO_ENGAGEMENT_THRESHOLDS = {
|
|
31
|
+
/** Treat as completed when high-water mark reaches this % (or player ended). */
|
|
32
|
+
completePercent: 95,
|
|
33
|
+
/** Exit with low % + short watch time counts as skipped. */
|
|
34
|
+
skipMaxPercent: 10,
|
|
35
|
+
skipMaxWatchSeconds: 3,
|
|
36
|
+
/** Large forward seek: at least this % of duration OR this many seconds. */
|
|
37
|
+
seekMinPercent: 15,
|
|
38
|
+
seekMinSeconds: 10,
|
|
39
|
+
/** After a large forward seek, incomplete exit with max_percent below this is skipped. */
|
|
40
|
+
skipAfterSeekMaxPercent: 50,
|
|
41
|
+
quartiles: [25, 50, 75],
|
|
42
|
+
/** IntersectionObserver threshold for video_impression. */
|
|
43
|
+
impressionRatio: 0.5,
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=videoEngagementTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"videoEngagementTypes.js","sourceRoot":"","sources":["../../../src/analytics/video/videoEngagementTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,UAAU,EAAE,kBAAkB;IAC9B,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,gBAAgB;IAC1B,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,kBAAkB;IAC9B,IAAI,EAAE,YAAY;CACV,CAAC;AAKX,+EAA+E;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAwC;IAC/E,uBAAuB,CAAC,UAAU;IAClC,uBAAuB,CAAC,KAAK;IAC7B,uBAAuB,CAAC,QAAQ;IAChC,uBAAuB,CAAC,QAAQ;IAChC,uBAAuB,CAAC,IAAI;IAC5B,uBAAuB,CAAC,MAAM;IAC9B,uBAAuB,CAAC,UAAU;IAClC,uBAAuB,CAAC,IAAI;CAC7B,CAAC;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,gFAAgF;IAChF,eAAe,EAAE,EAAE;IACnB,4DAA4D;IAC5D,cAAc,EAAE,EAAE;IAClB,mBAAmB,EAAE,CAAC;IACtB,4EAA4E;IAC5E,cAAc,EAAE,EAAE;IAClB,cAAc,EAAE,EAAE;IAClB,0FAA0F;IAC1F,uBAAuB,EAAE,EAAE;IAC3B,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU;IAChC,2DAA2D;IAC3D,eAAe,EAAE,GAAG;CACZ,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { IAnalyticsContext, IExternalVideo } from '@se-studio/core-data-types';
|
|
2
2
|
import type { ReactNode } from 'react';
|
|
3
3
|
import type { IVideoProps } from './Video';
|
|
4
|
-
declare function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, }: {
|
|
4
|
+
declare function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, startPlaybackOnMount, }: {
|
|
5
5
|
video: IExternalVideo;
|
|
6
6
|
vimeoId: string;
|
|
7
7
|
analyticsContext: IAnalyticsContext | null | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalVimeoEmbed.d.ts","sourceRoot":"","sources":["../../src/components/ExternalVimeoEmbed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,KAAK,EAAiB,SAAS,
|
|
1
|
+
{"version":3,"file":"ExternalVimeoEmbed.d.ts","sourceRoot":"","sources":["../../src/components/ExternalVimeoEmbed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEpF,OAAO,KAAK,EAAiB,SAAS,EAAa,MAAM,OAAO,CAAC;AAQjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAgD3C,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,SAAS,EACT,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,uBAAuB,EACvB,oBAA4B,GAC7B,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,uBAAuB,CAAC,EAAE,SAAS,CAAC;CACrC,GAAG,WAAW,+BAmOd;AAED,eAAe,kBAAkB,CAAC"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import Image from 'next/image';
|
|
4
|
-
import { useState } from 'react';
|
|
4
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
5
5
|
import { useAnalytics } from '../analytics/useAnalytics';
|
|
6
|
+
import { useVideoEngagement } from '../analytics/video/useVideoEngagement';
|
|
6
7
|
import { useExternalVideoPlayButton } from '../context/ExternalVideoPlayButtonContext';
|
|
7
8
|
import { cn } from '../utils/cn';
|
|
8
9
|
import { DefaultExternalVideoPlayButton } from './DefaultExternalVideoPlayButton';
|
|
10
|
+
import { LocalVideoPlayChrome } from './LocalVideoPlayChrome';
|
|
9
11
|
import { calculateCropDetails } from './Visual';
|
|
12
|
+
const PLAYBACK_REVEAL_TIMEOUT_MS = 12_000;
|
|
10
13
|
function getHighResThumbnail(url, embedWidth, embedHeight) {
|
|
11
14
|
const longEdge = 1280;
|
|
12
15
|
const [w, h] = embedHeight > embedWidth
|
|
@@ -43,9 +46,13 @@ function buildVimeoEmbedSrc(vimeoId, externalUrl, options) {
|
|
|
43
46
|
const qs = params.toString();
|
|
44
47
|
return `https://player.vimeo.com/video/${vimeoId}${qs ? `?${qs}` : ''}`;
|
|
45
48
|
}
|
|
46
|
-
function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, }) {
|
|
47
|
-
const [hasActivated, setHasActivated] = useState(
|
|
49
|
+
function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, startPlaybackOnMount = false, }) {
|
|
50
|
+
const [hasActivated, setHasActivated] = useState(!!startPlaybackOnMount && !autoPlay);
|
|
51
|
+
/** Cover (poster + chrome) stays until real playback starts. */
|
|
52
|
+
const [isPlaying, setIsPlaying] = useState(false);
|
|
53
|
+
const clickTrackedRef = useRef(false);
|
|
48
54
|
const { trackClick } = useAnalytics();
|
|
55
|
+
const iframeRef = useRef(null);
|
|
49
56
|
const embed = video.embed;
|
|
50
57
|
const cropProperties = calculateCropDetails(video);
|
|
51
58
|
const fullStyle = {
|
|
@@ -60,6 +67,127 @@ function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext
|
|
|
60
67
|
: rawPoster;
|
|
61
68
|
const playButtonFromContext = useExternalVideoPlayButton();
|
|
62
69
|
const playButtonContent = externalVideoPlayButton ?? playButtonFromContext;
|
|
70
|
+
const engagementEnabled = !autoPlay && !!analyticsContext;
|
|
71
|
+
const { sessionRef, rootRef } = useVideoEngagement({
|
|
72
|
+
identity: {
|
|
73
|
+
video_provider: 'vimeo',
|
|
74
|
+
video_id: vimeoId,
|
|
75
|
+
video_title: video.name,
|
|
76
|
+
video_url: video.external,
|
|
77
|
+
location: componentLabel ?? undefined,
|
|
78
|
+
},
|
|
79
|
+
analyticsContext,
|
|
80
|
+
enabled: engagementEnabled,
|
|
81
|
+
});
|
|
82
|
+
// Reveal player when Vimeo reports play (or after timeout so we never stick on cover).
|
|
83
|
+
useEffect(() => {
|
|
84
|
+
if (!hasActivated || autoPlay)
|
|
85
|
+
return;
|
|
86
|
+
const iframe = iframeRef.current;
|
|
87
|
+
if (!iframe)
|
|
88
|
+
return;
|
|
89
|
+
let cancelled = false;
|
|
90
|
+
let player = null;
|
|
91
|
+
let lastTime = 0;
|
|
92
|
+
const reveal = () => {
|
|
93
|
+
if (cancelled)
|
|
94
|
+
return;
|
|
95
|
+
setIsPlaying(true);
|
|
96
|
+
};
|
|
97
|
+
const timeoutId = window.setTimeout(reveal, PLAYBACK_REVEAL_TIMEOUT_MS);
|
|
98
|
+
let handlers = null;
|
|
99
|
+
const bind = async () => {
|
|
100
|
+
try {
|
|
101
|
+
const Player = (await import('@vimeo/player')).default;
|
|
102
|
+
if (cancelled)
|
|
103
|
+
return;
|
|
104
|
+
player = new Player(iframe);
|
|
105
|
+
handlers = {
|
|
106
|
+
onPlay: () => {
|
|
107
|
+
reveal();
|
|
108
|
+
if (engagementEnabled) {
|
|
109
|
+
void player?.getMuted().then((muted) => {
|
|
110
|
+
sessionRef.current?.onPlay(!!muted);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
onPause: () => {
|
|
115
|
+
sessionRef.current?.onPause();
|
|
116
|
+
},
|
|
117
|
+
onTimeUpdate: (data) => {
|
|
118
|
+
lastTime = data.seconds;
|
|
119
|
+
sessionRef.current?.onTime(data.seconds, data.duration);
|
|
120
|
+
},
|
|
121
|
+
onSeeked: (data) => {
|
|
122
|
+
sessionRef.current?.onSeek(lastTime, data.seconds, data.duration);
|
|
123
|
+
lastTime = data.seconds;
|
|
124
|
+
},
|
|
125
|
+
onEnded: () => {
|
|
126
|
+
void player?.getDuration().then((duration) => {
|
|
127
|
+
sessionRef.current?.onEnded(duration ?? 0);
|
|
128
|
+
});
|
|
129
|
+
},
|
|
130
|
+
onVolumeChange: () => {
|
|
131
|
+
void player?.getMuted().then((muted) => {
|
|
132
|
+
sessionRef.current?.onMuteChange(!!muted);
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
onFullscreenChange: (data) => {
|
|
136
|
+
sessionRef.current?.onFullscreen(!!data.fullscreen);
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
player.on('play', handlers.onPlay);
|
|
140
|
+
if (engagementEnabled) {
|
|
141
|
+
player.on('pause', handlers.onPause);
|
|
142
|
+
player.on('timeupdate', handlers.onTimeUpdate);
|
|
143
|
+
player.on('seeked', handlers.onSeeked);
|
|
144
|
+
player.on('ended', handlers.onEnded);
|
|
145
|
+
player.on('volumechange', handlers.onVolumeChange);
|
|
146
|
+
player.on('fullscreenchange', handlers.onFullscreenChange);
|
|
147
|
+
}
|
|
148
|
+
// Already playing (race with autoplay)
|
|
149
|
+
try {
|
|
150
|
+
const paused = await player.getPaused();
|
|
151
|
+
if (!paused)
|
|
152
|
+
reveal();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// ignore
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
reveal();
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
void bind();
|
|
163
|
+
return () => {
|
|
164
|
+
cancelled = true;
|
|
165
|
+
window.clearTimeout(timeoutId);
|
|
166
|
+
if (player && handlers) {
|
|
167
|
+
player.off('play', handlers.onPlay);
|
|
168
|
+
player.off('pause', handlers.onPause);
|
|
169
|
+
player.off('timeupdate', handlers.onTimeUpdate);
|
|
170
|
+
player.off('seeked', handlers.onSeeked);
|
|
171
|
+
player.off('ended', handlers.onEnded);
|
|
172
|
+
player.off('volumechange', handlers.onVolumeChange);
|
|
173
|
+
player.off('fullscreenchange', handlers.onFullscreenChange);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}, [hasActivated, autoPlay, engagementEnabled, sessionRef]);
|
|
177
|
+
// Intentional: trackClick = "opened player"; video_start fires when playback begins.
|
|
178
|
+
const trackOpenClick = useCallback(() => {
|
|
179
|
+
if (analyticsContext && !clickTrackedRef.current) {
|
|
180
|
+
clickTrackedRef.current = true;
|
|
181
|
+
trackClick('ExternalVideo', video.name, analyticsContext, {
|
|
182
|
+
location: componentLabel ?? undefined,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}, [analyticsContext, video.name, componentLabel, trackClick]);
|
|
186
|
+
useEffect(() => {
|
|
187
|
+
if (startPlaybackOnMount && !autoPlay) {
|
|
188
|
+
trackOpenClick();
|
|
189
|
+
}
|
|
190
|
+
}, [startPlaybackOnMount, autoPlay, trackOpenClick]);
|
|
63
191
|
if (autoPlay) {
|
|
64
192
|
return (_jsx("div", { className: cn('relative w-full overflow-hidden', className), style: fullStyle, children: _jsx("iframe", { src: buildVimeoEmbedSrc(vimeoId, video.external, {
|
|
65
193
|
autoplay: true,
|
|
@@ -70,13 +198,10 @@ function ExternalVimeoEmbed({ video, style, className, vimeoId, analyticsContext
|
|
|
70
198
|
}
|
|
71
199
|
function handlePlay() {
|
|
72
200
|
setHasActivated(true);
|
|
73
|
-
|
|
74
|
-
trackClick('ExternalVideo', video.name, analyticsContext, {
|
|
75
|
-
location: componentLabel ?? undefined,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
201
|
+
trackOpenClick();
|
|
78
202
|
}
|
|
79
|
-
|
|
203
|
+
const showCover = !isPlaying;
|
|
204
|
+
return (_jsxs("div", { ref: rootRef, className: cn('relative w-full overflow-hidden bg-neutral-900', className), style: fullStyle, children: [hasActivated && (_jsx("iframe", { ref: iframeRef, src: buildVimeoEmbedSrc(vimeoId, video.external, { autoplay: true, loop, dnt }), title: video.name, className: "absolute inset-0 h-full w-full border-0", frameBorder: "0", allow: "autoplay; fullscreen; picture-in-picture", allowFullScreen: true })), showCover && (_jsxs("div", { className: "absolute inset-0 z-10", children: [poster && (_jsx(Image, { src: poster, alt: video.name, width: video.width ?? 1920, height: video.height ?? 1080, style: { objectFit: 'cover' }, sizes: "100vw", className: "h-full w-full" })), _jsx(LocalVideoPlayChrome, { label: `Play video: ${video.name}`, onPlay: handlePlay, loading: hasActivated && !isPlaying, playButton: playButtonContent ?? _jsx(DefaultExternalVideoPlayButton, {}) })] }))] }));
|
|
80
205
|
}
|
|
81
206
|
export default ExternalVimeoEmbed;
|
|
82
207
|
//# sourceMappingURL=ExternalVimeoEmbed.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalVimeoEmbed.js","sourceRoot":"","sources":["../../src/components/ExternalVimeoEmbed.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ExternalVimeoEmbed.js","sourceRoot":"","sources":["../../src/components/ExternalVimeoEmbed.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { IAnalyticsContext, IExternalVideo } from '@se-studio/core-data-types';
|
|
2
2
|
import type { IVideoProps } from './Video';
|
|
3
|
-
export declare function ExternalYoutubeEmbed({ video, style, className, youTubeId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, }: {
|
|
3
|
+
export declare function ExternalYoutubeEmbed({ video, style, className, youTubeId, analyticsContext, componentLabel, autoPlay, loop, externalVideoPlayButton, startPlaybackOnMount, }: {
|
|
4
4
|
video: IExternalVideo;
|
|
5
5
|
youTubeId: string;
|
|
6
6
|
analyticsContext: IAnalyticsContext | null | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExternalYouTubeEmbed.d.ts","sourceRoot":"","sources":["../../src/components/ExternalYouTubeEmbed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"ExternalYouTubeEmbed.d.ts","sourceRoot":"","sources":["../../src/components/ExternalYouTubeEmbed.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAiBpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA0C3C,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,IAAI,EACJ,uBAAuB,EACvB,oBAA4B,GAC7B,EAAE;IACD,KAAK,EAAE,cAAc,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CAC3C,GAAG,WAAW,+BAoOd"}
|