Skip to content

Commit d6e87f5

Browse files
authored
Merge pull request #469 from urbanairship/MOBILE-5613-Add-contact-email-sms-registration
Add contact email and sms registration
2 parents e1a5a3f + 578aab3 commit d6e87f5

8 files changed

Lines changed: 241 additions & 3 deletions

File tree

Example/index.html

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,72 @@
217217
setNamedUser(namedUser)
218218
})
219219
})
220+
221+
var setContactChannelStatus = function(message, isError) {
222+
var $status = $("#contactChannelStatus")
223+
$status.text(message)
224+
$status.css("color", isError ? "#c00" : "#060")
225+
console.log(isError ? "Contact channel error: " + message : "Contact channel: " + message)
226+
}
227+
228+
$("#registerEmailOptionsSection").hide()
229+
$("#registerEmailWithOptions").change(function() {
230+
if ($("#registerEmailWithOptions").val() === "on") {
231+
$("#registerEmailOptionsSection").show()
232+
} else {
233+
$("#registerEmailOptionsSection").hide()
234+
}
235+
})
236+
237+
$("#registerEmailButton").click(function(ev) {
238+
var email = $("#registerEmailField").val().trim()
239+
if (!email) {
240+
setContactChannelStatus("Email address is required", true)
241+
return
242+
}
243+
244+
var onSuccess = function() {
245+
setContactChannelStatus("Registered email: " + email, false)
246+
}
247+
var onError = function(err) {
248+
setContactChannelStatus("registerEmail failed: " + err, true)
249+
}
250+
251+
if ($("#registerEmailWithOptions").val() === "on") {
252+
var options = {
253+
transactionalOptedIn: Date.now(),
254+
properties: { source: "cordova-example" }
255+
}
256+
if ($("#registerEmailDoubleOptIn").val() === "on") {
257+
options.doubleOptIn = true
258+
}
259+
if ($("#registerEmailCommercialOptIn").val() === "on") {
260+
options.commercialOptedIn = Date.now()
261+
}
262+
Airship.contact.registerEmail(email, options, onSuccess, onError)
263+
} else {
264+
Airship.contact.registerEmail(email, {}, onSuccess, onError)
265+
}
266+
})
267+
268+
$("#registerSMSButton").click(function(ev) {
269+
var msisdn = $("#registerSMSField").val().trim()
270+
var senderId = $("#registerSMSSenderIdField").val().trim()
271+
if (!msisdn) {
272+
setContactChannelStatus("MSISDN is required", true)
273+
return
274+
}
275+
if (!senderId) {
276+
setContactChannelStatus("Sender ID is required", true)
277+
return
278+
}
279+
280+
Airship.contact.registerSMS(msisdn, { senderId: senderId }, function() {
281+
setContactChannelStatus("Registered SMS: " + msisdn, false)
282+
}, function(err) {
283+
setContactChannelStatus("registerSMS failed: " + err, true)
284+
})
285+
})
220286
}
221287

222288
document.addEventListener("deviceready", onDeviceReady, false)
@@ -245,6 +311,49 @@
245311
<input type="text" name="setNamedUserField" id="setNamedUserField" style="width:96.5%;" /> <input type="button" id="setNamedUserButton" value="Set namedUser" />
246312
</div>
247313

314+
<center><h3>Contact Channels</h3></center>
315+
<div data-role="fieldcontain">
316+
<label for="registerEmailField">Email</label>
317+
<input type="email" name="registerEmailField" id="registerEmailField" style="width:96.5%;" placeholder="your@example.com" />
318+
<div data-role="controlgroup">
319+
<label for="registerEmailWithOptions">Use custom options</label>
320+
<select name="registerEmailWithOptions" id="registerEmailWithOptions" data-role="slider" data-theme="c" data-track-theme="c">
321+
<option value="off">Off</option>
322+
<option value="on">On</option>
323+
</select>
324+
</div>
325+
<div id="registerEmailOptionsSection">
326+
<div data-role="controlgroup">
327+
<label for="registerEmailCommercialOptIn">Commercial opt-in date</label>
328+
<select name="registerEmailCommercialOptIn" id="registerEmailCommercialOptIn" data-role="slider" data-theme="c" data-track-theme="c">
329+
<option value="off">Off</option>
330+
<option value="on">On</option>
331+
</select>
332+
</div>
333+
<div data-role="controlgroup">
334+
<label for="registerEmailDoubleOptIn">Double opt-in</label>
335+
<select name="registerEmailDoubleOptIn" id="registerEmailDoubleOptIn" data-role="slider" data-theme="c" data-track-theme="c">
336+
<option value="off">Off</option>
337+
<option value="on">On</option>
338+
</select>
339+
</div>
340+
</div>
341+
<input type="button" id="registerEmailButton" value="Register email" />
342+
</div>
343+
344+
<div data-role="fieldcontain">
345+
<label for="registerSMSField">MSISDN</label>
346+
<input type="tel" name="registerSMSField" id="registerSMSField" style="width:96.5%;" placeholder="+15551234567" />
347+
<label for="registerSMSSenderIdField">Sender ID</label>
348+
<input type="text" name="registerSMSSenderIdField" id="registerSMSSenderIdField" style="width:96.5%;" placeholder="senderId" />
349+
<input type="button" id="registerSMSButton" value="Register SMS" />
350+
</div>
351+
352+
<div data-role="fieldcontain">
353+
<label>Status</label>
354+
<span id="contactChannelStatus" style="word-wrap: break-word;"></span>
355+
</div>
356+
248357
<div data-role="controlgroup">
249358
<label for="pushEnabled">Push Enabled</label>
250359
<select name="pushEnabled" id="pushEnabled" data-role="slider" data-theme="c" data-track-theme="c">

