Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MOBILE-3865] Add editTags support #527

Merged
merged 1 commit into from
Sep 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion DEV_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ yarn install

## iOS

1) Run `pod install` in `example/ios`
1) Run `pod install --repo-update` in `example/ios`

2) Open the `example/ios/AirshipSample.xcworkspace` Project

Expand Down
4 changes: 2 additions & 2 deletions android/gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ Airship_targetSdkVersion=31
Airship_compileSdkVersion=31
Airship_ndkversion=21.4.7075529

Airship_airshipProxyVersion=3.0.2
Airship_airshipProxyVersion=4.1.0

# workaround for now, used for HMS
Airship_airshipVersion=17.0.3
Airship_airshipVersion=17.2.0

Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class AirshipModule internal constructor(val context: ReactApplicationContext) :
// Background events will create a headless JS task in ReactAutopilot since
// initialized wont be called until we have a JS task.
EventEmitter.shared().pendingEventListener
.filter { it.isForeground() }
.filter { it.type.isForeground() }
.collect {
notifyPending()
}
Expand Down Expand Up @@ -155,6 +155,13 @@ class AirshipModule internal constructor(val context: ReactApplicationContext) :
}
}

@ReactMethod
override fun channelEditTags(operations: ReadableArray, promise: Promise) {
promise.resolveResult {
proxy.channel.editTags(Utils.convertArray(operations).toJsonValue())
}
}

@ReactMethod
override fun channelGetTags(promise: Promise) {
promise.resolveResult {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class ReactAutopilot : BaseAutopilot() {

MainScope().launch {
EventEmitter.shared().pendingEventListener
.filter { !it.isForeground() }
.filter { !it.type.isForeground() }
.collect {
AirshipHeadlessEventService.startService(context)
}
Expand Down
39 changes: 29 additions & 10 deletions example/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,42 @@ A basic sample application that integrates the Airship React Native module.

1) Install modules: Run `yarn` in repository root

### iOS
## Call TakeOff

`takeOff` should be called at the beginning of the lifecycle.

```javascript
import Airship from '@ua/react-native-airship';

Airship.takeOff({
default: {
appSecret: "REPLACE_WITH_YOUR_APP_SECRET",
appKey: "REPLACE_WITH_YOUR_APP_KEY"
},
site: "us", // use "eu" for EU cloud projects
urlAllowList: ["*"],
android: {
notificationConfig: {
icon: "ic_notification",
accentColor: "#00ff00"
}
}
});
```

1) Run `pod install` in `example/ios`
### iOS

2) Create the `AirshipConfig.plist` file in `example/ios`
1) Run `pod install --repo-update` in `example/ios`

3) Start the webserver in the top-level directory by running `yarn start`
2) Start the webserver in the top-level directory by running `yarn start`

4) Build and run the sample in the `example` directory: `yarn run:ios`
3) Build and run the sample in the `example` directory: `yarn ios`

### Android

1) Create the `airshipconfig.properties` file in `example/android/app/src/main/assets`

2) If using FCM, add your `google-services.json` file in `example/android/app`
1) If using FCM, add your `google-services.json` file in `example/android/app`

3) Start the webserver in the top-level directory by running `yarn start`
2) Start the webserver in the top-level directory by running `yarn start`

4) Build and run the sample in the `example` directory: `yarn run:android`
3) Build and run the sample in the `example` directory: `yarn android`

53 changes: 30 additions & 23 deletions example/ios/Podfile.lock
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
PODS:
- Airship (17.0.3):
- Airship/Automation (= 17.0.3)
- Airship/Basement (= 17.0.3)
- Airship/Core (= 17.0.3)
- Airship/MessageCenter (= 17.0.3)
- Airship/PreferenceCenter (= 17.0.3)
- Airship/Automation (17.0.3):
- Airship (17.2.2):
- Airship/Automation (= 17.2.2)
- Airship/Basement (= 17.2.2)
- Airship/Core (= 17.2.2)
- Airship/FeatureFlags (= 17.2.2)
- Airship/MessageCenter (= 17.2.2)
- Airship/PreferenceCenter (= 17.2.2)
- Airship/Automation (17.2.2):
- Airship/Core
- Airship/Basement (17.0.3)
- Airship/Core (17.0.3):
- Airship/Basement (17.2.2)
- Airship/Core (17.2.2):
- Airship/Basement
- Airship/MessageCenter (17.0.3):
- Airship/FeatureFlags (17.2.2):
- Airship/Core
- Airship/PreferenceCenter (17.0.3):
- Airship/MessageCenter (17.2.2):
- Airship/Core
- AirshipFrameworkProxy (3.0.2):
- Airship (= 17.0.3)
- Airship/PreferenceCenter (17.2.2):
- Airship/Core
- AirshipFrameworkProxy (4.1.0):
- Airship (= 17.2.2)
- boost (1.76.0)
- CocoaAsyncSocket (7.6.5)
- DoubleConversion (1.1.6)
Expand Down Expand Up @@ -315,10 +318,14 @@ PODS:
- React-logger (0.71.1):
- glog
- react-native-airship (16.0.1):
- AirshipFrameworkProxy (= 3.0.2)
- AirshipFrameworkProxy (= 4.1.0)
- React-Core
- react-native-safe-area-context (4.7.1):
- react-native-safe-area-context (4.5.0):
Ulrico972 marked this conversation as resolved.
Show resolved Hide resolved
- RCT-Folly
- RCTRequired
- RCTTypeSafety
- React-Core
- ReactCommon/turbomodule/core
- React-perflogger (0.71.1)
- React-RCTActionSheet (0.71.1):
- React-Core/RCTActionSheetHeaders (= 0.71.1)
Expand Down Expand Up @@ -400,9 +407,9 @@ PODS:
- React-jsi (= 0.71.1)
- React-logger (= 0.71.1)
- React-perflogger (= 0.71.1)
- RNGestureHandler (2.12.0):
- RNGestureHandler (2.9.0):
- React-Core
- RNScreens (3.22.1):
- RNScreens (3.19.0):
- React-Core
- React-RCTImage
- SocketRocket (0.6.1)
Expand Down Expand Up @@ -574,8 +581,8 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"

