Appearance
Ease Live Bridge SDK for React Native
Requirements
Latest stable React Native version is recommended, currently 0.80.1 or newer, but will probably work on recent older versions. This release was tested on React Native 0.80.1 and 0.74.2.
This is a wrapper for the native EaseLive SDKs. For platform specific requirements see:
Example project
Installation
NPM package
The package can be downloaded from Ease Live's NPM registry by adding it to either your NPM or Yarn config, depending on which your use:
NPM
Add in .npmrc
file in your RN project directory
npmrc
@ease-live:registry=https://easelive.jfrog.io/artifactory/api/npm/npm-public/
Once the npm config is in place, install the package:
sh
npm install @ease-live/react-native-ease-live
Yarn
If using Yarn instead of NPM, add in .yarnrc.yml
file in your RN project directory
yaml
npmScopes:
ease-live:
npmRegistryServer: https://easelive.jfrog.io/artifactory/api/npm/npm-public/
Once the yarn config is in place, install the package:
sh
yarn add @ease-live/react-native-ease-live
iOS dependencies
Add or update source in your ios/Podfile
to add the EaseLive SDK pod repo:
ruby
source 'https://cdn.cocoapods.org'
source 'https://github.com/ease-live/ease-live-bridge-ios-pod.git'
From the ios
folder, install the dependencies
sh
pod install --repo-update
Android dependencies
Add or update repositories in your android/app/build.gradle
to add the EaseLive SDK repo:
groovy
repositories {
mavenCentral()
google()
maven {
url "https://sdk.easelive.tv/maven"
}
}
Use
For a full example see Example project.
For a full list of options see the API reference
Set up states for player values shared to EaseLive
ts
const [easeLiveEnabled, setEaseLiveEnabled] = useState(true);
const [playerControlsVisible, setPlayerControlsVisible] = useState(false);
const [playerTime, setPlayerTime] = useState(0);
const [playerState, setPlayerState] = useState('playing');
Listen for changes in the player, and change the state to emit it to the EaseLive overlay.
Place the EaseLive component between the video and the player controls.
tsx
<Video ...
onProgress={(e: any) => {
// send UTC time of current playback position to EL
if (e.currentPlaybackTime > 0) {
setPlayerTime(e.currentPlaybackTime);
}
}}
/>
{easeLiveEnabled && (
<EaseLive
easeLiveConfig={{
// project and environment to load
accountId: 'tutorials',
projectId: '0346ae3e-7a91-4760-bcd3-cd84bb6790dd',
programId: '2d2711ff-6ff2-41c1-a141-060e9ffa2c38',
env: 'prod',
// optionally add query parameters to the URL loaded from the environment
params: {
someParam: 'myValue',
},
}}
playerControlsVisible={playerControlsVisible} // let EL know current player controls visibility
playerTime={playerTime} // let EL know time of the current playback position, in UTC milliseconds
playerState={playerState} // let EL know current playback state
onEaseLiveError={(e: NativeSyntheticEvent<OnEaseLiveErrorData>) => {
// error from EL. Should disable EL if fatal error
if (e.nativeEvent.level === 'fatal') {
setEaseLiveEnabled(false);
}
}}
onEaseLiveStatus={(e: NativeSyntheticEvent<OnEaseLiveStatusData>) => {
// producer changed program status. Should remove EL if disabled
if (e.nativeEvent.status === 'disabled') {
setEaseLiveEnabled(false);
} else if (!easeLiveEnabled) {
setEaseLiveEnabled(true);
}
}}
onPlayerControls={(e: NativeSyntheticEvent<OnPlayerControlsData>) => {
// request from EL to change player controls visibility
setPlayerControlsVisible(e.nativeEvent.visible);
}}
/>
)}
{playerControlsVisible && (
<PlayerControlsView ... />
)}
Audio in the overlay
If the EaseLive overlay should play audio, you may need to configure the audio session to allow mixing.
If you use Expo it has expo-audio module, where it can be configured by:
ts
import { setAudioModeAsync } from 'expo-audio'
setAudioModeAsync({
interruptionMode: 'mixWithOthers'
})
This option can only work if your player doesn't also override the audio session. If it does, it should instead be configured through your player:
For example if using react-native-video player, it should instead be configured by setting mixWithOthers (iOS) and disableFocus (Android):
tsx
<Video mixWithOthers="mix" disableFocus={true} ...