React Native UI Kit — Customization

All UI Kit customization is done through the setting prop you pass to EnxVideoView. The setting array has two main keys: enxRequiredEventOption controls which toolbar buttons are shown, and participantOption controls which action buttons appear in the participant list. Omit any key to hide that feature from the UI entirely.

Feature Toolbar Configuration

The enxRequiredEventOption array is a list of feature flag objects. Each object has a key for the feature name and a boolean value — set it to true to enable that toolbar button, or omit it entirely to hide it. The order of entries does not affect the toolbar layout; the kit renders buttons in its own defined order.

setting: [
  enxRequiredEventOption: [
    { AUDIO: true },           // Mute/unmute self audio
    { VIDEO: true },           // Mute/unmute self video
    { SWITCH_CAMERA: true },   // Switch front/rear camera
    { SWITCH_AUDIO: true },    // Switch active audio device
    { GROUP_CHAT: true },      // Open group chat panel
    { DISCONNECT: true },      // Leave call button
    { MUTE_ROOM: true },       // Moderator: mute all participants
    { RECORDING: true },       // Moderator: start/stop recording
    { SCREEN_SHARE: true },    // Screen sharing
    { ANNOTATION: true },      // Annotation drawing tools
    { LOBBY: true },           // Lobby / waiting room control
    { REQUEST: true },         // Floor access request (Lecture mode)
    { ROOM_SETTING: true },    // Room settings panel
    { POLLING: true },         // Polling feature
    { QNA: true },             // Q&A feature
    {
      CUSTOM_BUTTON: true,
      imagePath: require('./assets/my_button.png')
      // imagePath sets the icon for your custom toolbar button
    }
  ]
]
Moderator-only buttons

MUTE_ROOM and RECORDING will only appear in the toolbar for users who joined as moderators. Including them in the setting array for a participant has no effect.

Participant List Configuration

The participantOption array controls which action buttons appear next to each participant's entry in the participant list panel. These are direct controls — a moderator can mute or disconnect a participant with a single tap from this list.

setting: [
  participantOption: [
    { VIDEO: true },       // Hard stop participant's video feed
    { AUDIO: false },      // Hard mute participant's audio (set false to hide)
    { CHAT: true },        // Open a private chat thread with this participant
    { DISCONNECT: true },  // Force disconnect this participant from the room
  ]
]
Complete Setting Example

The following example shows a fully configured setting array with all available options enabled. Use this as a starting point and remove any entries you do not need:

setting: [
  enxRequiredEventOption: [
    { AUDIO: true },
    { VIDEO: true },
    { SWITCH_CAMERA: true },
    { SWITCH_AUDIO: true },
    { GROUP_CHAT: true },
    { DISCONNECT: true },
    { MUTE_ROOM: true },
    { RECORDING: true },
    { SCREEN_SHARE: true },
    { ANNOTATION: true },
    { LOBBY: true },
    { REQUEST: true },
    { ROOM_SETTING: true },
    { POLLING: true },
    { QNA: true },
    {
      CUSTOM_BUTTON: true,
      imagePath: require('./assets/recording_on.png')
    }
  ],
  participantOption: [
    { VIDEO: true },
    { AUDIO: false },
    { CHAT: true },
    { DISCONNECT: true }
  ]
]
Monitor Panel Events

The onPageSlide callback on EnxVideoView fires every time an in-call panel opens or closes. Use it to track UI state — for example, to pause a background sync when the polling panel is open, or to log analytics for feature usage.

pageName is a string identifying the panel (e.g. "chat", "polling", "qna", "screenShare"). isShow is true when the panel opened and false when it closed.

onPageSlide = (pageName, isShow) => {
  console.log(pageName + ' page slide: ' + isShow);
  // Example: pageName = "chat", isShow = true (chat panel just opened)
}
Receive User Data

When another participant sends a custom payload using the user data feature, the onUserDataReceived callback fires on your end. This is a real-time side channel you can use to build collaborative features that run alongside the video session — for example, syncing a shared document or triggering a branded animation.

onUserDataReceived = (data) => {
  console.log('User data received:', JSON.stringify(data));
  // Process the payload and update your app state accordingly
}