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.
Files changed (105) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/android/build.gradle +13 -7
  3. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/11.0.0/ads-wrapper-11.0.0.aar +0 -0
  4. 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
  5. package/android/local/com/theoplayer/theoplayer-sdk-android/ads-wrapper/maven-metadata-local.xml +4 -4
  6. package/android/src/main/java/com/theoplayer/PlayerConfigAdapter.kt +7 -7
  7. package/android/src/main/java/com/theoplayer/ads/AdAdapter.kt +7 -12
  8. package/android/src/main/java/com/theoplayer/ads/AdsModule.kt +23 -51
  9. package/android/src/main/java/com/theoplayer/cast/CastModule.kt +0 -1
  10. package/android/src/main/java/com/theoplayer/track/TrackListAdapter.kt +14 -17
  11. package/ios/ads/THEOplayerRCTAdAdapter.swift +2 -2
  12. package/ios/ads/THEOplayerRCTAdsNative.swift +1 -1
  13. package/ios/presentationMode/THEOplayerRCTPresentationModeManager.swift +3 -2
  14. package/lib/commonjs/api/event/PlayerEvent.js +0 -9
  15. package/lib/commonjs/api/event/PlayerEvent.js.map +1 -1
  16. package/lib/commonjs/api/player/PlayerEventMap.js +0 -1
  17. package/lib/commonjs/api/player/PlayerEventMap.js.map +1 -1
  18. package/lib/commonjs/api/source/SourceDescription.js +0 -80
  19. package/lib/commonjs/api/source/SourceDescription.js.map +1 -1
  20. package/lib/commonjs/api/track/TextTrack.js.map +1 -1
  21. package/lib/commonjs/internal/THEOplayerView.js +24 -7
  22. package/lib/commonjs/internal/THEOplayerView.js.map +1 -1
  23. package/lib/commonjs/internal/THEOplayerView.web.js +5 -3
  24. package/lib/commonjs/internal/THEOplayerView.web.js.map +1 -1
  25. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js +0 -3
  26. package/lib/commonjs/internal/adapter/THEOplayerAdapter.js.map +1 -1
  27. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js +0 -3
  28. package/lib/commonjs/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  29. package/lib/commonjs/internal/adapter/WebEventForwarder.js +0 -1
  30. package/lib/commonjs/internal/adapter/WebEventForwarder.js.map +1 -1
  31. package/lib/commonjs/internal/adapter/event/PlayerEvents.js +1 -13
  32. package/lib/commonjs/internal/adapter/event/PlayerEvents.js.map +1 -1
  33. package/lib/commonjs/internal/adapter/web/TrackUtils.js +3 -1
  34. package/lib/commonjs/internal/adapter/web/TrackUtils.js.map +1 -1
  35. package/lib/commonjs/internal/hooks/useIsAttached.js +48 -0
  36. package/lib/commonjs/internal/hooks/useIsAttached.js.map +1 -0
  37. package/lib/commonjs/manifest.json +1 -1
  38. package/lib/module/api/event/PlayerEvent.js +0 -10
  39. package/lib/module/api/event/PlayerEvent.js.map +1 -1
  40. package/lib/module/api/player/PlayerEventMap.js +0 -1
  41. package/lib/module/api/player/PlayerEventMap.js.map +1 -1
  42. package/lib/module/api/source/SourceDescription.js +1 -88
  43. package/lib/module/api/source/SourceDescription.js.map +1 -1
  44. package/lib/module/api/track/TextTrack.js.map +1 -1
  45. package/lib/module/internal/THEOplayerView.js +25 -8
  46. package/lib/module/internal/THEOplayerView.js.map +1 -1
  47. package/lib/module/internal/THEOplayerView.web.js +5 -3
  48. package/lib/module/internal/THEOplayerView.web.js.map +1 -1
  49. package/lib/module/internal/adapter/THEOplayerAdapter.js +0 -3
  50. package/lib/module/internal/adapter/THEOplayerAdapter.js.map +1 -1
  51. package/lib/module/internal/adapter/THEOplayerWebAdapter.js +0 -3
  52. package/lib/module/internal/adapter/THEOplayerWebAdapter.js.map +1 -1
  53. package/lib/module/internal/adapter/WebEventForwarder.js +1 -2
  54. package/lib/module/internal/adapter/WebEventForwarder.js.map +1 -1
  55. package/lib/module/internal/adapter/event/PlayerEvents.js +0 -11
  56. package/lib/module/internal/adapter/event/PlayerEvents.js.map +1 -1
  57. package/lib/module/internal/adapter/web/TrackUtils.js +3 -1
  58. package/lib/module/internal/adapter/web/TrackUtils.js.map +1 -1
  59. package/lib/module/internal/hooks/useIsAttached.js +43 -0
  60. package/lib/module/internal/hooks/useIsAttached.js.map +1 -0
  61. package/lib/module/manifest.json +1 -1
  62. package/lib/typescript/api/event/PlayerEvent.d.ts +0 -19
  63. package/lib/typescript/api/event/PlayerEvent.d.ts.map +1 -1
  64. package/lib/typescript/api/player/PlayerEventMap.d.ts +1 -11
  65. package/lib/typescript/api/player/PlayerEventMap.d.ts.map +1 -1
  66. package/lib/typescript/api/player/THEOplayer.d.ts +0 -6
  67. package/lib/typescript/api/player/THEOplayer.d.ts.map +1 -1
  68. package/lib/typescript/api/source/SourceDescription.d.ts +0 -20
  69. package/lib/typescript/api/source/SourceDescription.d.ts.map +1 -1
  70. package/lib/typescript/api/theolive/TheoLiveSource.d.ts +3 -3
  71. package/lib/typescript/api/theolive/TheoLiveSource.d.ts.map +1 -1
  72. package/lib/typescript/api/track/TextTrack.d.ts +11 -0
  73. package/lib/typescript/api/track/TextTrack.d.ts.map +1 -1
  74. package/lib/typescript/internal/THEOplayerView.d.ts +2 -1
  75. package/lib/typescript/internal/THEOplayerView.d.ts.map +1 -1
  76. package/lib/typescript/internal/THEOplayerView.web.d.ts.map +1 -1
  77. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts +0 -1
  78. package/lib/typescript/internal/adapter/THEOplayerAdapter.d.ts.map +1 -1
  79. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts +0 -1
  80. package/lib/typescript/internal/adapter/THEOplayerWebAdapter.d.ts.map +1 -1
  81. package/lib/typescript/internal/adapter/WebEventForwarder.d.ts.map +1 -1
  82. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts +1 -9
  83. package/lib/typescript/internal/adapter/event/PlayerEvents.d.ts.map +1 -1
  84. package/lib/typescript/internal/adapter/web/TrackUtils.d.ts.map +1 -1
  85. package/lib/typescript/internal/hooks/useIsAttached.d.ts +16 -0
  86. package/lib/typescript/internal/hooks/useIsAttached.d.ts.map +1 -0
  87. package/package.json +9 -9
  88. package/react-native-theoplayer.podspec +8 -8
  89. package/src/api/event/PlayerEvent.ts +0 -21
  90. package/src/api/player/PlayerEventMap.ts +0 -12
  91. package/src/api/player/THEOplayer.ts +0 -7
  92. package/src/api/source/SourceDescription.ts +0 -22
  93. package/src/api/theolive/TheoLiveSource.ts +3 -3
  94. package/src/api/track/TextTrack.ts +12 -0
  95. package/src/internal/THEOplayerView.tsx +27 -12
  96. package/src/internal/THEOplayerView.web.tsx +6 -4
  97. package/src/internal/adapter/THEOplayerAdapter.ts +0 -4
  98. package/src/internal/adapter/THEOplayerWebAdapter.ts +0 -4
  99. package/src/internal/adapter/WebEventForwarder.ts +0 -2
  100. package/src/internal/adapter/event/PlayerEvents.ts +0 -13
  101. package/src/internal/adapter/track/TextTrackStyleAdapter.ts +4 -4
  102. package/src/internal/adapter/web/TrackUtils.ts +2 -1
  103. package/src/internal/hooks/useIsAttached.ts +44 -0
  104. package/src/manifest.json +1 -1
  105. 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
- screenSize: ScaledSize;
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
- screenSize: getFullscreenSize(),
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({ screenSize: getFullscreenSize() });
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
- this.setState({ presentationMode }, () => {
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({ screenSize: getFullscreenSize() });
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, screenSize: fullscreenSize } = this.state;
442
- return presentationMode === PresentationMode.fullscreen ||
443
- (Platform.OS === 'android' && presentationMode === PresentationMode.pip && this._facade?.pipConfiguration?.reparentPip == true)
444
- ? fullscreenSize
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<null | HTMLDivElement>(null);
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":"10.12.1","buildDate":"2026-03-19T10:58:07.375Z"}
1
+ {"version":"11.0.0","buildDate":"2026-04-16T14:36:11.831Z"}