npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@personaclick/rn-sdk

v2.0.4

Published

PersonaClick React Native SDK

Downloads

304

Readme

PersonaClick React Native SDK

Installation

PersonaClick React Native SDK is available through GitHub. To install it, run next command in terminal:

yarn add @personaclick/rn-sdk

or

yarn add https://github.com/PersonaClick/rn-sdk.git

Also need added AsyncStorage plugin:

yarn add @react-native-async-storage/async-storage

and react-native-device-info

yarn add react-native-device-info

For push notification:

yarn add react-native-push-notification
yarn add @react-native-community/push-notification-ios
yarn add @react-native-firebase/app
yarn add @react-native-firebase/messaging

iOS Additional Installation

Open your /ios/{projectName}/AppDelegate.m file, and add the following: At the top of the file, import the Firebase SDK:

#import <Firebase.h>

Open a terminal window and navigate to the location of the Xcode project for your app

cd ios/
pod install

Disable auto-registration the device

// firebase.json
{
    "react-native": {
        "messaging_ios_auto_register_for_remote_messages": false
    }
}

On iOS, when a message is received the device silently starts your application in a background state. To get around this problem, you can configure your application. Use this property to conditionally render null ("nothing") if your app is launched in the background:

// index.js
import { AppRegistry } from 'react-native';

function HeadlessCheck({ isHeadless }) {
  if (isHeadless) {
    // App has been launched in the background by iOS, ignore
    return null;
  }

  return <App />;
}

function App() {
  // Your application
}

AppRegistry.registerComponent('app', () => HeadlessCheck);

To inject a isHeadless prop into your app, please update your AppDelegate.m file as instructed below:

/ add this import statement at the top of your `AppDelegate.m` file
#import "RNFBMessagingModule.h"

// in "(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions" method
// Use `addCustomPropsToUserProps` to pass in props for initialization of your app
// Or pass in `nil` if you have none as per below example
// For `withLaunchOptions` please pass in `launchOptions` object
NSDictionary *appProperties = [RNFBMessagingModule addCustomPropsToUserProps:nil withLaunchOptions:launchOptions];

// Find the `RCTRootView` instance and update the `initialProperties` with your `appProperties` instance
RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge
                                             moduleName:@"nameOfYourApp"
                                             initialProperties:appProperties];

iOS Background Limitation

If the iOS Background App Refresh mode is off, your handler configured in setBackgroundMessageHandler will not be triggered.

Android Additional Installation

In your android/build.gradle

