@livekit/react-native 2.0.1 → 2.1.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/README.md +4 -0
- package/android/src/main/java/com/livekit/reactnative/LiveKitReactNative.kt +4 -4
- package/android/src/main/java/com/livekit/reactnative/video/CustomVideoDecoderFactory.kt +67 -0
- package/android/src/main/java/com/livekit/reactnative/video/CustomVideoEncoderFactory.kt +74 -0
- package/lib/commonjs/components/LiveKitRoom.js +43 -0
- package/lib/commonjs/components/LiveKitRoom.js.map +1 -0
- package/lib/commonjs/components/VideoTrack.js +171 -0
- package/lib/commonjs/components/VideoTrack.js.map +1 -0
- package/lib/commonjs/components/VideoView.js +15 -11
- package/lib/commonjs/components/VideoView.js.map +1 -1
- package/lib/commonjs/components/ViewPortDetector.js +134 -39
- package/lib/commonjs/components/ViewPortDetector.js.map +1 -1
- package/lib/commonjs/hooks.js +232 -0
- package/lib/commonjs/hooks.js.map +1 -0
- package/lib/commonjs/index.js +42 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/useParticipant.js +1 -0
- package/lib/commonjs/useParticipant.js.map +1 -1
- package/lib/commonjs/useRoom.js +1 -0
- package/lib/commonjs/useRoom.js.map +1 -1
- package/lib/module/components/LiveKitRoom.js +32 -0
- package/lib/module/components/LiveKitRoom.js.map +1 -0
- package/lib/module/components/VideoTrack.js +152 -0
- package/lib/module/components/VideoTrack.js.map +1 -0
- package/lib/module/components/VideoView.js +20 -12
- package/lib/module/components/VideoView.js.map +1 -1
- package/lib/module/components/ViewPortDetector.js +134 -40
- package/lib/module/components/ViewPortDetector.js.map +1 -1
- package/lib/module/hooks.js +3 -0
- package/lib/module/hooks.js.map +1 -0
- package/lib/module/index.js +9 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/useParticipant.js +3 -0
- package/lib/module/useParticipant.js.map +1 -1
- package/lib/module/useRoom.js +2 -0
- package/lib/module/useRoom.js.map +1 -1
- package/lib/typescript/components/LiveKitRoom.d.ts +90 -0
- package/lib/typescript/components/VideoTrack.d.ts +11 -0
- package/lib/typescript/components/VideoView.d.ts +6 -0
- package/lib/typescript/components/ViewPortDetector.d.ts +11 -4
- package/lib/typescript/hooks.d.ts +2 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/useParticipant.d.ts +2 -0
- package/lib/typescript/useRoom.d.ts +1 -0
- package/livekit-react-native.podspec +5 -0
- package/package.json +2 -1
- package/src/components/LiveKitRoom.tsx +118 -0
- package/src/components/VideoTrack.tsx +150 -0
- package/src/components/VideoView.tsx +26 -13
- package/src/components/ViewPortDetector.tsx +112 -21
- package/src/hooks.ts +40 -0
- package/src/index.tsx +6 -4
- package/src/useParticipant.ts +2 -1
- package/src/useRoom.ts +1 -0
- package/android/local.properties +0 -8
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/xcuserdata/davidliu.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/LivekitReactNative.xcodeproj/xcuserdata/davidliu.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useRoom.ts"],"names":["useRoom","room","options","error","participants","setParticipants","audioTracks","setAudioTracks","sortFunc","sortParticipants","onParticipantsChanged","remotes","Array","from","remoteParticipants","values","newParticipants","localParticipant","push","onSubscribedTrackChanged","track","kind","Track","Kind","Audio","tracks","forEach","p","audioTrackPublications","pub","audioTrack","onConnectionStateChanged","state","ConnectionState","Connected","once","RoomEvent","Disconnected","off","ParticipantConnected","ParticipantDisconnected","ActiveSpeakersChanged","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","AudioPlaybackStatusChanged","ConnectionStateChanged","on","Reconnected","disconnect","sort","a","b","isSpeaking","audioLevel","lastSpokeAt","aLast","getTime","bLast","aVideo","videoTrackPublications","size","bVideo","joinedAt","localIdx","indexOf","splice","length"],"mappings":"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","sourcesContent":["import {\n AudioTrack,\n ConnectionState,\n LocalParticipant,\n Participant,\n RemoteTrack,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\nexport interface RoomState {\n room?: Room;\n /* all participants in the room, including the local participant. */\n participants: Participant[];\n /* all subscribed audio tracks in the room, not including local participant. */\n audioTracks: AudioTrack[];\n error?: Error;\n}\n\nexport interface RoomOptions {\n sortParticipants?: (participants: Participant[]) => void;\n}\n\nexport function useRoom(room: Room, options?: RoomOptions): RoomState {\n const [error] = useState<Error>();\n const [participants, setParticipants] = useState<Participant[]>([]);\n const [audioTracks, setAudioTracks] = useState<AudioTrack[]>([]);\n\n const sortFunc = options?.sortParticipants ?? sortParticipants;\n\n useEffect(() => {\n const onParticipantsChanged = () => {\n const remotes = Array.from(room.remoteParticipants.values());\n const newParticipants: Participant[] = [room.localParticipant];\n newParticipants.push(...remotes);\n sortFunc(newParticipants, room.localParticipant);\n setParticipants(newParticipants);\n };\n const onSubscribedTrackChanged = (track?: RemoteTrack) => {\n // ordering may have changed, re-sort\n onParticipantsChanged();\n if (track && track.kind !== Track.Kind.Audio) {\n return;\n }\n const tracks: AudioTrack[] = [];\n room.remoteParticipants.forEach((p) => {\n p.audioTrackPublications.forEach((pub) => {\n if (pub.audioTrack) {\n tracks.push(pub.audioTrack);\n }\n });\n });\n setAudioTracks(tracks);\n };\n\n const onConnectionStateChanged = (state: ConnectionState) => {\n if (state === ConnectionState.Connected) {\n onParticipantsChanged();\n }\n };\n\n room.once(RoomEvent.Disconnected, () => {\n room\n .off(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .off(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .off(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .off(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .off(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n .off(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged)\n .off(RoomEvent.ConnectionStateChanged, onConnectionStateChanged);\n });\n room\n .on(RoomEvent.ConnectionStateChanged, onConnectionStateChanged)\n .on(RoomEvent.Reconnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .on(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .on(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .on(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n // trigger a state change by re-sorting participants\n .on(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged);\n\n onSubscribedTrackChanged();\n\n return () => {\n room.disconnect();\n };\n }, [room, sortFunc]);\n\n return {\n error,\n participants,\n audioTracks,\n };\n}\n\n/**\n * Default sort for participants, it'll order participants by:\n * 1. dominant speaker (speaker with the loudest audio level)\n * 2. local participant\n * 3. other speakers that are recently active\n * 4. participants with video on\n * 5. by joinedAt\n */\nexport function sortParticipants(\n participants: Participant[],\n localParticipant?: LocalParticipant\n) {\n participants.sort((a, b) => {\n // loudest speaker first\n if (a.isSpeaking && b.isSpeaking) {\n return b.audioLevel - a.audioLevel;\n }\n\n // speaker goes first\n if (a.isSpeaking !== b.isSpeaking) {\n if (a.isSpeaking) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // last active speaker first\n if (a.lastSpokeAt !== b.lastSpokeAt) {\n const aLast = a.lastSpokeAt?.getTime() ?? 0;\n const bLast = b.lastSpokeAt?.getTime() ?? 0;\n return bLast - aLast;\n }\n\n // video on\n const aVideo = a.videoTrackPublications.size > 0;\n const bVideo = b.videoTrackPublications.size > 0;\n if (aVideo !== bVideo) {\n if (aVideo) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // joinedAt\n return (a.joinedAt?.getTime() ?? 0) - (b.joinedAt?.getTime() ?? 0);\n });\n\n if (localParticipant) {\n const localIdx = participants.indexOf(localParticipant);\n if (localIdx >= 0) {\n participants.splice(localIdx, 1);\n if (participants.length > 0) {\n participants.splice(1, 0, localParticipant);\n } else {\n participants.push(localParticipant);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useRoom.ts"],"names":["useRoom","room","options","error","participants","setParticipants","audioTracks","setAudioTracks","sortFunc","sortParticipants","onParticipantsChanged","remotes","Array","from","remoteParticipants","values","newParticipants","localParticipant","push","onSubscribedTrackChanged","track","kind","Track","Kind","Audio","tracks","forEach","p","audioTrackPublications","pub","audioTrack","onConnectionStateChanged","state","ConnectionState","Connected","once","RoomEvent","Disconnected","off","ParticipantConnected","ParticipantDisconnected","ActiveSpeakersChanged","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","AudioPlaybackStatusChanged","ConnectionStateChanged","on","Reconnected","disconnect","sort","a","b","isSpeaking","audioLevel","lastSpokeAt","aLast","getTime","bLast","aVideo","videoTrackPublications","size","bVideo","joinedAt","localIdx","indexOf","splice","length"],"mappings":"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","sourcesContent":["import {\n AudioTrack,\n ConnectionState,\n LocalParticipant,\n Participant,\n RemoteTrack,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\nexport interface RoomState {\n room?: Room;\n /* all participants in the room, including the local participant. */\n participants: Participant[];\n /* all subscribed audio tracks in the room, not including local participant. */\n audioTracks: AudioTrack[];\n error?: Error;\n}\n\nexport interface RoomOptions {\n sortParticipants?: (participants: Participant[]) => void;\n}\n\n/** @deprecated wrap your components in a <LiveKitRoom> component instead and use more granular hooks to track state you're interested in */\nexport function useRoom(room: Room, options?: RoomOptions): RoomState {\n const [error] = useState<Error>();\n const [participants, setParticipants] = useState<Participant[]>([]);\n const [audioTracks, setAudioTracks] = useState<AudioTrack[]>([]);\n\n const sortFunc = options?.sortParticipants ?? sortParticipants;\n\n useEffect(() => {\n const onParticipantsChanged = () => {\n const remotes = Array.from(room.remoteParticipants.values());\n const newParticipants: Participant[] = [room.localParticipant];\n newParticipants.push(...remotes);\n sortFunc(newParticipants, room.localParticipant);\n setParticipants(newParticipants);\n };\n const onSubscribedTrackChanged = (track?: RemoteTrack) => {\n // ordering may have changed, re-sort\n onParticipantsChanged();\n if (track && track.kind !== Track.Kind.Audio) {\n return;\n }\n const tracks: AudioTrack[] = [];\n room.remoteParticipants.forEach((p) => {\n p.audioTrackPublications.forEach((pub) => {\n if (pub.audioTrack) {\n tracks.push(pub.audioTrack);\n }\n });\n });\n setAudioTracks(tracks);\n };\n\n const onConnectionStateChanged = (state: ConnectionState) => {\n if (state === ConnectionState.Connected) {\n onParticipantsChanged();\n }\n };\n\n room.once(RoomEvent.Disconnected, () => {\n room\n .off(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .off(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .off(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .off(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .off(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n .off(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged)\n .off(RoomEvent.ConnectionStateChanged, onConnectionStateChanged);\n });\n room\n .on(RoomEvent.ConnectionStateChanged, onConnectionStateChanged)\n .on(RoomEvent.Reconnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .on(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .on(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .on(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n // trigger a state change by re-sorting participants\n .on(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged);\n\n onSubscribedTrackChanged();\n\n return () => {\n room.disconnect();\n };\n }, [room, sortFunc]);\n\n return {\n error,\n participants,\n audioTracks,\n };\n}\n\n/**\n * Default sort for participants, it'll order participants by:\n * 1. dominant speaker (speaker with the loudest audio level)\n * 2. local participant\n * 3. other speakers that are recently active\n * 4. participants with video on\n * 5. by joinedAt\n */\nexport function sortParticipants(\n participants: Participant[],\n localParticipant?: LocalParticipant\n) {\n participants.sort((a, b) => {\n // loudest speaker first\n if (a.isSpeaking && b.isSpeaking) {\n return b.audioLevel - a.audioLevel;\n }\n\n // speaker goes first\n if (a.isSpeaking !== b.isSpeaking) {\n if (a.isSpeaking) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // last active speaker first\n if (a.lastSpokeAt !== b.lastSpokeAt) {\n const aLast = a.lastSpokeAt?.getTime() ?? 0;\n const bLast = b.lastSpokeAt?.getTime() ?? 0;\n return bLast - aLast;\n }\n\n // video on\n const aVideo = a.videoTrackPublications.size > 0;\n const bVideo = b.videoTrackPublications.size > 0;\n if (aVideo !== bVideo) {\n if (aVideo) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // joinedAt\n return (a.joinedAt?.getTime() ?? 0) - (b.joinedAt?.getTime() ?? 0);\n });\n\n if (localParticipant) {\n const localIdx = participants.indexOf(localParticipant);\n if (localIdx >= 0) {\n participants.splice(localIdx, 1);\n if (participants.length > 0) {\n participants.splice(1, 0, localParticipant);\n } else {\n participants.push(localParticipant);\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LKFeatureContext, RoomContext, useLiveKitRoom } from '@livekit/components-react';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
/** @public */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The `LiveKitRoom` component provides the room context to all its child components.
|
|
7
|
+
* It is generally the starting point of your LiveKit app and the root of the LiveKit component tree.
|
|
8
|
+
* It provides the room state as a React context to all child components, so you don't have to pass it yourself.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <LiveKitRoom
|
|
13
|
+
* token='<livekit-token>'
|
|
14
|
+
* serverUrl='<url-to-livekit-server>'
|
|
15
|
+
* connect={true}
|
|
16
|
+
* >
|
|
17
|
+
* ...
|
|
18
|
+
* </LiveKitRoom>
|
|
19
|
+
* ```
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export function LiveKitRoom(props) {
|
|
23
|
+
const {
|
|
24
|
+
room
|
|
25
|
+
} = useLiveKitRoom(props);
|
|
26
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, room && /*#__PURE__*/React.createElement(RoomContext.Provider, {
|
|
27
|
+
value: room
|
|
28
|
+
}, /*#__PURE__*/React.createElement(LKFeatureContext.Provider, {
|
|
29
|
+
value: props.featureFlags
|
|
30
|
+
}, props.children)));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=LiveKitRoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["LiveKitRoom.tsx"],"names":["LKFeatureContext","RoomContext","useLiveKitRoom","React","LiveKitRoom","props","room","featureFlags","children"],"mappings":"AAAA,SAEEA,gBAFF,EAGEC,WAHF,EAIEC,cAJF,QAKO,2BALP;AAcA,OAAO,KAAKC,KAAZ,MAAuB,OAAvB;AAEA;;AAuEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,WAAT,CAAqBC,KAArB,EAAuE;AAC5E,QAAM;AAAEC,IAAAA;AAAF,MAAWJ,cAAc,CAACG,KAAD,CAA/B;AACA,sBACE,0CACGC,IAAI,iBACH,oBAAC,WAAD,CAAa,QAAb;AAAsB,IAAA,KAAK,EAAEA;AAA7B,kBACE,oBAAC,gBAAD,CAAkB,QAAlB;AAA2B,IAAA,KAAK,EAAED,KAAK,CAACE;AAAxC,KACGF,KAAK,CAACG,QADT,CADF,CAFJ,CADF;AAWD","sourcesContent":["import {\n FeatureFlags,\n LKFeatureContext,\n RoomContext,\n useLiveKitRoom,\n} from '@livekit/components-react';\nimport type {\n AudioCaptureOptions,\n RoomConnectOptions,\n RoomOptions,\n ScreenShareCaptureOptions,\n VideoCaptureOptions,\n} from 'livekit-client';\nimport type { MediaDeviceFailure, Room } from 'livekit-client';\nimport * as React from 'react';\n\n/** @public */\nexport interface LiveKitRoomProps {\n /**\n * URL to the LiveKit server.\n * For example: `wss://<domain>.livekit.cloud`\n * To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string url can the connection be established.\n */\n serverUrl: string | undefined;\n /**\n * A user specific access token for a client to authenticate to the room.\n * This token is necessary to establish a connection to the room.\n * To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string token can the connection be established.\n *\n * @see https://docs.livekit.io/cloud/project-management/keys-and-tokens/#generating-access-tokens\n */\n token: string | undefined;\n /**\n * Publish audio immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/AudioCaptureOptions.html\n */\n audio?: AudioCaptureOptions | boolean;\n /**\n * Publish video immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/VideoCaptureOptions.html\n */\n video?: VideoCaptureOptions | boolean;\n /**\n * Publish screen share immediately after connecting to your LiveKit room.\n * @defaultValue `false`\n * @see https://docs.livekit.io/client-sdk-js/interfaces/ScreenShareCaptureOptions.html\n */\n screen?: ScreenShareCaptureOptions | boolean;\n /**\n * If set to true a connection to LiveKit room is initiated.\n * @defaultValue `false`\n */\n connect?: boolean;\n /**\n * Options for when creating a new room.\n * When you pass your own room instance to this component, these options have no effect.\n * Instead, set the options directly in the room instance.\n *\n * @see https://docs.livekit.io/client-sdk-js/interfaces/RoomOptions.html\n */\n options?: RoomOptions;\n /**\n * Define options how to connect to the LiveKit server.\n *\n * @see https://docs.livekit.io/client-sdk-js/interfaces/RoomConnectOptions.html\n */\n connectOptions?: RoomConnectOptions;\n onConnected?: () => void;\n onDisconnected?: () => void;\n onError?: (error: Error) => void;\n onMediaDeviceFailure?: (failure?: MediaDeviceFailure) => void;\n onEncryptionError?: (error: Error) => void;\n /**\n * Optional room instance.\n * By passing your own room instance you overwrite the `options` parameter,\n * make sure to set the options directly on the room instance itself.\n */\n room?: Room;\n\n simulateParticipants?: number | undefined;\n\n /** @experimental */\n featureFlags?: FeatureFlags | undefined;\n}\n\n/**\n * The `LiveKitRoom` component provides the room context to all its child components.\n * It is generally the starting point of your LiveKit app and the root of the LiveKit component tree.\n * It provides the room state as a React context to all child components, so you don't have to pass it yourself.\n *\n * @example\n * ```tsx\n * <LiveKitRoom\n * token='<livekit-token>'\n * serverUrl='<url-to-livekit-server>'\n * connect={true}\n * >\n * ...\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function LiveKitRoom(props: React.PropsWithChildren<LiveKitRoomProps>) {\n const { room } = useLiveKitRoom(props);\n return (\n <>\n {room && (\n <RoomContext.Provider value={room}>\n <LKFeatureContext.Provider value={props.featureFlags}>\n {props.children}\n </LKFeatureContext.Provider>\n </RoomContext.Provider>\n )}\n </>\n );\n}\n"]}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { StyleSheet, View } from 'react-native';
|
|
5
|
+
import { LocalVideoTrack, TrackEvent } from 'livekit-client';
|
|
6
|
+
import { RTCView } from '@livekit/react-native-webrtc';
|
|
7
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
8
|
+
import { RemoteVideoTrack } from 'livekit-client';
|
|
9
|
+
import ViewPortDetector from './ViewPortDetector';
|
|
10
|
+
export const VideoTrack = _ref => {
|
|
11
|
+
var _mediaStream$toURL;
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
style = {},
|
|
15
|
+
trackRef,
|
|
16
|
+
objectFit = 'cover',
|
|
17
|
+
zOrder,
|
|
18
|
+
mirror
|
|
19
|
+
} = _ref;
|
|
20
|
+
const [elementInfo] = useState(() => {
|
|
21
|
+
var _trackRef$publication;
|
|
22
|
+
|
|
23
|
+
let info = new VideoTrackElementInfo();
|
|
24
|
+
info.id = trackRef === null || trackRef === void 0 ? void 0 : (_trackRef$publication = trackRef.publication) === null || _trackRef$publication === void 0 ? void 0 : _trackRef$publication.trackSid;
|
|
25
|
+
return info;
|
|
26
|
+
});
|
|
27
|
+
const layoutOnChange = useCallback(event => elementInfo.onLayout(event), [elementInfo]);
|
|
28
|
+
const visibilityOnChange = useCallback(isVisible => elementInfo.onVisibility(isVisible), [elementInfo]);
|
|
29
|
+
const videoTrack = trackRef === null || trackRef === void 0 ? void 0 : trackRef.publication.track;
|
|
30
|
+
const shouldObserveVisibility = useMemo(() => {
|
|
31
|
+
return videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream;
|
|
32
|
+
}, [videoTrack]);
|
|
33
|
+
const [mediaStream, setMediaStream] = useState(videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.mediaStream);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
setMediaStream(videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.mediaStream);
|
|
36
|
+
|
|
37
|
+
if (videoTrack instanceof LocalVideoTrack) {
|
|
38
|
+
const onRestarted = track => {
|
|
39
|
+
setMediaStream(track === null || track === void 0 ? void 0 : track.mediaStream);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
videoTrack.on(TrackEvent.Restarted, onRestarted);
|
|
43
|
+
return () => {
|
|
44
|
+
videoTrack.off(TrackEvent.Restarted, onRestarted);
|
|
45
|
+
};
|
|
46
|
+
} else {
|
|
47
|
+
return () => {};
|
|
48
|
+
}
|
|
49
|
+
}, [videoTrack]);
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream) {
|
|
52
|
+
videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.observeElementInfo(elementInfo);
|
|
53
|
+
return () => {
|
|
54
|
+
videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.stopObservingElementInfo(elementInfo);
|
|
55
|
+
};
|
|
56
|
+
} else {
|
|
57
|
+
return () => {};
|
|
58
|
+
}
|
|
59
|
+
}, [videoTrack, elementInfo]);
|
|
60
|
+
return /*#__PURE__*/React.createElement(View, {
|
|
61
|
+
style: { ...style,
|
|
62
|
+
...styles.container
|
|
63
|
+
},
|
|
64
|
+
onLayout: layoutOnChange
|
|
65
|
+
}, /*#__PURE__*/React.createElement(ViewPortDetector, {
|
|
66
|
+
onChange: visibilityOnChange,
|
|
67
|
+
style: styles.videoTrack,
|
|
68
|
+
disabled: !shouldObserveVisibility,
|
|
69
|
+
propKey: videoTrack
|
|
70
|
+
}, /*#__PURE__*/React.createElement(RTCView, {
|
|
71
|
+
style: styles.videoTrack,
|
|
72
|
+
streamURL: (_mediaStream$toURL = mediaStream === null || mediaStream === void 0 ? void 0 : mediaStream.toURL()) !== null && _mediaStream$toURL !== void 0 ? _mediaStream$toURL : '',
|
|
73
|
+
objectFit: objectFit,
|
|
74
|
+
zOrder: zOrder,
|
|
75
|
+
mirror: mirror
|
|
76
|
+
})));
|
|
77
|
+
};
|
|
78
|
+
const styles = StyleSheet.create({
|
|
79
|
+
container: {},
|
|
80
|
+
videoTrack: {
|
|
81
|
+
flex: 1,
|
|
82
|
+
width: '100%'
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
class VideoTrackElementInfo {
|
|
87
|
+
constructor() {
|
|
88
|
+
_defineProperty(this, "element", {});
|
|
89
|
+
|
|
90
|
+
_defineProperty(this, "something", void 0);
|
|
91
|
+
|
|
92
|
+
_defineProperty(this, "id", void 0);
|
|
93
|
+
|
|
94
|
+
_defineProperty(this, "_width", 0);
|
|
95
|
+
|
|
96
|
+
_defineProperty(this, "_height", 0);
|
|
97
|
+
|
|
98
|
+
_defineProperty(this, "_observing", false);
|
|
99
|
+
|
|
100
|
+
_defineProperty(this, "visible", true);
|
|
101
|
+
|
|
102
|
+
_defineProperty(this, "visibilityChangedAt", void 0);
|
|
103
|
+
|
|
104
|
+
_defineProperty(this, "pictureInPicture", false);
|
|
105
|
+
|
|
106
|
+
_defineProperty(this, "handleResize", void 0);
|
|
107
|
+
|
|
108
|
+
_defineProperty(this, "handleVisibilityChanged", void 0);
|
|
109
|
+
|
|
110
|
+
_defineProperty(this, "width", () => this._width);
|
|
111
|
+
|
|
112
|
+
_defineProperty(this, "height", () => this._height);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
observe() {
|
|
116
|
+
this._observing = true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
stopObserving() {
|
|
120
|
+
this._observing = false;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
onLayout(event) {
|
|
124
|
+
let {
|
|
125
|
+
width,
|
|
126
|
+
height
|
|
127
|
+
} = event.nativeEvent.layout;
|
|
128
|
+
this._width = width;
|
|
129
|
+
this._height = height;
|
|
130
|
+
|
|
131
|
+
if (this._observing) {
|
|
132
|
+
var _this$handleResize;
|
|
133
|
+
|
|
134
|
+
(_this$handleResize = this.handleResize) === null || _this$handleResize === void 0 ? void 0 : _this$handleResize.call(this);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
onVisibility(isVisible) {
|
|
139
|
+
if (this.visible !== isVisible) {
|
|
140
|
+
this.visible = isVisible;
|
|
141
|
+
this.visibilityChangedAt = Date.now();
|
|
142
|
+
|
|
143
|
+
if (this._observing) {
|
|
144
|
+
var _this$handleVisibilit;
|
|
145
|
+
|
|
146
|
+
(_this$handleVisibilit = this.handleVisibilityChanged) === null || _this$handleVisibilit === void 0 ? void 0 : _this$handleVisibilit.call(this);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=VideoTrack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["VideoTrack.tsx"],"names":["React","StyleSheet","View","LocalVideoTrack","TrackEvent","RTCView","useCallback","useEffect","useMemo","useState","RemoteVideoTrack","ViewPortDetector","VideoTrack","style","trackRef","objectFit","zOrder","mirror","elementInfo","info","VideoTrackElementInfo","id","publication","trackSid","layoutOnChange","event","onLayout","visibilityOnChange","isVisible","onVisibility","videoTrack","track","shouldObserveVisibility","isAdaptiveStream","mediaStream","setMediaStream","onRestarted","on","Restarted","off","observeElementInfo","stopObservingElementInfo","styles","container","toURL","create","flex","width","_width","_height","observe","_observing","stopObserving","height","nativeEvent","layout","handleResize","visible","visibilityChangedAt","Date","now","handleVisibilityChanged"],"mappings":"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","sourcesContent":["import * as React from 'react';\n\nimport { LayoutChangeEvent, StyleSheet, View, ViewStyle } from 'react-native';\nimport {\n ElementInfo,\n LocalVideoTrack,\n Track,\n TrackEvent,\n} from 'livekit-client';\nimport { RTCView } from '@livekit/react-native-webrtc';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { RemoteVideoTrack } from 'livekit-client';\nimport ViewPortDetector from './ViewPortDetector';\nimport type { TrackReference } from '@livekit/components-react';\n\nexport type VideoTrackProps = {\n trackRef: TrackReference | undefined;\n style?: ViewStyle;\n objectFit?: 'cover' | 'contain' | undefined;\n mirror?: boolean;\n zOrder?: number;\n};\n\nexport const VideoTrack = ({\n style = {},\n trackRef,\n objectFit = 'cover',\n zOrder,\n mirror,\n}: VideoTrackProps) => {\n const [elementInfo] = useState(() => {\n let info = new VideoTrackElementInfo();\n info.id = trackRef?.publication?.trackSid;\n return info;\n });\n\n const layoutOnChange = useCallback(\n (event: LayoutChangeEvent) => elementInfo.onLayout(event),\n [elementInfo]\n );\n const visibilityOnChange = useCallback(\n (isVisible: boolean) => elementInfo.onVisibility(isVisible),\n [elementInfo]\n );\n\n const videoTrack = trackRef?.publication.track;\n\n const shouldObserveVisibility = useMemo(() => {\n return (\n videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream\n );\n }, [videoTrack]);\n\n const [mediaStream, setMediaStream] = useState(videoTrack?.mediaStream);\n useEffect(() => {\n setMediaStream(videoTrack?.mediaStream);\n if (videoTrack instanceof LocalVideoTrack) {\n const onRestarted = (track: Track | null) => {\n setMediaStream(track?.mediaStream);\n };\n videoTrack.on(TrackEvent.Restarted, onRestarted);\n\n return () => {\n videoTrack.off(TrackEvent.Restarted, onRestarted);\n };\n } else {\n return () => {};\n }\n }, [videoTrack]);\n\n useEffect(() => {\n if (videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream) {\n videoTrack?.observeElementInfo(elementInfo);\n return () => {\n videoTrack?.stopObservingElementInfo(elementInfo);\n };\n } else {\n return () => {};\n }\n }, [videoTrack, elementInfo]);\n\n return (\n <View style={{ ...style, ...styles.container }} onLayout={layoutOnChange}>\n <ViewPortDetector\n onChange={visibilityOnChange}\n style={styles.videoTrack}\n disabled={!shouldObserveVisibility}\n propKey={videoTrack}\n >\n <RTCView\n style={styles.videoTrack}\n streamURL={mediaStream?.toURL() ?? ''}\n objectFit={objectFit}\n zOrder={zOrder}\n mirror={mirror}\n />\n </ViewPortDetector>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {},\n videoTrack: {\n flex: 1,\n width: '100%',\n },\n});\n\nclass VideoTrackElementInfo implements ElementInfo {\n element: object = {};\n something?: any;\n id?: string;\n _width = 0;\n _height = 0;\n _observing = false;\n visible: boolean = true;\n visibilityChangedAt: number | undefined;\n pictureInPicture = false;\n handleResize?: (() => void) | undefined;\n handleVisibilityChanged?: (() => void) | undefined;\n width = () => this._width;\n height = () => this._height;\n\n observe(): void {\n this._observing = true;\n }\n stopObserving(): void {\n this._observing = false;\n }\n\n onLayout(event: LayoutChangeEvent) {\n let { width, height } = event.nativeEvent.layout;\n this._width = width;\n this._height = height;\n\n if (this._observing) {\n this.handleResize?.();\n }\n }\n onVisibility(isVisible: boolean) {\n if (this.visible !== isVisible) {\n this.visible = isVisible;\n this.visibilityChangedAt = Date.now();\n if (this._observing) {\n this.handleVisibilityChanged?.();\n }\n }\n }\n}\n"]}
|
|
@@ -4,9 +4,16 @@ import * as React from 'react';
|
|
|
4
4
|
import { StyleSheet, View } from 'react-native';
|
|
5
5
|
import { LocalVideoTrack, TrackEvent } from 'livekit-client';
|
|
6
6
|
import { RTCView } from '@livekit/react-native-webrtc';
|
|
7
|
-
import { useEffect, useState } from 'react';
|
|
7
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
8
8
|
import { RemoteVideoTrack } from 'livekit-client';
|
|
9
9
|
import ViewPortDetector from './ViewPortDetector';
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated use `VideoTrack` and `VideoTrackProps` instead.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated use `VideoTrack` and `VideoTrackProps` instead.
|
|
16
|
+
*/
|
|
10
17
|
export const VideoView = _ref => {
|
|
11
18
|
var _mediaStream$toURL;
|
|
12
19
|
|
|
@@ -23,6 +30,11 @@ export const VideoView = _ref => {
|
|
|
23
30
|
info.something = videoTrack;
|
|
24
31
|
return info;
|
|
25
32
|
});
|
|
33
|
+
const layoutOnChange = useCallback(event => elementInfo.onLayout(event), [elementInfo]);
|
|
34
|
+
const visibilityOnChange = useCallback(isVisible => elementInfo.onVisibility(isVisible), [elementInfo]);
|
|
35
|
+
const shouldObserveVisibility = useMemo(() => {
|
|
36
|
+
return videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream;
|
|
37
|
+
}, [videoTrack]);
|
|
26
38
|
const [mediaStream, setMediaStream] = useState(videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.mediaStream);
|
|
27
39
|
useEffect(() => {
|
|
28
40
|
setMediaStream(videoTrack === null || videoTrack === void 0 ? void 0 : videoTrack.mediaStream);
|
|
@@ -54,18 +66,14 @@ export const VideoView = _ref => {
|
|
|
54
66
|
style: { ...style,
|
|
55
67
|
...styles.container
|
|
56
68
|
},
|
|
57
|
-
onLayout:
|
|
58
|
-
elementInfo.onLayout(event);
|
|
59
|
-
}
|
|
69
|
+
onLayout: layoutOnChange
|
|
60
70
|
}, /*#__PURE__*/React.createElement(ViewPortDetector, {
|
|
61
|
-
onChange:
|
|
62
|
-
style: styles.videoView
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
width: '100%'
|
|
68
|
-
},
|
|
71
|
+
onChange: visibilityOnChange,
|
|
72
|
+
style: styles.videoView,
|
|
73
|
+
disabled: !shouldObserveVisibility,
|
|
74
|
+
propKey: videoTrack
|
|
75
|
+
}, /*#__PURE__*/React.createElement(RTCView, {
|
|
76
|
+
style: styles.videoView,
|
|
69
77
|
streamURL: (_mediaStream$toURL = mediaStream === null || mediaStream === void 0 ? void 0 : mediaStream.toURL()) !== null && _mediaStream$toURL !== void 0 ? _mediaStream$toURL : '',
|
|
70
78
|
objectFit: objectFit,
|
|
71
79
|
zOrder: zOrder,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["VideoView.tsx"],"names":["React","StyleSheet","View","LocalVideoTrack","TrackEvent","RTCView","useEffect","useState","RemoteVideoTrack","ViewPortDetector","VideoView","style","videoTrack","objectFit","zOrder","mirror","elementInfo","info","VideoViewElementInfo","id","sid","something","
|
|
1
|
+
{"version":3,"sources":["VideoView.tsx"],"names":["React","StyleSheet","View","LocalVideoTrack","TrackEvent","RTCView","useCallback","useEffect","useMemo","useState","RemoteVideoTrack","ViewPortDetector","VideoView","style","videoTrack","objectFit","zOrder","mirror","elementInfo","info","VideoViewElementInfo","id","sid","something","layoutOnChange","event","onLayout","visibilityOnChange","isVisible","onVisibility","shouldObserveVisibility","isAdaptiveStream","mediaStream","setMediaStream","onRestarted","track","on","Restarted","off","observeElementInfo","stopObservingElementInfo","styles","container","videoView","toURL","create","flex","width","_width","_height","observe","_observing","stopObserving","height","nativeEvent","layout","handleResize","visible","visibilityChangedAt","Date","now","handleVisibilityChanged"],"mappings":";;AAAA,OAAO,KAAKA,KAAZ,MAAuB,OAAvB;AAEA,SAA4BC,UAA5B,EAAwCC,IAAxC,QAA+D,cAA/D;AACA,SAEEC,eAFF,EAIEC,UAJF,QAMO,gBANP;AAOA,SAASC,OAAT,QAAwB,8BAAxB;AACA,SAASC,WAAT,EAAsBC,SAAtB,EAAiCC,OAAjC,EAA0CC,QAA1C,QAA0D,OAA1D;AACA,SAASC,gBAAT,QAAiC,gBAAjC;AACA,OAAOC,gBAAP,MAA6B,oBAA7B;AAEA;AACA;AACA;;AASA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAG,QAMZ;AAAA;;AAAA,MANa;AACxBC,IAAAA,KAAK,GAAG,EADgB;AAExBC,IAAAA,UAFwB;AAGxBC,IAAAA,SAAS,GAAG,OAHY;AAIxBC,IAAAA,MAJwB;AAKxBC,IAAAA;AALwB,GAMb;AACX,QAAM,CAACC,WAAD,IAAgBT,QAAQ,CAAC,MAAM;AACnC,QAAIU,IAAI,GAAG,IAAIC,oBAAJ,EAAX;AACAD,IAAAA,IAAI,CAACE,EAAL,GAAUP,UAAV,aAAUA,UAAV,uBAAUA,UAAU,CAAEQ,GAAtB;AACAH,IAAAA,IAAI,CAACI,SAAL,GAAiBT,UAAjB;AACA,WAAOK,IAAP;AACD,GAL6B,CAA9B;AAOA,QAAMK,cAAc,GAAGlB,WAAW,CAC/BmB,KAAD,IAA8BP,WAAW,CAACQ,QAAZ,CAAqBD,KAArB,CADE,EAEhC,CAACP,WAAD,CAFgC,CAAlC;AAIA,QAAMS,kBAAkB,GAAGrB,WAAW,CACnCsB,SAAD,IAAwBV,WAAW,CAACW,YAAZ,CAAyBD,SAAzB,CADY,EAEpC,CAACV,WAAD,CAFoC,CAAtC;AAIA,QAAMY,uBAAuB,GAAGtB,OAAO,CAAC,MAAM;AAC5C,WACEM,UAAU,YAAYJ,gBAAtB,IAA0CI,UAAU,CAACiB,gBADvD;AAGD,GAJsC,EAIpC,CAACjB,UAAD,CAJoC,CAAvC;AAMA,QAAM,CAACkB,WAAD,EAAcC,cAAd,IAAgCxB,QAAQ,CAACK,UAAD,aAACA,UAAD,uBAACA,UAAU,CAAEkB,WAAb,CAA9C;AACAzB,EAAAA,SAAS,CAAC,MAAM;AACd0B,IAAAA,cAAc,CAACnB,UAAD,aAACA,UAAD,uBAACA,UAAU,CAAEkB,WAAb,CAAd;;AACA,QAAIlB,UAAU,YAAYX,eAA1B,EAA2C;AACzC,YAAM+B,WAAW,GAAIC,KAAD,IAAyB;AAC3CF,QAAAA,cAAc,CAACE,KAAD,aAACA,KAAD,uBAACA,KAAK,CAAEH,WAAR,CAAd;AACD,OAFD;;AAGAlB,MAAAA,UAAU,CAACsB,EAAX,CAAchC,UAAU,CAACiC,SAAzB,EAAoCH,WAApC;AAEA,aAAO,MAAM;AACXpB,QAAAA,UAAU,CAACwB,GAAX,CAAelC,UAAU,CAACiC,SAA1B,EAAqCH,WAArC;AACD,OAFD;AAGD,KATD,MASO;AACL,aAAO,MAAM,CAAE,CAAf;AACD;AACF,GAdQ,EAcN,CAACpB,UAAD,CAdM,CAAT;AAgBAP,EAAAA,SAAS,CAAC,MAAM;AACd,QAAIO,UAAU,YAAYJ,gBAAtB,IAA0CI,UAAU,CAACiB,gBAAzD,EAA2E;AACzEjB,MAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAEyB,kBAAZ,CAA+BrB,WAA/B;AACA,aAAO,MAAM;AACXJ,QAAAA,UAAU,SAAV,IAAAA,UAAU,WAAV,YAAAA,UAAU,CAAE0B,wBAAZ,CAAqCtB,WAArC;AACD,OAFD;AAGD,KALD,MAKO;AACL,aAAO,MAAM,CAAE,CAAf;AACD;AACF,GATQ,EASN,CAACJ,UAAD,EAAaI,WAAb,CATM,CAAT;AAWA,sBACE,oBAAC,IAAD;AAAM,IAAA,KAAK,EAAE,EAAE,GAAGL,KAAL;AAAY,SAAG4B,MAAM,CAACC;AAAtB,KAAb;AAAgD,IAAA,QAAQ,EAAElB;AAA1D,kBACE,oBAAC,gBAAD;AACE,IAAA,QAAQ,EAAEG,kBADZ;AAEE,IAAA,KAAK,EAAEc,MAAM,CAACE,SAFhB;AAGE,IAAA,QAAQ,EAAE,CAACb,uBAHb;AAIE,IAAA,OAAO,EAAEhB;AAJX,kBAME,oBAAC,OAAD;AACE,IAAA,KAAK,EAAE2B,MAAM,CAACE,SADhB;AAEE,IAAA,SAAS,wBAAEX,WAAF,aAAEA,WAAF,uBAAEA,WAAW,CAAEY,KAAb,EAAF,mEAA0B,EAFrC;AAGE,IAAA,SAAS,EAAE7B,SAHb;AAIE,IAAA,MAAM,EAAEC,MAJV;AAKE,IAAA,MAAM,EAAEC;AALV,IANF,CADF,CADF;AAkBD,CA1EM;AA4EP,MAAMwB,MAAM,GAAGxC,UAAU,CAAC4C,MAAX,CAAkB;AAC/BH,EAAAA,SAAS,EAAE,EADoB;AAE/BC,EAAAA,SAAS,EAAE;AACTG,IAAAA,IAAI,EAAE,CADG;AAETC,IAAAA,KAAK,EAAE;AAFE;AAFoB,CAAlB,CAAf;;AAQA,MAAM3B,oBAAN,CAAkD;AAAA;AAAA,qCAC9B,EAD8B;;AAAA;;AAAA;;AAAA,oCAIvC,CAJuC;;AAAA,qCAKtC,CALsC;;AAAA,wCAMnC,KANmC;;AAAA,qCAO7B,IAP6B;;AAAA;;AAAA,8CAS7B,KAT6B;;AAAA;;AAAA;;AAAA,mCAYxC,MAAM,KAAK4B,MAZ6B;;AAAA,oCAavC,MAAM,KAAKC,OAb4B;AAAA;;AAehDC,EAAAA,OAAO,GAAS;AACd,SAAKC,UAAL,GAAkB,IAAlB;AACD;;AACDC,EAAAA,aAAa,GAAS;AACpB,SAAKD,UAAL,GAAkB,KAAlB;AACD;;AAEDzB,EAAAA,QAAQ,CAACD,KAAD,EAA2B;AACjC,QAAI;AAAEsB,MAAAA,KAAF;AAASM,MAAAA;AAAT,QAAoB5B,KAAK,CAAC6B,WAAN,CAAkBC,MAA1C;AACA,SAAKP,MAAL,GAAcD,KAAd;AACA,SAAKE,OAAL,GAAeI,MAAf;;AAEA,QAAI,KAAKF,UAAT,EAAqB;AAAA;;AACnB,iCAAKK,YAAL;AACD;AACF;;AACD3B,EAAAA,YAAY,CAACD,SAAD,EAAqB;AAC/B,QAAI,KAAK6B,OAAL,KAAiB7B,SAArB,EAAgC;AAC9B,WAAK6B,OAAL,GAAe7B,SAAf;AACA,WAAK8B,mBAAL,GAA2BC,IAAI,CAACC,GAAL,EAA3B;;AACA,UAAI,KAAKT,UAAT,EAAqB;AAAA;;AACnB,sCAAKU,uBAAL;AACD;AACF;AACF;;AAvC+C","sourcesContent":["import * as React from 'react';\n\nimport { LayoutChangeEvent, StyleSheet, View, ViewStyle } from 'react-native';\nimport {\n ElementInfo,\n LocalVideoTrack,\n Track,\n TrackEvent,\n VideoTrack,\n} from 'livekit-client';\nimport { RTCView } from '@livekit/react-native-webrtc';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { RemoteVideoTrack } from 'livekit-client';\nimport ViewPortDetector from './ViewPortDetector';\n\n/**\n * @deprecated use `VideoTrack` and `VideoTrackProps` instead.\n */\nexport type Props = {\n videoTrack?: VideoTrack | undefined;\n style?: ViewStyle;\n objectFit?: 'cover' | 'contain' | undefined;\n mirror?: boolean;\n zOrder?: number;\n};\n\n/**\n * @deprecated use `VideoTrack` and `VideoTrackProps` instead.\n */\nexport const VideoView = ({\n style = {},\n videoTrack,\n objectFit = 'cover',\n zOrder,\n mirror,\n}: Props) => {\n const [elementInfo] = useState(() => {\n let info = new VideoViewElementInfo();\n info.id = videoTrack?.sid;\n info.something = videoTrack;\n return info;\n });\n\n const layoutOnChange = useCallback(\n (event: LayoutChangeEvent) => elementInfo.onLayout(event),\n [elementInfo]\n );\n const visibilityOnChange = useCallback(\n (isVisible: boolean) => elementInfo.onVisibility(isVisible),\n [elementInfo]\n );\n const shouldObserveVisibility = useMemo(() => {\n return (\n videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream\n );\n }, [videoTrack]);\n\n const [mediaStream, setMediaStream] = useState(videoTrack?.mediaStream);\n useEffect(() => {\n setMediaStream(videoTrack?.mediaStream);\n if (videoTrack instanceof LocalVideoTrack) {\n const onRestarted = (track: Track | null) => {\n setMediaStream(track?.mediaStream);\n };\n videoTrack.on(TrackEvent.Restarted, onRestarted);\n\n return () => {\n videoTrack.off(TrackEvent.Restarted, onRestarted);\n };\n } else {\n return () => {};\n }\n }, [videoTrack]);\n\n useEffect(() => {\n if (videoTrack instanceof RemoteVideoTrack && videoTrack.isAdaptiveStream) {\n videoTrack?.observeElementInfo(elementInfo);\n return () => {\n videoTrack?.stopObservingElementInfo(elementInfo);\n };\n } else {\n return () => {};\n }\n }, [videoTrack, elementInfo]);\n\n return (\n <View style={{ ...style, ...styles.container }} onLayout={layoutOnChange}>\n <ViewPortDetector\n onChange={visibilityOnChange}\n style={styles.videoView}\n disabled={!shouldObserveVisibility}\n propKey={videoTrack}\n >\n <RTCView\n style={styles.videoView}\n streamURL={mediaStream?.toURL() ?? ''}\n objectFit={objectFit}\n zOrder={zOrder}\n mirror={mirror}\n />\n </ViewPortDetector>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {},\n videoView: {\n flex: 1,\n width: '100%',\n },\n});\n\nclass VideoViewElementInfo implements ElementInfo {\n element: object = {};\n something?: any;\n id?: string;\n _width = 0;\n _height = 0;\n _observing = false;\n visible: boolean = true;\n visibilityChangedAt: number | undefined;\n pictureInPicture = false;\n handleResize?: (() => void) | undefined;\n handleVisibilityChanged?: (() => void) | undefined;\n width = () => this._width;\n height = () => this._height;\n\n observe(): void {\n this._observing = true;\n }\n stopObserving(): void {\n this._observing = false;\n }\n\n onLayout(event: LayoutChangeEvent) {\n let { width, height } = event.nativeEvent.layout;\n this._width = width;\n this._height = height;\n\n if (this._observing) {\n this.handleResize?.();\n }\n }\n onVisibility(isVisible: boolean) {\n if (this.visible !== isVisible) {\n this.visible = isVisible;\n this.visibilityChangedAt = Date.now();\n if (this._observing) {\n this.handleVisibilityChanged?.();\n }\n }\n }\n}\n"]}
|
|
@@ -5,13 +5,57 @@ function _extends() { _extends = Object.assign || function (target) { for (var i
|
|
|
5
5
|
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
6
6
|
|
|
7
7
|
import React, { Component } from 'react';
|
|
8
|
-
import { View } from 'react-native';
|
|
8
|
+
import { AppState, View } from 'react-native';
|
|
9
|
+
const DEFAULT_DELAY = 1000;
|
|
10
|
+
|
|
11
|
+
class TimeoutHandler {
|
|
12
|
+
constructor() {
|
|
13
|
+
_defineProperty(this, "handlerRef", {
|
|
14
|
+
id: -1
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
get handler() {
|
|
19
|
+
return this.handlerRef.id;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
set handler(n) {
|
|
23
|
+
this.handlerRef.id = n;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
clear() {
|
|
27
|
+
clearTimeout(this.handlerRef.id);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function setIntervalWithTimeout(callback, intervalMs) {
|
|
33
|
+
let handleWrapper = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : new TimeoutHandler();
|
|
34
|
+
let cleared = false;
|
|
9
35
|
|
|
36
|
+
const timeout = () => {
|
|
37
|
+
handleWrapper.handler = setTimeout(() => {
|
|
38
|
+
callback(() => {
|
|
39
|
+
cleared = true;
|
|
40
|
+
handleWrapper.clear();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
if (!cleared) {
|
|
44
|
+
timeout();
|
|
45
|
+
}
|
|
46
|
+
}, intervalMs);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
timeout();
|
|
50
|
+
return handleWrapper;
|
|
51
|
+
}
|
|
10
52
|
/**
|
|
11
53
|
* Detects when this is in the viewport and visible.
|
|
12
54
|
*
|
|
13
55
|
* Will not fire visibility changes for zero width/height components.
|
|
14
56
|
*/
|
|
57
|
+
|
|
58
|
+
|
|
15
59
|
export default class ViewPortDetector extends Component {
|
|
16
60
|
constructor(props) {
|
|
17
61
|
super(props);
|
|
@@ -22,6 +66,83 @@ export default class ViewPortDetector extends Component {
|
|
|
22
66
|
|
|
23
67
|
_defineProperty(this, "view", null);
|
|
24
68
|
|
|
69
|
+
_defineProperty(this, "lastAppStateActive", false);
|
|
70
|
+
|
|
71
|
+
_defineProperty(this, "appStateSubscription", null);
|
|
72
|
+
|
|
73
|
+
_defineProperty(this, "hasValidTimeout", (disabled, delay) => {
|
|
74
|
+
let disabledValue = disabled !== null && disabled !== void 0 ? disabled : false;
|
|
75
|
+
let delayValue = delay !== null && delay !== void 0 ? delay : DEFAULT_DELAY;
|
|
76
|
+
return AppState.currentState === 'active' && !disabledValue && delayValue > 0;
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
_defineProperty(this, "handleAppStateChange", nextAppState => {
|
|
80
|
+
let nextAppStateActive = nextAppState === 'active';
|
|
81
|
+
|
|
82
|
+
if (this.lastAppStateActive !== nextAppStateActive) {
|
|
83
|
+
this.checkVisibility();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
this.lastAppStateActive = nextAppStateActive;
|
|
87
|
+
|
|
88
|
+
if (!this.hasValidTimeout(this.props.disabled, this.props.delay)) {
|
|
89
|
+
this.stopWatching();
|
|
90
|
+
} else {
|
|
91
|
+
this.startWatching();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
_defineProperty(this, "startWatching", () => {
|
|
96
|
+
if (this.interval) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.interval = setIntervalWithTimeout(this.checkVisibility, this.props.delay || DEFAULT_DELAY);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
_defineProperty(this, "stopWatching", () => {
|
|
104
|
+
var _this$interval;
|
|
105
|
+
|
|
106
|
+
(_this$interval = this.interval) === null || _this$interval === void 0 ? void 0 : _this$interval.clear();
|
|
107
|
+
this.interval = null;
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
_defineProperty(this, "checkVisibility", () => {
|
|
111
|
+
if (!this.view) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (AppState.currentState !== 'active') {
|
|
116
|
+
this.updateVisibility(false);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.view.measure((_x, _y, width, height, _pageX, _pageY) => {
|
|
121
|
+
this.checkInViewPort(width, height);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
_defineProperty(this, "checkInViewPort", (width, height) => {
|
|
126
|
+
let isVisible; // Not visible if any of these are missing.
|
|
127
|
+
|
|
128
|
+
if (!width || !height) {
|
|
129
|
+
isVisible = false;
|
|
130
|
+
} else {
|
|
131
|
+
isVisible = true;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
this.updateVisibility(isVisible);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
_defineProperty(this, "updateVisibility", isVisible => {
|
|
138
|
+
if (this.lastValue !== isVisible) {
|
|
139
|
+
var _this$props$onChange, _this$props;
|
|
140
|
+
|
|
141
|
+
this.lastValue = isVisible;
|
|
142
|
+
(_this$props$onChange = (_this$props = this.props).onChange) === null || _this$props$onChange === void 0 ? void 0 : _this$props$onChange.call(_this$props, isVisible);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
|
|
25
146
|
this.state = {
|
|
26
147
|
rectTop: 0,
|
|
27
148
|
rectBottom: 0
|
|
@@ -29,58 +150,31 @@ export default class ViewPortDetector extends Component {
|
|
|
29
150
|
}
|
|
30
151
|
|
|
31
152
|
componentDidMount() {
|
|
32
|
-
|
|
153
|
+
this.lastAppStateActive = AppState.currentState === 'active';
|
|
154
|
+
this.appStateSubscription = AppState.addEventListener('change', this.handleAppStateChange);
|
|
155
|
+
|
|
156
|
+
if (this.hasValidTimeout(this.props.disabled, this.props.delay)) {
|
|
33
157
|
this.startWatching();
|
|
34
158
|
}
|
|
35
159
|
}
|
|
36
160
|
|
|
37
161
|
componentWillUnmount() {
|
|
162
|
+
var _this$appStateSubscri;
|
|
163
|
+
|
|
164
|
+
(_this$appStateSubscri = this.appStateSubscription) === null || _this$appStateSubscri === void 0 ? void 0 : _this$appStateSubscri.remove();
|
|
165
|
+
this.appStateSubscription = null;
|
|
38
166
|
this.stopWatching();
|
|
39
167
|
}
|
|
40
168
|
|
|
41
169
|
UNSAFE_componentWillReceiveProps(nextProps) {
|
|
42
|
-
if (nextProps.disabled) {
|
|
170
|
+
if (!this.hasValidTimeout(nextProps.disabled, nextProps.delay)) {
|
|
43
171
|
this.stopWatching();
|
|
44
172
|
} else {
|
|
45
|
-
this.
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
startWatching() {
|
|
51
|
-
if (this.interval) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
this.interval = setInterval(() => {
|
|
56
|
-
if (!this.view) {
|
|
57
|
-
return;
|
|
173
|
+
if (this.props.propKey !== nextProps.propKey) {
|
|
174
|
+
this.lastValue = null;
|
|
58
175
|
}
|
|
59
176
|
|
|
60
|
-
this.
|
|
61
|
-
this.checkInViewPort(width, height);
|
|
62
|
-
});
|
|
63
|
-
}, this.props.delay || 100);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
stopWatching() {
|
|
67
|
-
this.interval = clearInterval(this.interval);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
checkInViewPort(width, height) {
|
|
71
|
-
let isVisible; // Not visible if any of these are missing.
|
|
72
|
-
|
|
73
|
-
if (!width || !height) {
|
|
74
|
-
isVisible = false;
|
|
75
|
-
} else {
|
|
76
|
-
isVisible = true;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (this.lastValue !== isVisible) {
|
|
80
|
-
var _this$props$onChange, _this$props;
|
|
81
|
-
|
|
82
|
-
this.lastValue = isVisible;
|
|
83
|
-
(_this$props$onChange = (_this$props = this.props).onChange) === null || _this$props$onChange === void 0 ? void 0 : _this$props$onChange.call(_this$props, isVisible);
|
|
177
|
+
this.startWatching();
|
|
84
178
|
}
|
|
85
179
|
}
|
|
86
180
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["ViewPortDetector.tsx"],"names":["React","Component","View","ViewPortDetector","constructor","props","
|
|
1
|
+
{"version":3,"sources":["ViewPortDetector.tsx"],"names":["React","Component","AppState","View","DEFAULT_DELAY","TimeoutHandler","id","handler","handlerRef","n","clear","clearTimeout","setIntervalWithTimeout","callback","intervalMs","handleWrapper","cleared","timeout","setTimeout","ViewPortDetector","constructor","props","disabled","delay","disabledValue","delayValue","currentState","nextAppState","nextAppStateActive","lastAppStateActive","checkVisibility","hasValidTimeout","stopWatching","startWatching","interval","view","updateVisibility","measure","_x","_y","width","height","_pageX","_pageY","checkInViewPort","isVisible","lastValue","onChange","state","rectTop","rectBottom","componentDidMount","appStateSubscription","addEventListener","handleAppStateChange","componentWillUnmount","remove","UNSAFE_componentWillReceiveProps","nextProps","propKey","render","component","children"],"mappings":"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","sourcesContent":["'use strict';\n\nimport React, { Component, PropsWithChildren } from 'react';\nimport {\n AppState,\n AppStateStatus,\n NativeEventSubscription,\n View,\n ViewStyle,\n} from 'react-native';\n\nconst DEFAULT_DELAY = 1000;\n\nexport type Props = {\n disabled?: boolean;\n style?: ViewStyle;\n onChange?: (isVisible: boolean) => void;\n delay?: number;\n propKey?: any;\n};\n\nclass TimeoutHandler {\n private handlerRef: { id: any } = { id: -1 };\n\n get handler(): any {\n return this.handlerRef.id;\n }\n set handler(n: any) {\n this.handlerRef.id = n;\n }\n\n clear() {\n clearTimeout(this.handlerRef.id as any);\n }\n}\n\nfunction setIntervalWithTimeout(\n callback: (clear: () => void) => any,\n intervalMs: number,\n handleWrapper = new TimeoutHandler()\n): TimeoutHandler {\n let cleared = false;\n\n const timeout = () => {\n handleWrapper.handler = setTimeout(() => {\n callback(() => {\n cleared = true;\n handleWrapper.clear();\n });\n if (!cleared) {\n timeout();\n }\n }, intervalMs);\n };\n timeout();\n return handleWrapper;\n}\n\n/**\n * Detects when this is in the viewport and visible.\n *\n * Will not fire visibility changes for zero width/height components.\n */\nexport default class ViewPortDetector extends Component<\n PropsWithChildren<Props>\n> {\n private lastValue: boolean | null = null;\n private interval: TimeoutHandler | null = null;\n private view: View | null = null;\n private lastAppStateActive = false;\n private appStateSubscription: NativeEventSubscription | null = null;\n\n constructor(props: Props) {\n super(props);\n this.state = { rectTop: 0, rectBottom: 0 };\n }\n\n componentDidMount() {\n this.lastAppStateActive = AppState.currentState === 'active';\n this.appStateSubscription = AppState.addEventListener(\n 'change',\n this.handleAppStateChange\n );\n if (this.hasValidTimeout(this.props.disabled, this.props.delay)) {\n this.startWatching();\n }\n }\n\n componentWillUnmount() {\n this.appStateSubscription?.remove();\n this.appStateSubscription = null;\n this.stopWatching();\n }\n\n hasValidTimeout = (disabled?: boolean, delay?: number): boolean => {\n let disabledValue = disabled ?? false;\n let delayValue = delay ?? DEFAULT_DELAY;\n return (\n AppState.currentState === 'active' && !disabledValue && delayValue > 0\n );\n };\n\n UNSAFE_componentWillReceiveProps(nextProps: Props) {\n if (!this.hasValidTimeout(nextProps.disabled, nextProps.delay)) {\n this.stopWatching();\n } else {\n if (this.props.propKey !== nextProps.propKey) {\n this.lastValue = null;\n }\n this.startWatching();\n }\n }\n handleAppStateChange = (nextAppState: AppStateStatus) => {\n let nextAppStateActive = nextAppState === 'active';\n if (this.lastAppStateActive !== nextAppStateActive) {\n this.checkVisibility();\n }\n this.lastAppStateActive = nextAppStateActive;\n\n if (!this.hasValidTimeout(this.props.disabled, this.props.delay)) {\n this.stopWatching();\n } else {\n this.startWatching();\n }\n };\n\n startWatching = () => {\n if (this.interval) {\n return;\n }\n this.interval = setIntervalWithTimeout(\n this.checkVisibility,\n this.props.delay || DEFAULT_DELAY\n );\n };\n\n stopWatching = () => {\n this.interval?.clear();\n this.interval = null;\n };\n\n checkVisibility = () => {\n if (!this.view) {\n return;\n }\n\n if (AppState.currentState !== 'active') {\n this.updateVisibility(false);\n return;\n }\n\n this.view.measure((_x, _y, width, height, _pageX, _pageY) => {\n this.checkInViewPort(width, height);\n });\n };\n checkInViewPort = (width?: number, height?: number) => {\n let isVisible: boolean;\n // Not visible if any of these are missing.\n if (!width || !height) {\n isVisible = false;\n } else {\n isVisible = true;\n }\n this.updateVisibility(isVisible);\n };\n\n updateVisibility = (isVisible: boolean) => {\n if (this.lastValue !== isVisible) {\n this.lastValue = isVisible;\n this.props.onChange?.(isVisible);\n }\n };\n render() {\n return (\n <View\n collapsable={false}\n ref={(component) => {\n this.view = component;\n }}\n {...this.props}\n >\n {this.props.children}\n </View>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, UseLocalParticipantOptions, useLocalParticipantPermissions, useParticipantInfo, UseParticipantInfoOptions, useParticipants, UseParticipantsOptions, useRemoteParticipants, UseRemoteParticipantOptions, useRemoteParticipant, UseRemoteParticipantsOptions, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, UseTracksOptions, TrackReference, TrackReferenceOrPlaceholder, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate, UseVisualStableUpdateOptions } from '@livekit/components-react';
|
|
2
|
+
export { ReceivedDataMessage } from '@livekit/components-core';
|
|
3
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["hooks.ts"],"names":["useConnectionState","useDataChannel","useIsSpeaking","useLocalParticipant","UseLocalParticipantOptions","useLocalParticipantPermissions","useParticipantInfo","UseParticipantInfoOptions","useParticipants","UseParticipantsOptions","useRemoteParticipants","UseRemoteParticipantOptions","useRemoteParticipant","UseRemoteParticipantsOptions","useSpeakingParticipants","useSortedParticipants","useChat","useIsEncrypted","useIsMuted","useParticipantTracks","useLiveKitRoom","RoomContext","useRoomContext","ParticipantContext","useParticipantContext","TrackRefContext","useTrackRefContext","useTracks","UseTracksOptions","TrackReference","TrackReferenceOrPlaceholder","isTrackReference","useEnsureTrackRef","useTrackMutedIndicator","useVisualStableUpdate","UseVisualStableUpdateOptions","ReceivedDataMessage"],"mappings":"AAAA,SACEA,kBADF,EAEEC,cAFF,EAGEC,aAHF,EAIEC,mBAJF,EAKEC,0BALF,EAMEC,8BANF,EAOEC,kBAPF,EAQEC,yBARF,EASEC,eATF,EAUEC,sBAVF,EAWEC,qBAXF,EAYEC,2BAZF,EAaEC,oBAbF,EAcEC,4BAdF,EAeEC,uBAfF,EAgBEC,qBAhBF,EAiBEC,OAjBF,EAkBEC,cAlBF,EAmBEC,UAnBF,EAoBEC,oBApBF,EAqBEC,cArBF,EAsBEC,WAtBF,EAuBEC,cAvBF,EAwBEC,kBAxBF,EAyBEC,qBAzBF,EA0BEC,eA1BF,EA2BEC,kBA3BF,EA4BEC,SA5BF,EA6BEC,gBA7BF,EA8BEC,cA9BF,EA+BEC,2BA/BF,EAgCEC,gBAhCF,EAiCEC,iBAjCF,EAkCEC,sBAlCF,EAmCEC,qBAnCF,EAoCEC,4BApCF,QAqCO,2BArCP;AAuCA,SAASC,mBAAT,QAAoC,0BAApC","sourcesContent":["export {\n useConnectionState,\n useDataChannel,\n useIsSpeaking,\n useLocalParticipant,\n UseLocalParticipantOptions,\n useLocalParticipantPermissions,\n useParticipantInfo,\n UseParticipantInfoOptions,\n useParticipants,\n UseParticipantsOptions,\n useRemoteParticipants,\n UseRemoteParticipantOptions,\n useRemoteParticipant,\n UseRemoteParticipantsOptions,\n useSpeakingParticipants,\n useSortedParticipants,\n useChat,\n useIsEncrypted,\n useIsMuted,\n useParticipantTracks,\n useLiveKitRoom,\n RoomContext,\n useRoomContext,\n ParticipantContext,\n useParticipantContext,\n TrackRefContext,\n useTrackRefContext,\n useTracks,\n UseTracksOptions,\n TrackReference,\n TrackReferenceOrPlaceholder,\n isTrackReference,\n useEnsureTrackRef,\n useTrackMutedIndicator,\n useVisualStableUpdate,\n UseVisualStableUpdateOptions,\n} from '@livekit/components-react';\n\nexport { ReceivedDataMessage } from '@livekit/components-core';\n"]}
|