React Native SDK Reference
This topic explains how to use the Harness Feature Flags SDK in your React Native application.
This topic describes how to use the Harness Feature Flags SDK for your React Native application.
Before You Begin
Version
Latest SDK version can be found on the GitHub Release Page
Prerequisites
To use this SDK, make sure you:
Install React 17 or a newer version.
Install Node.js 16 or a newer version.
To follow along with our test code sample, make sure you've done the following:
Create a Feature Flag on the Harness Platform. If you are following along with the SDK README sample code, make sure your flag is called
harnessappdemodarkmode.Create a project using Expo.
Install the SDK
To set up the React Native Client SDK, you have the following options:
You can install the React Native SDK using npm by running the following command in your terminal:
You can also install with yarn by running the following command in your terminal:
Initialize the SDK
To initialize the React Native SDK, you need to:
import the FF context provider
provide a client SDK key
provide a target
Import the FF context provider
The FF context provider is responsible for connecting to the Harness Feature Flags service and retrieving your feature flag values. It provides the various hooks and higher-order components with the data they need to operate. You should try to include this as high up in your JSX render tree as possible to ensure that it can serve all the views of your application.
Add your client SDK key
To use the provider, wrap your application code in the FFContextProvider component and pass in your client SDK key and target.
To connect to the correct Environment that you set up on the Harness Platform, you need to add the Client SDK Key from that Environment. Input the Client SDK Key into the apiKey prop, for example:
Add a Target
For more information about Targets, go to Targeting Users With Flags.
To add a Target that you want to Evaluate, pass an object using the target prop.
Parameter
Description
Required?
Example
identifier
Unique ID for the Target.
Required
user1234
name
Name for the Target.
Optional
User 1234
attributes
Object of key/value pairs of meta data for the target
Optional
{ region: 'US-East' }
Configure the SDK
By default, the React Native Client SDK is configured to connect to the Harness Feature Flags service, establish a stream (where supported) and periodically report back flag metrics. Using the options prop, you can configure the following options of the SDK:
Name
Example
Description
Default Value
cache
cache: true
Cache evaluations to use during the next start up of the SDK.
false
baseUrl
baseUrl: 'https://config.ff.harness.io/api/1.0'
The URL used to fetch Feature Flag Evaluations. When using the Relay Proxy, change this to: http://localhost:7000
https://config.ff.harness.io/api/1.0
eventUrl
eventUrl: 'https://events.ff.harness.io/api/1.0'
The URL for posting metrics data to the Feature Flag service. When using the Relay Proxy, change this to: http://localhost:7000
https://events.ff.harness.io/api/1.0
streamEnabled
streamEnabled: true
Set to true to enable streaming mode. Set to false to disable streaming mode.
true
debug
debug: true
Set to true to enable debug mode. Set to false to disable debug mode.
false
eventsSyncInterval
eventsSyncInterval: 60000
The interval in milliseconds at which we send metrics.
60000 (milliseconds)
pollingEnabled
pollingEnabled: true
Set to true to enable polling mode. Set to false to disable polling mode.
false
pollingInterval
pollingInterval: 60000
The interval in milliseconds that we poll for changes when you are using polling mode.
60000 (milliseconds)
logger
logger: { debug: myDebugFn, info: myInfoFn, error: myErrorFn, warn: myWarnFn }
The logger to use when logging debug, info, error and warning messages.
console
Use the options prop to declare the configuration options you want to use, for example:
Code example using Expo
The following is a complete code example using Expo that you can use to test the harnessappdemodarkmode flag you created on the Harness Platform.
When you run the code, it will:
Render a loading screen
Connect to the FF service.
Retrieve all flags.
Access a flag using the
useFeatureFlaghook.Access several flags using the
useFeatureFlagshook.
First create your Expo project and install the dependencies.
The following code can be placed in the src/App.js file:
Use the React Native SDK
Async mode
By default, the React Native Client SDK will block rendering of children until the initial load of feature flags has completed.
This ensures that children have immediate access to all flags when they are rendered.
However, in some circumstances it might be beneficial to immediately render the application and handle display of loading on a component-by-component basis.
The React Native Client SDK's asynchronous mode allows this by passing the optional async prop when connecting with the FFContextProvider.
Streaming and polling
By default, the React Native Client SDK will set up a stream to keep the feature flag values up-to-date when things change in your Harness project. When a change is made in the Harness project, Harness will send an event to the SDK and the SDK will serve the changed value. This is great when your application needs to change in near-real-time when a feature flag changes (for example, your application might need to display a maintenance screen when the backend APIs are being updated). However, in some circumstances, polling might be a better option. When streaming is disabled and polling is enabled, the SDK will periodically poll for current feature flag values and keep your application up-to-date. By default, the interval for polling is 60 seconds and can be adjusted to suit your application.
Streaming
Streaming is enabled by default and can be disabled using the streamEnabled option and passing false. In the event that the stream is interrupted, the SDK will attempt to reconnect automatically. If after a number of attempts the stream cannot be re-established, the SDK will switch to polling unless specifically disabled using the pollingEnabled option.
Polling
Polling is disabled by default and can be enabled using the pollingEnabled option and passing true. When enabled, the SDK will poll for feature flag value changes every 60 seconds, this can be adjusted using the pollingInterval option and passing the number of milliseconds you want the SDK to wait between polling.
Cache evaluations
In practice flags rarely change and so it can be useful to cache the last received evaluations from the server to allow your application to get started as fast as possible. Setting the cache option as true or as an object (see interface below) will allow the SDK to store its evaluations to localStorage and retrieve at startup. This lets the SDK get started near instantly and begin serving flags, while it carries on authenticating and fetching up-to-date evaluations from the server behind the scenes.
The cache option can also be passed as an object with the following options.
Override the internal logger
By default, the React Client SDK will log errors and debug messages using the console object. In some cases, it can be useful to instead log to a service or silently fail without logging errors.
Fast startup
By default, the React Native Client SDK will connect to the Harness Feature Flags service to get the current feature flag values and then render your application. Using a combination of the cache option (see Caching evaluations above) and Async mode (see Async mode above), you can instruct the SDK to instead render immediately using previously cached values (in the case of a returning user) or default values (in the case of new users). The SDK will immediately render your application and asynchronously connect to the Harness Feature Flags service to make sure the cached feature flag values are kept up-to-date.
Use the API
FFContextProvider
The FFContextProvider component is used to set up the React context to allow your application to access feature flags using the useFeatureFlag and useFeatureFlags hooks and withFeatureFlags HOC. At minimum, it requires the apiKey you have set up in your Harness Feature Flags account, and the target. You can think of a target as a user.
The FFContextProvider component also accepts an options object, a fallback component, an array of initialEvaluations, an onError handler, and can be placed in Async mode using the async prop. The fallback component will be displayed while the SDK is connecting and fetching your flags. The initialEvaluations prop allows you pass an array of evaluations to use immediately as the SDK is authenticating and fetching flags. The onError prop allows you to pass an event handler which will be called whenever a network error occurs.
useFeatureFlag
The useFeatureFlag hook returns a single named flag value. An optional second argument allows you to set what value will be returned if the flag does not have a value. By default useFeatureFlag will return undefined if the flag cannot be found.
N.B. when rendered in Async mode, the default value will be returned until the flags are retrieved. Consider using the useFeatureFlagsLoading hook to determine when the SDK has finished loading.
useFeatureFlags
The useFeatureFlags hook returns an object of flag identifier/flag value pairs. You can pass an array of flag identifiers or an object of flag identifier/default value pairs. If an array is used and a flag cannot be found, the returned value for the flag will be undefined. If no arguments are passed, all flags will be returned.
N.B. when rendered in Async mode, the default value will be returned until the flags are retrieved. Consider using the useFeatureFlagsLoading hook to determine when the SDK has finished loading.
Get a subset of Flags
Get a subset of Flags with custom default values
useFeatureFlagsLoading
The useFeatureFlagsLoading hook returns a boolean value indicating whether the SDK is currently loading flags from the server.
useFeatureFlagsClient
The React Native Client SDK internally uses the Javascript Client SDK to communicate with Harness. Sometimes it can be useful to be able to access the instance of the Javascript Client SDK rather than use the existing hooks or higher-order components (HOCs). The useFeatureFlagsClient hook returns the current Javascript Client SDK instance that the React Native Client SDK is using. This instance will be configured, initialized, and hooked up to the various events the Javascript Client SDK provides.
ifFeatureFlag
The ifFeatureFlag higher-order component (HOC) wraps your component and conditionally renders only when the named flag is enabled or matches a specific value.
You can then use MyConditionalComponent as a normal component, and only render if flag1's value is truthy.
Use conditions with a specific value
You can then use MyConditionalComponent as a normal component, and only render if flag1's value matches the passed condition.
Load fallback when in async mode
If Async mode is used, by default the component will wait for flags to be retrieved before showing. This behaviour can be overridden by passing an element as loadingFallback; when loading the loadingFallback will be displayed until the flags are retrieved, at which point the component will either show or hide as normal.
withFeatureFlags
The withFeatureFlags higher-order component (HOC) wraps your component and adds flags and loading as additional props. flags contains the evaluations for all known flags and loading indicates whether the SDK is actively fetching flags.
Load in async mode
If Async mode is used, the loading prop will indicate whether the SDK has completed loading the flags. When loading completes, the loading prop will be false and the flags prop will contain all known flags.
withFeatureFlagsClient
The React Native Client SDK internally uses the Javascript Client SDK to communicate with Harness. Sometimes it can be useful to be able to access the instance of the Javascript Client SDK rather than use the existing hooks or higher-order components (HOCs). The withFeatureFlagsClient HOC wraps your component and adds featureFlagsClient as additional prop. featureFlagsClient is the current Javascript Client SDK instance that the React Native Client SDK is using. This instance will be configured, initialized, and been hooked up to the various events the Javascript Client SDK provides.
Last updated
Was this helpful?