buildscript { 
    dependencies {
        ...
        //Add this \/
        classpath 'com.google.gms:google-services:4.3.4'
    }

In your android/app/build.gradle add

apply plugin: 'com.google.gms.google-services'

in android/app/src/main/AndroidManifest.xml add

    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"
                     android:maxSdkVersion="32"/>
    <uses-permission android:name="android.permission.USE_EXACT_ALARM"
                     android:minSdkVersion="33"/>

Usage

SDK is used for several tasks:

  1. Initialize SDK and user's session
  2. Events tracking
  3. Track custom event
  4. Track push
  5. Product recommendations
  6. Product search
  7. Save profile settings
  8. Init push
  9. Set push token notification
  10. Triggers
    1. Price drop
    2. Back in Stock
  11. Segments
    1. Add user to a segment
    2. Remove user from a segment
    3. Get user segments

Initialization

Initialize SDK object and use it anywhere in your application. (!) Remember to initialize SDK only once on application launch.

import PersonaClick from '@personaclick/rn-sdk';

...
const rnsdk = new PersonaClick("YOUR_SHOP_ID", "Stream");

Check init

rnsdk.isInit(); // returns true/false

Events tracking

Track user's behavior to collect data. There are several types of events:



// View product (simple way)
rnsdk.track("view", 37);

// View product (try to avoid it)
rnsdk.track("view", {
    id: 37,
    stock: true
});

// View product after user clicked on recommender block
rnsdk.track("view", {
  id: PRODUCT_ID,
  recommended_by: 'dynamic',
  recommended_code: 'UNIQUE_RECOMMENDER_CODE'
});

// View product, after user clicked on search results
rnsdk.track("view", {
  id: PRODUCT_ID,
  recommended_by: 'full_search',
  recommended_code: QUERY_STRING
});
// ... or instant search dropdown
rnsdk.track("view", {
  id: PRODUCT_ID,
  recommended_by: 'instant_search',
  recommended_code: QUERY_STRING
});

// View category
rnsdk.track("category", 100500);

// Add product to cart (simple way)
rnsdk.track("cart", id);

// Add product to cart with amount and track recommender
rnsdk.track("cart", {
  id: PRODUCT_ID,
  amount: PRODUCT_AMOUNT,
  recommended_by: 'dynamic',
  recommended_code: 'UNIQUE_RECOMMENDER_CODE'
});

//Send the full current cart
rnsdk.track("cart", [
  {
    id: FIRST_PRODUCT_ID,
    amount: FIRST_PRODUCT_AMOUNT
  },
  ...
  {
    id: LAST_PRODUCT_ID,
    amount: LAST_PRODUCT_AMOUNT
  }
]);

// Remove product from cart
rnsdk.track("remove_from_cart", id);

// Add product to favorities
rnsdk.track("wish", id);

// Remove product from favorities
rnsdk.track("remove_wish", id);

// Track purchase (several products)
rnsdk.track("purchase", {
  products: [
      {id: 37, price: 318, amount: 3},
      {id: 187, price: 5000, amount: 1}
  ],
  order: 'N318',
  order_price: 29999
});

// Track user search
rnsdk.track("search", "This is a search example");

Track custom event

// Simple tracking
rnsdk.trackEvent('my_event');

// Tracking with custom parameters
rnsdk.trackEvent('my_event', {
  category: "event category", 
  label: "event label",
  value: 100
});

Track push notifications

const params = {
  code: 'CODE',
  type: 'TYPE'
};
// Track user click notification
rnsdk.notificationClicked(params);

// Track Notification received
rnsdk.notificationReceived(params);

Product search

const type = 'instant_search'; // full_search, ...

let search_query = 'your_search_text';

rnsdk.search({
  type: type,
  search_query: search_query,
  // other params
}) 
  .then((res) => {
    console.log(res);
  })

Product recommendations

const recommender_code = 'recommender_code'; 

const params = {
  item: 100500,
  exclude: [3, 14, 159, 26535],
  search_query: "To be or not to be"
 // other params
};

rnsdk.recommend(recommender_code, params) 
  .then((res) => {
    console.log(res);
  })

Save profile settings

const params = {
  id: 100500,
  email: "[email protected]",
  phone: "4400114527199",
  first_name: "John",
  last_name: "Doe",
  birthday: "1990-03-11",
  age: 31,
  gender: "m",
  location: "NY",
  bought_something: true,
  loyalty_id: "000001234567",
  loyalty_card_location: "NY",
  loyalty_status: "5% discount",
  loyalty_bonuses: 1123,
  loyalty_bonuses_to_next_level: 1877,
  fb_id: "000000000354677",
  vk_id: "vk031845",
  telegram_id: "0125762968357835",
  kids: [
    {gender: "m", birthday: "2001-04-12"},
    {gender: "f", birthday: "2015-07-28"}
  ],
  auto: [
    {brand: "Nissan", model: "Qashqai", vds: "TM7N243E4G0BJG978"}
  ]
};

rnsdk.setProfile(params);

Read profile info

rnsdk.getProfile()
  .then((res) => {
      console.log(res);
    })

Init push notification

//Set use Firebase messaging only. Call this method before initPush; 
rnsdk.firebase_only(true);

// Simple init 
rnsdk.initPush();

//onClick listener
rnsdk.initPush(onClickCallback);

// onReceivetive listener
rnsdk.initPush(false, onReceiveCallback);

// you can use different callback for notification, when app is in background.    
rnsdk.initPush(false, onReceiveCallback, onBackgroundReceiveCallback);
// If onBackgroundReceiveCallback not specified, used onReceiveCallback listener. 

// onClickCallback params
{
  "data": {
    "body": "MESSAGE_BODY",
    "icon": "MESSAGE_ICON",
    "id": "MESSAGE_ID",
    "image": "MESSAGE_IMAGE",
    "title": "MESSAGE_TITLE",
    "type": "MESSAGE_TYPE"
  },
  "from": "MESSAGE_FROM",
  "messageId": "FMC_MESSAGE_ID",
  "sentTime": TIMESTAMP,
  "ttl": TTL_VALUE
}
// onReceiveCallBack, onBackgroundReceiveCallback params
{
  "data": {
    "action_urls": "[]", 
    "actions": "[]",
    "body": "MESSAGE_BODY",
    "icon": "MESSAGE_ICON", 
    "id": "MESSAGE_ID",
    "image": "MESSAGE_IMAGE", 
    "title": "MESSAGE_TITLE", 
    "type": "MESSAGE_TYPE"
  }, 
  "from": "MESSAGE_FROM", 
  "messageId": "FMC_MESSAGE_ID", 
  "sentTime": TIMESTAMP, 
  "ttl": TTL_VALUE
}

###IMPORTANT! Сall initPush method on app initialization

Set push token notification

rnsdk.setPushTokenNotification('NEW_TOKEN');

Triggers

Price drop

// Subscribing
rnsdk.triggers('subscribe_for_product_price', {email: '[email protected]', item: '3323', price: 160});

// Unsubscribing from specific products
rnsdk.triggers('unsubscribe_from_product_price', {email: '[email protected]', item_ids: [3323, 100500, 'ABCDEF']});

// Unsubscribing from all products
rnsdk.triggers('unsubscribe_from_product_price', {email: '[email protected]', item_ids: []});

Back in Stock

// Subscribing
rnsdk.triggers('subscribe_for_product_available', {email: '[email protected]', item: '3323', properties: {fashion_size: "XL"}});

// Unsubscribing from specific products
rnsdk.triggers('unsubscribe_from_product_available', {email: '[email protected]', item_ids: [3323, 100500, 'ABCDEF']});

// Unsubscribing from all products
rnsdk.triggers('unsubscribe_from_product_available', {email: '[email protected]', item_ids: []});

Manage subscriptions

// Subscribe user to all kids of email campaigns and SMS
rnsdk.subscriptions('manage', {
  email: '[email protected]',
  phone: '+100000000000',
  email_bulk: true,
  email_chain: true,
  email_transactional: true,
  sms_bulk: true,
  sms_chain: true,
  sms_transactional: true
});

// Change only specific subscriptions
rnsdk.subscriptions('manage', {
  email: '[email protected]',
  phone: '+100000000000',
  email_chain: true,
  sms_bulk: true,
  sms_transactional: true
});

// Change without phone
rnsdk.subscriptions('manage', {
  email: '[email protected]',
  email_chain: true,
  sms_bulk: true,
  sms_transactional: true
});

Segments

Add user to a segment

// Using all possible identifiers
rnsdk.segments('add', {
  "email": "[email protected]",
  "phone": "+10000000000",
  "segment_id": "SEGMENT_ID"
});

// With phone only
rnsdk.segments('add', {
  "phone": "+10000000000",
  "segment_id": "SEGMENT_ID"
});

// With email only
rnsdk.segments('add', {
  "email": "[email protected]",
  "segment_id": "SEGMENT_ID"
});

// Without any contacts: `did` is used automatically
rnsdk.segments('add', {
  "segment_id": "SEGMENT_ID"
});

Remove user from a segment

// Using all possible identifiers
rnsdk.segments('remove', {
  "email": "[email protected]",
  "phone": "+10000000000",
  "segment_id": "SEGMENT_ID"
});

// With phone only
rnsdk.segments('remove', {
  "phone": "+10000000000",
  "segment_id": "SEGMENT_ID"
});

// With email only
rnsdk.segments('remove', {
  "email": "[email protected]",
  "segment_id": "SEGMENT_ID"
});

// Without any contacts: `did` is used automatically
rnsdk.segments('remove', {
  "segment_id": "SEGMENT_ID"
});

Get user segments

// Using all possible identifiers
rnsdk.segments('get').then(res => {
  // segments (type: array of objects)
  // each object has the following properties:
  // "id" as Segment ID
  // "type" as Segment Type ("dynamic", "static")
});

License

PersonaClick React Native SDK is available under the MIT license. See the LICENSE file for more info.