cordova-airship-hms/src/android/build-extras.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ repositories {
55
}
66

77
dependencies {
8-
implementation "com.urbanairship.android:airship-framework-proxy-hms:15.8.0"
8+
implementation "com.urbanairship.android:airship-framework-proxy-hms:15.9.0"
99
implementation 'com.huawei.hms:push:6.13.0.300'
1010
}

cordova-airship/Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ let package = Package(
1515
],
1616
dependencies: [
1717
.package(url: "https://github.com/apache/cordova-ios.git", branch: "master"),
18-
.package(url: "https://github.com/urbanairship/airship-mobile-framework-proxy.git", from: "15.8.0"),
18+
.package(url: "https://github.com/urbanairship/airship-mobile-framework-proxy.git", from: "15.9.0"),
1919
],
2020
targets: [
2121
.target(

cordova-airship/src/android/AirshipCordova.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,14 @@ class AirshipCordova : CordovaPlugin() {
174174
"contact#editSubscriptionLists" -> callback.resolve(scope, method) { proxy.contact.editSubscriptionLists(arg) }
175175
"contact#editAttributes" -> callback.resolve(scope, method) { proxy.contact.editAttributes(arg) }
176176
"contact#getSubscriptionLists" -> callback.resolve(scope, method) { proxy.contact.getSubscriptionLists() }
177+
"contact#registerEmail" -> callback.resolve(scope, method) {
178+
val args = RegisterEmailArgs.fromJson(arg)
179+
proxy.contact.registerEmail(args.address, args.options)
180+
}
181+
"contact#registerSMS" -> callback.resolve(scope, method) {
182+
val args = RegisterSMSArgs.fromJson(arg)
183+
proxy.contact.registerSms(args.msisdn, args.options)
184+
}
177185

178186
// Push
179187
"push#setUserNotificationsEnabled" -> callback.resolve(scope, method) { proxy.push.setUserNotificationsEnabled(arg.requireBoolean()) }
@@ -322,6 +330,36 @@ class AirshipCordova : CordovaPlugin() {
322330

323331

324332

333+
internal data class RegisterEmailArgs(
334+
val address: String,
335+
val options: JsonValue,
336+
) {
337+
companion object {
338+
fun fromJson(json: JsonValue): RegisterEmailArgs {
339+
val map = json.optMap()
340+
return RegisterEmailArgs(
341+
address = map.opt("address").getString(""),
342+
options = map.opt("options"),
343+
)
344+
}
345+
}
346+
}
347+
348+
internal data class RegisterSMSArgs(
349+
val msisdn: String,
350+
val options: JsonValue,
351+
) {
352+
companion object {
353+
fun fromJson(json: JsonValue): RegisterSMSArgs {
354+
val map = json.optMap()
355+
return RegisterSMSArgs(
356+
msisdn = map.opt("msisdn").getString(""),
357+
options = map.opt("options"),
358+
)
359+
}
360+
}
361+
}
362+
325363
internal fun CallbackContext.error(method: String, exception: java.lang.Exception) {
326364
this.error("AIRSHIP_ERROR(method=$method, exception=$exception)")
327365
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
dependencies {
2-
api "com.urbanairship.android:airship-framework-proxy:15.8.0"
2+
api "com.urbanairship.android:airship-framework-proxy:15.9.0"
33
}

cordova-airship/src/ios/AirshipCordova.swift

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,15 @@ public final class AirshipCordova: CDVPlugin {
231231
case "contact#getNamedUserId":
232232
return try await AirshipProxy.shared.contact.namedUserID
233233

234+
case "contact#registerEmail":
235+
let args: RegisterEmailArgs = try command.requireCodableArg()
236+
try AirshipProxy.shared.contact.registerEmail(args.address, options: args.options)
237+
return nil
238+
239+
case "contact#registerSMS":
240+
let args: RegisterSMSArgs = try command.requireCodableArg()
241+
try AirshipProxy.shared.contact.registerSMS(args.msisdn, options: args.options)
242+
return nil
234243

235244
// Push
236245
case "push#getPushToken":
@@ -560,6 +569,15 @@ public final class AirshipCordova: CDVPlugin {
560569
}
561570
}
562571

572+
private struct RegisterEmailArgs: Decodable {
573+
let address: String
574+
let options: EmailRegistrationProxyOptions
575+
}
576+
577+
private struct RegisterSMSArgs: Decodable {
578+
let msisdn: String
579+
let options: SMSRegistrationProxyOptions
580+
}
563581

564582
extension CDVInvokedUrlCommand {
565583

cordova-airship/types/index.d.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1967,6 +1967,41 @@ export interface AirshipFeatureFlagManager {
19671967
): void
19681968
}
19691969

1970+
/**
1971+
* Options for email channel registration.
1972+
*/
1973+
export interface EmailRegistrationOptions {
1974+
/**
1975+
* Transactional opt-in date as milliseconds since epoch.
1976+
*/
1977+
transactionalOptedIn?: number;
1978+
1979+
/**
1980+
* Commercial opt-in date as milliseconds since epoch.
1981+
*/
1982+
commercialOptedIn?: number;
1983+
1984+
/**
1985+
* Custom properties for the email channel.
1986+
*/
1987+
properties?: Record<string, string>;
1988+
1989+
/**
1990+
* Request double opt-in for commercial messages when `commercialOptedIn` is not set.
1991+
*/
1992+
doubleOptIn?: boolean;
1993+
}
1994+
1995+
/**
1996+
* Options for SMS channel registration.
1997+
*/
1998+
export interface SmsRegistrationOptions {
1999+
/**
2000+
* The sender ID.
2001+
*/
2002+
senderId: string;
2003+
}
2004+
19702005
/**
19712006
* Airship contact.
19722007
*/
@@ -2041,6 +2076,34 @@ export interface AirshipContact {
20412076
* @returns A subscription list editor.
20422077
*/
20432078
editSubscriptionLists(): ScopedSubscriptionListEditor
2079+
2080+
/**
2081+
* Registers an email channel for the contact.
2082+
* @param email The email address.
2083+
* @param options Registration options.
2084+
* @param success Success callback.
2085+
* @param error Error callback.
2086+
*/
2087+
registerEmail(
2088+
email: string,
2089+
options: EmailRegistrationOptions,
2090+
success?: () => void,
2091+
error?: (err: string) => void
2092+
): void
2093+
2094+
/**
2095+
* Registers an SMS channel for the contact.
2096+
* @param msisdn The MSISDN, including country code.
2097+
* @param options Registration options.
2098+
* @param success Success callback.
2099+
* @param error Error callback.
2100+
*/
2101+
registerSMS(
2102+
msisdn: string,
2103+
options: SmsRegistrationOptions,
2104+
success?: () => void,
2105+
error?: (err: string) => void
2106+
): void
20442107
}
20452108
/**
20462109
* Airship channel.

cordova-airship/www/Airship.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,16 @@ airship.contact.editSubscriptionLists = function () {
357357
return new ScopedSubscriptionListEditor('Airship.contact.editSubscriptionLists', 'contact#editSubscriptionLists')
358358
}
359359

360+
airship.contact.registerEmail = function (email, options, success, failure) {
361+
argscheck.checkArgs('soFF', 'Airship.contact.registerEmail', arguments)
362+
perform("contact#registerEmail", { address: email, options: options }, success, failure)
363+
}
364+
365+
airship.contact.registerSMS = function (msisdn, options, success, failure) {
366+
argscheck.checkArgs('soFF', 'Airship.contact.registerSMS', arguments)
367+
perform("contact#registerSMS", { msisdn: msisdn, options: options }, success, failure)
368+
}
369+
360370
// Push
361371

362372
airship.push.enableUserNotifications = function (success, failure) {

0 commit comments

Comments
 (0)