Skip to main content
Install the SDK first. See React Native SDK. A full-screen live shopping channel component that embeds the Videowise live streaming experience. It renders a WebView with the live shopping channel and dispatches typed live-shopping events for user interactions like adding products to cart.
Note: The LiveShoppingChannel component does not need to be wrapped inside <VideowiseSDK.Provider>. It operates independently.

Props

videowiseInfo object

onEvent callback

Triggered for all live shopping interaction events. The event object has the following structure: detail object (LSTrackingEventData) item object (when present) Possible interaction types (interactionType)
  • mute_player — Player muted
  • unmute_player — Player unmuted
  • pause_player — Player paused
  • resume_player — Player resumed
  • like_reaction — Like reaction
  • share — Share clicked
  • add_to_calendar — Added to calendar
  • send_chat — Chat message sent
  • close_player — Player closed
  • minimize_player — Player minimized
  • maximize_player — Player maximized
  • show_product_list — Product list shown
  • hide_product_list — Product list hidden
  • product_click — Product clicked
  • add_to_cart — Product added to cart
  • checkout — Checkout clicked
  • show_cart — Cart shown
  • hide_cart — Cart hidden
  • toggle_cc_on — Closed captions enabled
  • toggle_cc_off — Closed captions disabled
  • replay — Replay clicked
  • progress — Playback progress

onAddToCart callback

Triggered when a user adds a product to the cart (add_to_cart interaction). The product data is unified into a standard format. The event object has the following structure: detail object

onCheckout callback

Triggered when a user clicks checkout. The event object has the following structure:

Example

See the full list of live shopping events: Live shopping custom events

Custom channel body / modular section layout

By default the WebView body is a single monolith mount:
Pass channelBodyHtml to replace that body content and use modular channel sections with your own HTML between mounts. Omit #videowise_stream_channel when using sections — the monolith container takes precedence and section mounts are ignored.
Mount ids: videowise_stream_channel_hero, videowise_stream_channel_livenow, videowise_stream_channel_upcoming, videowise_stream_channel_past, optional videowise_stream_channel_shared. See Live channel page layout for the full web embed contract (same mount ids on the web and in the RN WebView body).

Picture-in-Picture (PiP)

When a user taps PiP inside the live shopping WebView, the SDK:
  1. Receives a PIP_ENTER message from the embed with the HLS stream URL, lsId, and playback position
  2. Swaps the WebView for a native react-native-video player and enters system PiP
  3. On PiP exit, remounts the WebView with the same lsId so the embed reloads the stream; for recordings, also writes playback position to session storage so the web player can seek on resume
  4. On iOS, automatically calls VwAppMinimizer.minimize() when PiP becomes active (if the host app implements the native module)
Android typically backgrounds the app automatically when PiP starts.

Setup in your app

1. Install peer dependencies
2. Render LiveShoppingChannel No extra PiP wiring is needed in JS — just render the component:
Pass lsId to open a specific stream on first load:
Disable the PiP button if needed (enabled by default):
3. iOS — Info.plist Add background audio so PiP playback continues when the app is backgrounded:
4. Android — AndroidManifest.xml Enable PiP on your main activity:
5. Optional — iOS VwAppMinimizer (host app native module) iOS has no public API to programmatically send the app to the background. The SDK calls VwAppMinimizer.minimize() automatically when PiP becomes active on iOS. Implement this native module in your host app (not in the SDK npm package) to enable auto-minimize.
App Store note: the example below uses a private API (UIApplication.suspend). Use only if your team accepts that trade-off.
ios/YourApp/VwAppMinimizer.swift:
ios/YourApp/VwAppMinimizer.m:
Register the files in your Xcode project Creating the files is not enough — they must be registered in your app target so Xcode compiles them. You can do this in Xcode or by editing project.pbxproj directly (useful if you manage the iOS project as code). Option A — Xcode UI
  1. Open ios/YourApp.xcworkspace in Xcode
  2. Right-click your app folder (same group as AppDelegate.swift) → Add Files to “YourApp”…
  3. Select VwAppMinimizer.swift and VwAppMinimizer.m
  4. Ensure your app target is checked under Add to targets
Option B — Edit project.pbxproj
  1. Place both files in ios/YourApp/ next to AppDelegate.swift
  2. Open ios/YourApp.xcodeproj/project.pbxproj
  3. Generate four unique IDs (run uuidgen four times, remove dashes, uppercase)
  4. Add entries following the same pattern as AppDelegate.swift:
  1. Add SWIFT_FILE_ID and OBJC_FILE_ID to your app’s PBXGroup children array (same group that lists AppDelegate.swift)
  2. Add SWIFT_BUILD_ID and OBJC_BUILD_ID to PBXSourcesBuildPhasefiles array (Compile Sources)
Replace YourApp with your iOS app folder name. Use the code blocks above for the file contents and mirror how AppDelegate.swift is registered in your project.pbxproj. If VwAppMinimizer is not registered, the SDK safely skips minimization — PiP still works. 6. Install the SDK in your app and rebuild Install from npm in your React Native project (not a local file: link):

Testing notes

The floating PiP window always shows system playback controls (play/pause, close). Those cannot be removed by the SDK.

WebView → native PiP protocol

The live shopping embed sends this message when the user requests PiP:

Native PiP → WebView resume

When PiP ends, the SDK remounts the WebView with window.lsId set so the embed auto-loads the same stream. For recordings (not live streams), the SDK also writes the native player’s current playback time to session storage:
The embed reads this key on init for recordings only, parses { time, lsId }, and seeks the web player to resume from that position. Live streams do not use this key — they resume at the live edge.