SPEC CHECKSUMS:
Airship: 9fdd1ccc3a78c42544f34b7de043d39491951023
AirshipFrameworkProxy: 9a0a26b1b117fe3ccbe1b2d4a9053875e2c0d6d2
Airship: f5a106a6daa01ba46ae2f519b1b3d4595e7e0972
AirshipFrameworkProxy: b9822473fef17241cf54508770fdf198f1af9405
boost: 57d2868c099736d80fcd648bf211b4431e51a558
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
Expand Down Expand Up @@ -609,8 +616,8 @@ SPEC CHECKSUMS:
React-jsiexecutor: 60cf272aababc5212410e4249d17cea14fc36caa
React-jsinspector: ff56004b0c974b688a6548c156d5830ad751ae07
React-logger: 60a0b5f8bed667ecf9e24fecca1f30d125de6d75
react-native-airship: 68a842b1002cabb9e8f12a13cbf7c38260eae868
react-native-safe-area-context: 9697629f7b2cda43cf52169bb7e0767d330648c2
react-native-airship: cb708f7d12b3fcea474119f2eb694d686aac54f6
react-native-safe-area-context: 39c2d8be3328df5d437ac1700f4f3a4f75716acc
React-perflogger: ec8eef2a8f03ecfa6361c2c5fb9197ef4a29cc85
React-RCTActionSheet: a0c023b86cf4c862fa9c4eb0f6f91fbe878fb2de
React-RCTAnimation: 168d53718c74153947c0109f55900faa64d79439
Expand All @@ -624,8 +631,8 @@ SPEC CHECKSUMS:
React-RCTVibration: 49d531ec8498e0afa2c9b22c2205784372e3d4f3
React-runtimeexecutor: 311feb67600774723fe10eb8801d3138cae9ad67
ReactCommon: 03be76588338a27a88d103b35c3c44a3fd43d136
RNGestureHandler: dec4645026e7401a0899f2846d864403478ff6a5
RNScreens: 50ffe2fa2342eabb2d0afbe19f7c1af286bc7fb3
RNGestureHandler: 071d7a9ad81e8b83fe7663b303d132406a7d8f39
RNScreens: ea4cd3a853063cda19a4e3c28d2e52180c80f4eb
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
Yoga: 921eb014669cf9c718ada68b08d362517d564e0c
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
Expand Down
9 changes: 4 additions & 5 deletions example/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import Airship, { EventType } from '@ua/react-native-airship';
const Tab = createBottomTabNavigator();
const MessageCenterStack = createStackNavigator();


Airship.addListener(EventType.NotificationResponse, (event) => {
console.log('NotificationResponse:', JSON.stringify(event));
});
Expand All @@ -26,12 +25,12 @@ Airship.addListener(EventType.ChannelCreated, (event) => {
console.log('ChannelCreated:', JSON.stringify(event));
});

