# Expo Marigold (Sailthru)

This is a custom [Expo Module](https://docs.expo.dev/modules/overview/) + [Config Plugin](https://docs.expo.dev/config-plugins/introduction/) which wraps the Marigold SDK and enables the iOS and Android apps to use [react-native-marigold](https://github.com/sailthru/sailthru-mobile-react-native-sdk).

> [!NOTE]
> Sailthru was acquired by Marigold and is in the midst of rebranding.

## App Delegate Subscriber (iOS)

The iOS portion of the module includes an `ExpoMarigoldDelegate`. This is an `ExpoAppDelegateSubscriber` subclass which allows us to hook into `application(_:didFinishLaunchingWithOptions:)`.

A bridging header is required expose the Marigold SDK from Objective C to Swift. This allows us to then call the `startEngine()` method on app launch.

- see https://docs.expo.dev/modules/appdelegate-subscribers/
- see https://sdkdevelopers.meetmarigold.com/docs/ios-integration

## Application Lifecycle Subscriber (Android)

The Android portion of the modules includes `ExpoMarigoldPackage` + `ExpoMarigoldApplicationLifecycleListener`. The latter inherits from Expo's built-in `ApplicationLifecycleListener`, and allows us to hook into the Application's `onCreate()`.

As with iOS, this means we can then call `startEngine()` on app launch.

- see https://docs.expo.dev/modules/android-lifecycle-listeners/
- see https://sdkdevelopers.meetmarigold.com/docs/android-integration

## Plugin

The Plugin adds the `appKey` for the Marigold SDK to `Info.plist` on iOS and the `AndroidManifest.xml` on Android.

On Android, we additionally use some of the transforms from `expo/config-plugins` to modify `/android/settings.gradle` and `/android/app/build.gradle` so we can add the maven repo for the Marigold SDK dependency.

## Usage

Can be included alongside any other Expo Config Plugins:

```js
"plugins": [
    // ...other plugins...
    [
        "expo-marigold",
        {
            "appKey": process.env.SAILTHRU_API_KEY
        }
    ],
]
```

For JavaScript usage, import and call methods from `react-native-marigold` as usual:

```js
import { EngageBySailthru } from 'react-native-marigold';

export function setSailthruEmail() {
  EngageBySailthru.setUserEmail('jpdriver@users.noreply.github.com');
}
```

see the [upstream TurboModule spec](https://github.com/sailthru/sailthru-mobile-react-native-sdk/blob/main/src/NativeRNEngageBySailthru.ts) for other available methods.
