react-native-theoplayer 10.12.1 → 11.0.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 +30 -0
- package/android/build.gradle +13 -7
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/11.0.0/ads-wrapper-11.0.0.aar +0 -0
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/{10.12.0/ads-wrapper-10.12.0.pom → 11.0.0/ads-wrapper-11.0.0.pom} +3 -3
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +4 -4
- package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +7 -7
- package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +7 -12
- package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +23 -51
- package/android/src/main/java/com/theoplayer/cast/CastModule.kt +0 -1
- package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +14 -17
- package/ios/ads/THEOplayerRCTAdAdapter.swift +2 -2
- package/ios/ads/THEOplayerRCTAdsNative.swift +1 -1
- package/ios/presentationMode/THEOplayerRCTPresentationModeManager.swift +3 -2
- package/lib/commonjs/api/event/PlayerEvent.js +0 -9
- package/lib/commonjs/api/event/PlayerEvent.js.map +1 -1
- package/lib/commonjs/api/player/PlayerEventMap.js +0 -1
- package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
- package/lib/commonjs/api/source/SourceDescription.js +0 -80
- package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
- package/lib/commonjs/api/track/TextTrack.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.js +24 -7
- package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
- package/lib/commonjs/internal/THEOplayerView.web.js +5 -3
- package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +0 -3
- package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +0 -3
- package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/commonjs/internal/adapter/WebEventForwarder.js +0 -1
- package/lib/commonjs/internal/adapter/WebEventForwarder.js.map +1 -1
- package/lib/commonjs/internal/adapter/event/PlayerEvents.js +1 -13
- package/lib/commonjs/internal/adapter/event/PlayerEvents.js.map +1 -1
- package/lib/commonjs/internal/adapter/web/TrackUtils.js +3 -1
- package/lib/commonjs/internal/adapter/web/TrackUtils.js.map +1 -1
- package/lib/commonjs/internal/hooks/useIsAttached.js +48 -0
- package/lib/commonjs/internal/hooks/useIsAttached.js.map +1 -0
- package/lib/commonjs/manifest.json +1 -1
- package/lib/module/api/event/PlayerEvent.js +0 -10
- package/lib/module/api/event/PlayerEvent.js.map +1 -1
- package/lib/module/api/player/PlayerEventMap.js +0 -1
- package/lib/module/api/player/PlayerEventMap.js.map +1 -1
- package/lib/module/api/source/SourceDescription.js +1 -88
- package/lib/module/api/source/SourceDescription.js.map +1 -1
- package/lib/module/api/track/TextTrack.js.map +1 -1
- package/lib/module/internal/THEOplayerView.js +25 -8
- package/lib/module/internal/THEOplayerView.js.map +1 -1
- package/lib/module/internal/THEOplayerView.web.js +5 -3
- package/lib/module/internal/THEOplayerView.web.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerAdapter.js +0 -3
- package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js +0 -3
- package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
- package/lib/module/internal/adapter/WebEventForwarder.js +1 -2
- package/lib/module/internal/adapter/WebEventForwarder.js.map +1 -1
- package/lib/module/internal/adapter/event/PlayerEvents.js +0 -11
- package/lib/module/internal/adapter/event/PlayerEvents.js.map +1 -1
- package/lib/module/internal/adapter/web/TrackUtils.js +3 -1
- package/lib/module/internal/adapter/web/TrackUtils.js.map +1 -1
- package/lib/module/internal/hooks/useIsAttached.js +43 -0
- package/lib/module/internal/hooks/useIsAttached.js.map +1 -0
- package/lib/module/manifest.json +1 -1
- package/lib/typescript/api/event/PlayerEvent.d.ts +0 -19
- package/lib/typescript/api/event/PlayerEvent.d.ts.map +1 -1
- package/lib/typescript/api/player/PlayerEventMap.d.ts +1 -11
- package/lib/typescript/api/player/PlayerEventMap.d.ts.map +1 -1
- package/lib/typescript/api/player/THEOplayer.d.ts +0 -6
- package/lib/typescript/api/player/THEOplayer.d.ts.map +1 -1
- package/lib/typescript/api/source/SourceDescription.d.ts +0 -20
- package/lib/typescript/api/source/SourceDescription.d.ts.map +1 -1
- package/lib/typescript/api/theolive/TheoLiveSource.d.ts +3 -3
- package/lib/typescript/api/theolive/TheoLiveSource.d.ts.map +1 -1
- package/lib/typescript/api/track/TextTrack.d.ts +11 -0
- package/lib/typescript/api/track/TextTrack.d.ts.map +1 -1
- package/lib/typescript/internal/THEOplayerView.d.ts +2 -1
- package/lib/typescript/internal/THEOplayerView.d.ts.map +1 -1
- package/lib/typescript/internal/THEOplayerView.web.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +0 -1
- package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +0 -1
- package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/WebEventForwarder.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts +1 -9
- package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts.map +1 -1
- package/lib/typescript/internal/adapter/web/TrackUtils.d.ts.map +1 -1
- package/lib/typescript/internal/hooks/useIsAttached.d.ts +16 -0
- package/lib/typescript/internal/hooks/useIsAttached.d.ts.map +1 -0
- package/package.json +9 -9
- package/react-native-theoplayer.podspec +8 -8
- package/src/api/event/PlayerEvent.ts +0 -21
- package/src/api/player/PlayerEventMap.ts +0 -12
- package/src/api/player/THEOplayer.ts +0 -7
- package/src/api/source/SourceDescription.ts +0 -22
- package/src/api/theolive/TheoLiveSource.ts +3 -3
- package/src/api/track/TextTrack.ts +12 -0
- package/src/internal/THEOplayerView.tsx +27 -12
- package/src/internal/THEOplayerView.web.tsx +6 -4
- package/src/internal/adapter/THEOplayerAdapter.ts +0 -4
- package/src/internal/adapter/THEOplayerWebAdapter.ts +0 -4
- package/src/internal/adapter/WebEventForwarder.ts +0 -2
- package/src/internal/adapter/event/PlayerEvents.ts +0 -13
- package/src/internal/adapter/track/TextTrackStyleAdapter.ts +4 -4
- package/src/internal/adapter/web/TrackUtils.ts +2 -1
- package/src/internal/hooks/useIsAttached.ts +44 -0
- package/src/manifest.json +1 -1
- package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/10.12.0/ads-wrapper-10.12.0.aar +0 -0
|
@@ -39,7 +39,6 @@ import {
|
|
|
39
39
|
DefaultTextTrackListEvent,
|
|
40
40
|
DefaultVolumeChangeEvent,
|
|
41
41
|
DefaultTimeupdateEvent,
|
|
42
|
-
DefaultResizeEvent,
|
|
43
42
|
DefaultSeekingEvent,
|
|
44
43
|
DefaultSeekedEvent,
|
|
45
44
|
DefaultVideoResizeEvent,
|
|
@@ -124,7 +123,8 @@ interface THEOplayerRCTViewProps {
|
|
|
124
123
|
interface THEOplayerRCTViewState {
|
|
125
124
|
error?: PlayerError;
|
|
126
125
|
presentationMode?: PresentationMode | undefined;
|
|
127
|
-
|
|
126
|
+
previousPresentationMode?: PresentationMode | undefined;
|
|
127
|
+
fullscreenSizeOverride: ScaledSize;
|
|
128
128
|
posterActive: boolean;
|
|
129
129
|
poster: string | undefined;
|
|
130
130
|
}
|
|
@@ -139,7 +139,8 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
|
|
|
139
139
|
private static initialState: THEOplayerRCTViewState = {
|
|
140
140
|
error: undefined,
|
|
141
141
|
presentationMode: PresentationMode.inline,
|
|
142
|
-
|
|
142
|
+
previousPresentationMode: undefined,
|
|
143
|
+
fullscreenSizeOverride: getFullscreenSize(),
|
|
143
144
|
posterActive: false,
|
|
144
145
|
poster: undefined,
|
|
145
146
|
};
|
|
@@ -186,7 +187,7 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
|
|
|
186
187
|
}
|
|
187
188
|
|
|
188
189
|
private _onDimensionsChanged = () => {
|
|
189
|
-
this.setState({
|
|
190
|
+
this.setState({ fullscreenSizeOverride: getFullscreenSize() });
|
|
190
191
|
};
|
|
191
192
|
|
|
192
193
|
private _onDeviceOrientationChanged = () => {
|
|
@@ -399,10 +400,11 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
|
|
|
399
400
|
|
|
400
401
|
private _onPresentationModeChange = (event: NativeSyntheticEvent<NativePresentationModeChangeEvent>) => {
|
|
401
402
|
const presentationMode = event.nativeEvent.presentationMode;
|
|
402
|
-
|
|
403
|
+
const previousPresentationMode = event.nativeEvent.previousPresentationMode;
|
|
404
|
+
this.setState({ presentationMode, previousPresentationMode }, () => {
|
|
403
405
|
// Re-measure screen size after transitioning to fullscreen.
|
|
404
406
|
if (presentationMode === PresentationMode.fullscreen) {
|
|
405
|
-
this.setState({
|
|
407
|
+
this.setState({ fullscreenSizeOverride: getFullscreenSize() });
|
|
406
408
|
}
|
|
407
409
|
});
|
|
408
410
|
this._facade?.dispatchEvent(
|
|
@@ -417,7 +419,6 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
|
|
|
417
419
|
private _onDimensionChange = (event: NativeSyntheticEvent<NativeDimensionChangeEvent>) => {
|
|
418
420
|
const width = event.nativeEvent.width;
|
|
419
421
|
const height = event.nativeEvent.height;
|
|
420
|
-
this._facade?.dispatchEvent(new DefaultResizeEvent(width, height));
|
|
421
422
|
this._facade?.dispatchEvent(new DefaultDimensionChangeEvent(width, height));
|
|
422
423
|
};
|
|
423
424
|
|
|
@@ -438,11 +439,25 @@ export class THEOplayerView extends PureComponent<React.PropsWithChildren<THEOpl
|
|
|
438
439
|
};
|
|
439
440
|
|
|
440
441
|
private styleOverride() {
|
|
441
|
-
const { presentationMode,
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
442
|
+
const { presentationMode, previousPresentationMode, fullscreenSizeOverride: fullscreenOverride } = this.state;
|
|
443
|
+
|
|
444
|
+
// When in fullscreen, we need to apply an override to make sure the player fills the entire screen
|
|
445
|
+
if (presentationMode === PresentationMode.fullscreen) {
|
|
446
|
+
return fullscreenOverride;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// When in PiP, we need to apply the same override if the PiP configuration specifies reparenting, or when coming from fullscreen.
|
|
450
|
+
if (presentationMode === PresentationMode.pip) {
|
|
451
|
+
if (
|
|
452
|
+
(Platform.OS === 'android' && this._facade?.pipConfiguration?.reparentPip === true) ||
|
|
453
|
+
previousPresentationMode === PresentationMode.fullscreen
|
|
454
|
+
) {
|
|
455
|
+
return fullscreenOverride;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// otherwise, no override is needed
|
|
460
|
+
return {};
|
|
446
461
|
}
|
|
447
462
|
|
|
448
463
|
public render(): React.JSX.Element {
|
|
@@ -2,16 +2,18 @@ import React, { useEffect, useRef } from 'react';
|
|
|
2
2
|
import type { THEOplayerViewProps } from 'react-native-theoplayer';
|
|
3
3
|
import { ChromelessPlayer } from 'theoplayer';
|
|
4
4
|
import { THEOplayerWebAdapter } from './adapter/THEOplayerWebAdapter';
|
|
5
|
+
import { useIsAttached } from './hooks/useIsAttached';
|
|
5
6
|
|
|
6
7
|
export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProps>) {
|
|
7
8
|
const { config, children, onPlayerReady, onPlayerDestroy } = props;
|
|
8
9
|
const player = useRef<ChromelessPlayer | null>(null);
|
|
9
10
|
const adapter = useRef<THEOplayerWebAdapter | null>(null);
|
|
10
|
-
const container = useRef<
|
|
11
|
+
const container = useRef<HTMLDivElement | null>(null);
|
|
12
|
+
const attachedToDocument = useIsAttached(container);
|
|
11
13
|
|
|
12
14
|
useEffect(() => {
|
|
13
|
-
// Create player inside container.
|
|
14
|
-
if (container.current) {
|
|
15
|
+
// Create player inside container once it is attached to the document.
|
|
16
|
+
if (container.current && attachedToDocument) {
|
|
15
17
|
const ads = {
|
|
16
18
|
...config?.ads,
|
|
17
19
|
googleIma: {
|
|
@@ -51,7 +53,7 @@ export function THEOplayerView(props: React.PropsWithChildren<THEOplayerViewProp
|
|
|
51
53
|
};
|
|
52
54
|
// TODO: Follow the rules of react hooks, to be fixed in next major because it's a breaking change for some customers.
|
|
53
55
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
54
|
-
}, [container]);
|
|
56
|
+
}, [container, attachedToDocument]);
|
|
55
57
|
|
|
56
58
|
return (
|
|
57
59
|
// Note: `display: contents` causes an element's children to appear as if they were direct children of the element's parent,
|
|
@@ -243,10 +243,6 @@ export class THEOplayerAdapter extends DefaultEventDispatcher<PlayerEventMap> im
|
|
|
243
243
|
return this._theoliveAdapter;
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
-
get theolive(): TheoLiveAPI {
|
|
247
|
-
return this._theoliveAdapter;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
246
|
set autoplay(autoplay: boolean) {
|
|
251
247
|
this._state.autoplay = autoplay;
|
|
252
248
|
NativePlayerModule.setAutoplay(this._view.nativeHandle, autoplay);
|
|
@@ -374,10 +374,6 @@ export class THEOplayerWebAdapter extends DefaultEventDispatcher<PlayerEventMap>
|
|
|
374
374
|
return this._theoliveAdapter;
|
|
375
375
|
}
|
|
376
376
|
|
|
377
|
-
public get theolive(): TheoLiveAPI {
|
|
378
|
-
return this._theoliveAdapter;
|
|
379
|
-
}
|
|
380
|
-
|
|
381
377
|
public get version(): PlayerVersion {
|
|
382
378
|
return {
|
|
383
379
|
version: nativeVersion,
|
|
@@ -62,7 +62,6 @@ import {
|
|
|
62
62
|
DefaultProgressEvent,
|
|
63
63
|
DefaultRateChangeEvent,
|
|
64
64
|
DefaultReadyStateChangeEvent,
|
|
65
|
-
DefaultResizeEvent,
|
|
66
65
|
DefaultSeekedEvent,
|
|
67
66
|
DefaultSeekingEvent,
|
|
68
67
|
DefaultSegmentNotFoundEvent,
|
|
@@ -289,7 +288,6 @@ export class WebEventForwarder {
|
|
|
289
288
|
};
|
|
290
289
|
|
|
291
290
|
private readonly onDimensionChange = (event: NativeDimensionChangeEvent) => {
|
|
292
|
-
this._facade.dispatchEvent(new DefaultResizeEvent(event.width, event.height));
|
|
293
291
|
this._facade.dispatchEvent(new DefaultDimensionChangeEvent(event.width, event.height));
|
|
294
292
|
};
|
|
295
293
|
|
|
@@ -30,7 +30,6 @@ import {
|
|
|
30
30
|
Quality,
|
|
31
31
|
RateChangeEvent,
|
|
32
32
|
ReadyStateChangeEvent,
|
|
33
|
-
ResizeEvent,
|
|
34
33
|
SeekedEvent,
|
|
35
34
|
SeekingEvent,
|
|
36
35
|
SegmentNotFoundEvent,
|
|
@@ -103,18 +102,6 @@ export class DefaultVolumeChangeEvent extends BaseEvent<PlayerEventType.VOLUME_C
|
|
|
103
102
|
}
|
|
104
103
|
}
|
|
105
104
|
|
|
106
|
-
/**
|
|
107
|
-
* @deprecated Use {@link DefaultDimensionChangeEvent} instead. This event is set for removal in version 11.
|
|
108
|
-
*/
|
|
109
|
-
export class DefaultResizeEvent extends BaseEvent<PlayerEventType.RESIZE> implements ResizeEvent {
|
|
110
|
-
constructor(
|
|
111
|
-
public width: number,
|
|
112
|
-
public height: number,
|
|
113
|
-
) {
|
|
114
|
-
super(PlayerEventType.RESIZE);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
105
|
export class DefaultDimensionChangeEvent extends BaseEvent<PlayerEventType.DIMENSION_CHANGE> implements DimensionChangeEvent {
|
|
119
106
|
constructor(
|
|
120
107
|
public width: number,
|
|
@@ -77,14 +77,14 @@ export class TextTrackStyleAdapter implements TextTrackStyle {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
get fontPath(): string | undefined {
|
|
80
|
-
return this._fontPath
|
|
80
|
+
return this._fontPath;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
set fontPath(path: string) {
|
|
84
|
-
this._fontPath = path
|
|
84
|
+
this._fontPath = path;
|
|
85
85
|
NativePlayerModule.setTextTrackStyle(this._view.nativeHandle, {
|
|
86
|
-
fontPath: path
|
|
87
|
-
})
|
|
86
|
+
fontPath: path,
|
|
87
|
+
});
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
get fontSize(): string | undefined {
|
|
@@ -41,7 +41,7 @@ export function fromNativeTextTrackList(tracks: NativeTextTrackList): TextTrack[
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export function fromNativeTextTrack(track: NativeTextTrack): TextTrack {
|
|
44
|
-
const { id, uid, kind, label, language, mode, type, src, forced } = track;
|
|
44
|
+
const { id, uid, kind, label, language, mode, type, src, forced, captionChannel } = track;
|
|
45
45
|
|
|
46
46
|
return {
|
|
47
47
|
id,
|
|
@@ -53,6 +53,7 @@ export function fromNativeTextTrack(track: NativeTextTrack): TextTrack {
|
|
|
53
53
|
type,
|
|
54
54
|
src,
|
|
55
55
|
forced,
|
|
56
|
+
captionChannel,
|
|
56
57
|
cues: track.cues ? track.cues.map((cue) => fromNativeCue(cue)) : [],
|
|
57
58
|
} as TextTrack;
|
|
58
59
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React hook to determine if a referenced HTMLDivElement is currently attached to the document.
|
|
3
|
+
*
|
|
4
|
+
* This hook checks if the provided ref's current element is attached to the DOM (document.body).
|
|
5
|
+
* Returns a boolean indicating the attachment state.
|
|
6
|
+
* Once attached, it will stop observing for changes to optimize performance.
|
|
7
|
+
*
|
|
8
|
+
* @param ref - React ref object pointing to an HTMLDivElement
|
|
9
|
+
* @returns boolean - true if the element is attached to the document, false otherwise
|
|
10
|
+
*/
|
|
11
|
+
import { RefObject, useEffect, useState } from 'react';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param ref
|
|
15
|
+
*/
|
|
16
|
+
export const useIsAttached = (ref: RefObject<HTMLDivElement | null>) => {
|
|
17
|
+
const [isAttached, setIsAttached] = useState<boolean>(false);
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (!ref.current) return;
|
|
21
|
+
|
|
22
|
+
const checkAttached = () => {
|
|
23
|
+
const connected = ref.current?.isConnected ?? false;
|
|
24
|
+
setIsAttached(connected);
|
|
25
|
+
return connected;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
if (checkAttached()) return;
|
|
29
|
+
|
|
30
|
+
const observer: MutationObserver = new MutationObserver(() => {
|
|
31
|
+
const attached = checkAttached();
|
|
32
|
+
// Once attached, stop observing.
|
|
33
|
+
if (attached) {
|
|
34
|
+
observer.disconnect();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
observer.observe(document.body, {
|
|
38
|
+
childList: true,
|
|
39
|
+
subtree: true,
|
|
40
|
+
});
|
|
41
|
+
return () => observer.disconnect();
|
|
42
|
+
}, [ref]);
|
|
43
|
+
return isAttached;
|
|
44
|
+
};
|
package/src/manifest.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"
|
|
1
|
+
{"version":"11.0.0","buildDate":"2026-04-16T14:36:11.831Z"}
|