Migrations
From 0.29.x to 1.0.0
Version 1.0.0 brings full support for the React Native New Architecture (Fabric, Turbo Modules, Codegen) while retaining backward compatibility with the Old Architecture (Bridge, Paper).
Update Requirements and Native Setup
Update your project dependencies and SDK versions according to How to get started:
- React Native:
0.68+(supports both New Architecture and Old Architecture; built on0.86.0). - iOS:
iOS 13.0+(bundles native SDKInAppStory 1.29.5). - Android:
minSdkVersion = 24,compileSdkVersion = 35,targetSdkVersion = 35(bundles native SDK1.25.4). - If using the New Architecture (default in React Native 0.76+), ensure
newArchEnabled = trueingradle.properties.
Android native package and imports
The Android package changed from com.inappstorysdk to com.inappstory.reactnativesdk. Update your imports in MainApplication and MainActivity:
1. In MainApplication:
import com.inappstorysdk.InAppStory
import com.inappstory.reactnativesdk.InAppStory
class MainApplication : Application(), ReactApplication {
override fun onCreate() {
super.onCreate()
InAppStory.initSDK(this)
loadReactNative(this)
}
}
2. In MainActivity:
import com.inappstorysdk.InAppStoryActivity
import com.inappstory.reactnativesdk.activity.InAppStoryActivity
class MainActivity : InAppStoryActivity() {
override fun getMainComponentName(): String = "your_app"
}
StoriesWidget → StoriesList
StoriesWidget no longer exists. Render StoriesList and pass storyManager, appearanceManager, and feed:
<StoriesWidget feed="default" />
<StoriesList
storyManager={storyManager}
appearanceManager={appearanceManager}
feed="default"
/>
Prefer StoryManager.create
new StoryManager(config) still works, but native initialization is asynchronous. Use
await StoryManager.create(config) when you need the manager to be ready before the first UI
or event subscription.
const storyManager = new StoryManager(config);
const storyManager = await StoryManager.create(config);
Replace generic event subscriptions
The old on(eventName, listener) / once API was removed.
storyManager.on('showStory', (payload) => console.log(payload));
storyManager.onShowStory((event) => console.log(event.body));
Common replacements:
Old on(...) name | New method |
|---|---|
showStory | onShowStory |
closeStory | onCloseStory |
showSlide | onShowSlide |
clickOnButton | onClickOnButton |
likeStory | onLikeStory |
dislikeStory | onDislikeStory |
favoriteStory | onFavoriteStory |
clickOnShareStory | onShareStory |
storyWidgetEvent | onStoryWidgetEvent |
bannerWidgetEvent | onBannerWidgetEvent |
goodItemSelected | onGoodItemSelected |
| game events | onGameEvent |
| IAM events | onIamEvent |
| failure events | onFailure |
CTA handling
CTA clicks are no longer subscribed with an event name. Assign the handler property instead.
storyManager.on('handleCTA', handler);
storyManager.storyLinkClickHandler = (payload) => {
// payload.src, payload.srcRef, payload.data
};
Appearance APIs
Reader appearance and custom icon methods moved from StoryManager to AppearanceManager.
storyManager.setOverScrollToClose(true);
storyManager.setScrollStyle(StoryReaderSwipeStyle.FLAT);
storyManager.setCloseButtonPosition(StoryReaderCloseButtonPosition.RIGHT);
appearanceManager.setOverScrollToClose(true);
appearanceManager.setStoryReaderOptions({
closeButtonPosition: StoryReaderCloseButtonPosition.RIGHT,
scrollStyle: StoryReaderSwipeStyle.FLAT,
});
Font settings for story cards
The old CSS-like font string is not used by the current JS renderer. Configure the card
title with individual style fields.
title: {
font: 'bold normal 14px/16px "InternalPrimaryFont"',
}
title: {
fontSize: 14,
fontWeight: 600,
fontFamily: Platform.select({ ios: 'Bradley Hand', android: 'Comic Sans' }),
lineHeight: 16,
}
Clean up replaced managers
If your app recreates StoryManager on login/logout, call destroy() on the old instance to
remove native event subscriptions.
oldStoryManager.destroy();
const storyManager = await StoryManager.create(config);
From 0.28.x to 0.29.0
Version 0.29.0 moves several APIs to their final place. Update the following.
StoriesList: viewModelExporter → ref
StoriesList now exposes its imperative API (reload()) through a ref typed as
StoriesListRef, instead of the viewModelExporter prop / StoriesListViewModel type.
import { type StoriesListViewModel } from '@inappstory/react-native-sdk';
import { type StoriesListRef } from '@inappstory/react-native-sdk';
const storiesListViewModel = React.useRef<StoriesListViewModel>();
const viewModelExporter = React.useCallback(
(viewModel: StoriesListViewModel) => (storiesListViewModel.current = viewModel),
[]
);
const storiesListRef = React.useRef<StoriesListRef>(null);
<StoriesList
storyManager={storyManager}
appearanceManager={appearanceManager}
feed={feedId}
viewModelExporter={viewModelExporter}
ref={storiesListRef}
/>;
// reload the feed
storiesListViewModel.current?.reload();
storiesListRef.current?.reload();
Reader appearance and custom icons moved to AppearanceManager
Reader-appearance and custom-icon setters are now methods of AppearanceManager,
not StoryManager. Like / dislike / favorite / share visibility is configured via
setCommonOptions, and the close-button position / scroll style via setStoryReaderOptions.
storyManager.setOverScrollToClose(true);
storyManager.setScrollStyle(StoryReaderSwipeStyle.FLAT);
storyManager.setCloseButtonPosition(StoryReaderCloseButtonPosition.RIGHT);
storyManager.setHasLike(true);
storyManager.setLikeImage('like', 'likeSelected');
appearanceManager.setOverScrollToClose(true);
appearanceManager.setLikeImage('like', 'likeSelected');
appearanceManager.setCommonOptions({ hasLike: true, hasLikeButton: true });
appearanceManager.setStoryReaderOptions({
closeButtonPosition: StoryReaderCloseButtonPosition.RIGHT,
scrollStyle: StoryReaderSwipeStyle.FLAT,
});
showOnboardingStories → showOnboardings
The method was renamed and its arguments reshaped to
showOnboardings(feed?, limit?, tags?, signal?).
storyManager.showOnboardingStories(appearanceManager, abortController.signal, {
feed: '<feedID>',
limit: 10,
customTags: [],
});
storyManager.showOnboardings('<feedID>', 10, [], abortController.signal);
Per-list tags prop removed
The old StoriesWidget component and its per-list tags prop were removed. Filter
content globally with setTags / addTags before rendering the list.
<StoriesWidget feed="default" tags={['tag1', 'tag2']} />
storyManager.setTags(['tag1', 'tag2']);
<StoriesList feed="default" storyManager={storyManager} appearanceManager={appearanceManager} />
setUserId signature
userIdSign is now an explicit second argument — pass null when you don't sign the user.
storyManager.setUserId(userId);
storyManager.setUserId(userId, userIdSign ?? null);
Event subscription: on → dedicated onXxx methods
The generic storyManager.on(eventName, listener) / once API was removed. Subscribe with
the dedicated method for each event; the payload now arrives in event.body.
storyManager.on('showStory', (payload) => console.log(payload));
storyManager.onShowStory((event) => console.log(event.body));
Mapping of the common events:
Old on(...) name | New method |
|---|---|
showStory | onShowStory |
closeStory | onCloseStory |
showSlide | onShowSlide |
clickOnButton | onClickOnButton |
likeStory | onLikeStory |
dislikeStory | onDislikeStory |
favoriteStory | onFavoriteStory |
clickOnShareStory | onShareStory |
storyWidgetEvent | onStoryWidgetEvent |
bannerWidgetEvent | onBannerWidgetEvent |
goodItemSelected | onGoodItemSelected |
| game events | onGameEvent |
| IAM events | onIamEvent |
| failure events | onFailure |
handleCTA | storyLinkClickHandler (see Call To Action) |
clickOnStory no longer has a public subscription method.
From 0.27.x to 0.28.0
In version 0.28.0, Android's native initialization was changed. In the MainApplication class, change the following code:
/// this example uses a New architecture
package com.example
// other imports
import android.app.Application
import com.inappstory.reactnativesdk.InAppStory
class MainApplication : Application(), ReactApplication {
// ...
override fun onCreate() {
super.onCreate()
InAppStory.initSDK(getApplicationContext())
InAppStory.initSDK(this as Application)
loadReactNative(this)
}
}
To 0.27.x
Starting from 0.27 version, In-app messages was added. To handle the back button press on Android, SDK integration needs to be updated.
- Update
MainActivityclass:
package com.example.yourapp;
import com.inappstorysdk.InAppStoryActivity;
// You need to extend class from InAppStoryActivity
class MainActivity extends ReactActivity {
class MainActivity extends InAppStoryActivity {
/// ...
}
- Update
AndroidManifest.xmlfile:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".MainApplication"
...
>
<activity
android:name=".MainActivity"
...
android:enableOnBackInvokedCallback="true"
...
>
<intent-filter>
...
</intent-filter>
</activity>
</application>
</manifest>