Airship.addListener(EventType.NotificationStatusChangedStatus, (event) => {
console.log('NotificationStatusChangedStatus:', JSON.stringify(event));
Airship.addListener(EventType.PushNotificationStatusChangedStatus, (event) => {
console.log('PushNotificationStatusChangedStatus:', JSON.stringify(event));
});

Airship.addListener(EventType.iOSAuthorizedNotificationSettingsChanged, (event) => {
console.log('iOSAuthorizedNotificationSettingsChanged:', JSON.stringify(event));
Airship.addListener(EventType.IOSAuthorizedNotificationSettingsChanged, (event) => {
console.log('IOSAuthorizedNotificationSettingsChanged:', JSON.stringify(event));
});


Expand Down
7 changes: 6 additions & 1 deletion ios/AirshipReactNative.swift
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ public class AirshipReactNative: NSObject {
try? AirshipProxy.shared.attemptTakeOff(launchOptions: launchOptions)

Task {
let stream = await AirshipProxyEventEmitter.shared.pendingEventTypeAdded
let stream = await AirshipProxyEventEmitter.shared.pendingEventAdded
for await _ in stream {
await self.eventNotifier.notifyPendingEvents()
}
Expand Down Expand Up @@ -183,6 +183,11 @@ public extension AirshipReactNative {
func channelRemoveTag(_ tag: String) throws {
return try AirshipProxy.shared.channel.removeTags([tag])
}

@objc
func channelEditTags(json: Any) throws {
try AirshipProxy.shared.channel.editTags(json: json)
}

@objc
func channelEnableChannelCreation() throws -> Void {
Expand Down
11 changes: 11 additions & 0 deletions ios/RTNAirship.mm
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ + (BOOL)requiresMainQueueSetup {
[self handleResult:nil error:error resolve:resolve reject:reject];
}

RCT_REMAP_METHOD(channelEditTags,
channelEditTags:(NSArray *)operations
resolve:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
NSError *error;
[AirshipReactNative.shared channelEditTagsWithJson:operations
error:&error];

[self handleResult:nil error:error resolve:resolve reject:reject];
}

RCT_REMAP_METHOD(pushGetActiveNotifications,
pushGetActiveNotifications:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject) {
Expand Down
2 changes: 1 addition & 1 deletion react-native-airship.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,6 @@ Pod::Spec.new do |s|



s.dependency "AirshipFrameworkProxy", "3.0.2"
s.dependency "AirshipFrameworkProxy", "4.1.0"

end
13 changes: 13 additions & 0 deletions src/AirshipChannel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
SubscriptionListEditor, SubscriptionListOperation,
} from './SubscriptionListEditor';
import { TagGroupEditor, TagGroupOperation } from './TagGroupEditor';
import { TagEditor, TagOperation } from './TagEditor';

/**
* Airship channel.
Expand All @@ -12,6 +13,7 @@ export class AirshipChannel {

/**
* Adds a device tag.
* Deprecated. Use editTags() instead.
* @param tag The tag.
* @returns A promise.
*/
Expand All @@ -21,13 +23,24 @@ export class AirshipChannel {

/**
* Removes a device tag.
* Deprecated. Use editTags() instead.
* @param tag The tag.
* @returns A promise.
*/
public removeTag(tag: string): Promise<void> {
return this.module.channelRemoveTag(tag);
}

/**
* Edits device tags.
* @returns A tag editor.
*/
public editTags(): TagEditor {
return new TagEditor((operations: TagOperation[]) => {
return this.module.channelEditTags(operations);
});
}

/**
* Gets the device tags.
* @returns A promise with the result.
Expand Down
1 change: 1 addition & 0 deletions src/NativeRTNAirship.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export interface Spec extends TurboModule {
// Channel
channelAddTag(tag: string): Promise<void>;
channelRemoveTag(tag: string): Promise<void>;
channelEditTags(operations: Object[]): Promise<void>;
channelGetTags(): Promise<string[]>;
channelGetChannelId(): Promise<string | null | undefined>;
channelGetSubscriptionLists(): Promise<string[]>;
Expand Down
68 changes: 68 additions & 0 deletions src/TagEditor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/* Copyright Airship and Contributors */

'use strict';

/**
* Tag operation.
* @hidden
*/
export interface TagOperation {
/**
* The operation name
*/
operationType: string;
/**
* An array of tags.
*/
tags: string[];
}

/**
* Editor for device tags.
*/
export class TagEditor {
onApply: (operations: TagOperation[]) => Promise<void>;
operations: TagOperation[];

/**
* TagEditor constructor
*
* @hidden
* @param onApply The apply function
*/
constructor(onApply: (operations: TagOperation[]) => Promise<void>) {
this.onApply = onApply;
this.operations = [];
}

/**
* Adds tags to a channel.
*
* @param tags Tags to add.
* @return The tag editor instance.
*/
addTags(tags: string[]): TagEditor {
const operation = { operationType: 'add', tags: tags };
this.operations.push(operation);
return this;
}

/**
* Removes tags from the channel.
*
* @param tags Tags to remove.
* @return The tag editor instance.
*/
removeTags(tags: string[]): TagEditor {
const operation = { operationType: 'remove', tags: tags };
this.operations.push(operation);
return this;
}

/**
* Applies the tag changes.
*/
apply(): Promise<void> {
return this.onApply(this.operations);
}
}
Loading