Skip to content

Commit c8937bd

Browse files
authored
PSG-5810 (#95)
* tests are updated for token store * inline docs updated * language added to func - otp and magiclink * tests updated * tests updated * ios code updated * Comments added for social class * Comments added for social class * Comments added for social class * current user updated * Passageswift updated
1 parent 0ab284d commit c8937bd

14 files changed

+104
-60
lines changed

android/src/main/kotlin/id/passage/passage_flutter/PassageFlutter.kt

+12-6
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,10 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
103103

104104
fun newRegisterOneTimePasscode(call: MethodCall, result: MethodChannel.Result) {
105105
val identifier = call.argument<String>("identifier") ?: return invalidArgumentError(result)
106+
val language = call.argument<String?>("language")
106107
CoroutineScope(Dispatchers.IO).launch {
107108
try {
108-
val otpId = passage.oneTimePasscode.register(identifier).otpId
109+
val otpId = passage.oneTimePasscode.register(identifier, language).otpId
109110
result.success(otpId)
110111
} catch (e: Exception) {
111112
result.error(PassageFlutterError.OTP_ERROR.name, e.message, e.toString())
@@ -115,9 +116,10 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
115116

116117
fun newLoginOneTimePasscode(call: MethodCall, result: MethodChannel.Result) {
117118
val identifier = call.argument<String>("identifier") ?: return invalidArgumentError(result)
119+
val language = call.argument<String?>("language")
118120
CoroutineScope(Dispatchers.IO).launch {
119121
try {
120-
val otpId = passage.oneTimePasscode.login(identifier).otpId
122+
val otpId = passage.oneTimePasscode.login(identifier, language).otpId
121123
result.success(otpId)
122124
} catch (e: Exception) {
123125
result.error(PassageFlutterError.OTP_ERROR.name, e.message, e.toString())
@@ -151,9 +153,10 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
151153

152154
fun newRegisterMagicLink(call: MethodCall, result: MethodChannel.Result) {
153155
val identifier = call.argument<String>("identifier") ?: return invalidArgumentError(result)
156+
val language = call.argument<String?>("language")
154157
CoroutineScope(Dispatchers.IO).launch {
155158
try {
156-
val magicLinkId = passage.magicLink.register(identifier).id
159+
val magicLinkId = passage.magicLink.register(identifier, language).id
157160
result.success(magicLinkId)
158161
} catch (e: Exception) {
159162
result.error(PassageFlutterError.MAGIC_LINK_ERROR.name, e.message, e.toString())
@@ -163,9 +166,10 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
163166

164167
fun newLoginMagicLink(call: MethodCall, result: MethodChannel.Result) {
165168
val identifier = call.argument<String>("identifier") ?: return invalidArgumentError(result)
169+
val language = call.argument<String?>("language")
166170
CoroutineScope(Dispatchers.IO).launch {
167171
try {
168-
val magicLinkId = passage.magicLink.login(identifier).id
172+
val magicLinkId = passage.magicLink.login(identifier, language).id
169173
result.success(magicLinkId)
170174
} catch (e: Exception) {
171175
result.error(PassageFlutterError.MAGIC_LINK_ERROR.name, e.message, e.toString())
@@ -419,12 +423,13 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
419423

420424
fun changeEmail(call: MethodCall, result: MethodChannel.Result) {
421425
val newEmail = call.argument<String>("newEmail") ?: return invalidArgumentError(result)
426+
val language = call.argument<String?>("language")
422427
CoroutineScope(Dispatchers.IO).launch {
423428
try {
424429
val user = passage.currentUser.userInfo() ?: throw PassageUserUnauthorizedException(
425430
"User is not authorized."
426431
)
427-
val magicLinkId = passage.currentUser.changeEmail(newEmail)?.id
432+
val magicLinkId = passage.currentUser.changeEmail(newEmail, language)?.id
428433
result.success(magicLinkId)
429434
} catch (e: Exception) {
430435
val error = when (e) {
@@ -441,10 +446,11 @@ internal class PassageFlutter(private val activity: Activity, appId: String) {
441446

442447
fun changePhone(call: MethodCall, result: MethodChannel.Result) {
443448
val newPhone = call.argument<String>("newPhone") ?: return invalidArgumentError(result)
449+
val language = call.argument<String?>("language")
444450
CoroutineScope(Dispatchers.IO).launch {
445451
try {
446452
val user = passage.currentUser.userInfo()
447-
val magicLinkId = passage.currentUser.changePhone(newPhone)?.id
453+
val magicLinkId = passage.currentUser.changePhone(newPhone, language)?.id
448454
result.success(magicLinkId)
449455
} catch (e: Exception) {
450456
val error = when (e) {

integrationtestapp/integration_test/change_user_info_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ void main() {
4747
await loginWithMagicLink();
4848
final date = DateTime.now().millisecondsSinceEpoch;
4949
final identifier = 'authentigator+$date@passage.id';
50-
final response = await passage.currentUser.changeEmail(identifier);
50+
final response = await passage.currentUser.changeEmail(identifier, language: "es");
5151
expect(response, isNotNull);
5252
} catch (e) {
5353
fail('Test failed due to unexpected exception: $e');

integrationtestapp/integration_test/magic_link_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ void main() {
109109
test('testActivateLoginMagicLink', () async {
110110
try {
111111
await passage.magiclink.login(
112-
IntegrationTestConfig.existingUserEmailMagicLink);
112+
IntegrationTestConfig.existingUserEmailMagicLink, language:"es");
113113
await Future.delayed(const Duration(
114114
milliseconds: IntegrationTestConfig.waitTimeMilliseconds));
115115
final magicLinkStr = await MailosaurAPIClient.getMostRecentMagicLink();

integrationtestapp/integration_test/otp_test.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void main() {
7171
final identifier =
7272
"authentigator+$date@${MailosaurAPIClient.serverId}.mailosaur.net";
7373
try {
74-
final oneTimePasscode = (await passage.oneTimePasscode.register(identifier));
74+
final oneTimePasscode = (await passage.oneTimePasscode.register(identifier, language: 'es'));
7575
await Future.delayed(const Duration(
7676
milliseconds: IntegrationTestConfig.waitTimeMilliseconds));
7777
final otp = await MailosaurAPIClient.getMostRecentOneTimePasscode();

integrationtestapp/ios/Podfile.lock

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ PODS:
33
- Flutter (1.0.0)
44
- integration_test (0.0.1):
55
- Flutter
6-
- passage_flutter (1.0.0):
6+
- passage_flutter (1.1.1):
77
- Flutter
88
- PassageSwift (= 1.0.2)
99
- PassageSwift (1.0.2):
@@ -30,8 +30,8 @@ EXTERNAL SOURCES:
3030
SPEC CHECKSUMS:
3131
AnyCodable-FlightSchool: 9d48ed579c898378e189bb0a89faebf9eb8a46a7
3232
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
33-
integration_test: ce0a3ffa1de96d1a89ca0ac26fca7ea18a749ef4
34-
passage_flutter: 60c06e8730750f0516d86fc14c4fb25087b827db
33+
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
34+
passage_flutter: 46098def9413ab67515fd61d485a878ea1550dda
3535
PassageSwift: 0874d7abdd8e57e92c1ae6ead0d59c6024f8867b
3636

3737
PODFILE CHECKSUM: 6a26cacf19c7fcde87d9c59e8f24986138e82f3b

integrationtestapp/pubspec.lock

+1-1
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ packages:
405405
path: ".."
406406
relative: true
407407
source: path
408-
version: "1.1.0"
408+
version: "1.1.1"
409409
path:
410410
dependency: transitive
411411
description:

ios/Classes/PassageFlutter.swift

+14-8
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,10 @@ internal class PassageFlutter {
8585
result(error)
8686
return
8787
}
88+
let language = (arguments as? [String: Any])?["language"] as? String
8889
Task {
8990
do {
90-
let otp = try await passage.oneTimePasscode.register(identifier: identifier)
91+
let otp = try await passage.oneTimePasscode.register(identifier: identifier, language: language)
9192
result(otp.otpId)
9293
} catch {
9394
let error = FlutterError(
@@ -106,9 +107,10 @@ internal class PassageFlutter {
106107
result(error)
107108
return
108109
}
110+
let language = (arguments as? [String: Any])?["language"] as? String
109111
Task {
110112
do {
111-
let otp = try await passage.oneTimePasscode.login(identifier: identifier)
113+
let otp = try await passage.oneTimePasscode.login(identifier: identifier, language: language)
112114
result(otp.otpId)
113115
} catch {
114116
let error = FlutterError(
@@ -154,9 +156,10 @@ internal class PassageFlutter {
154156
result(error)
155157
return
156158
}
159+
let language = (arguments as? [String: Any])?["language"] as? String
157160
Task {
158161
do {
159-
let ml = try await passage.magicLink.register(identifier: identifier)
162+
let ml = try await passage.magicLink.register(identifier: identifier, language: language)
160163
result(ml.id)
161164
} catch {
162165
let error = FlutterError(
@@ -175,9 +178,10 @@ internal class PassageFlutter {
175178
result(error)
176179
return
177180
}
181+
let language = (arguments as? [String: Any])?["language"] as? String
178182
Task {
179183
do {
180-
let ml = try await passage.magicLink.login(identifier: identifier)
184+
let ml = try await passage.magicLink.login(identifier: identifier, language: language)
181185
result(ml.id)
182186
} catch {
183187
let error = FlutterError(
@@ -421,14 +425,15 @@ internal class PassageFlutter {
421425
}
422426

423427
internal func changeEmail(arguments: Any?, result: @escaping FlutterResult) {
424-
guard let newEmail = (arguments as? [String: String])?["newEmail"] else {
428+
guard let newEmail = (arguments as? [String: Any])?["newEmail"] as? String else {
425429
let error = PassageFlutterError.INVALID_ARGUMENT.defaultFlutterError
426430
result(error)
427431
return
428432
}
433+
let language = (arguments as? [String: Any])?["language"] as? String
429434
Task {
430435
do {
431-
let magicLink = try await passage.currentUser.changeEmail(newEmail: newEmail)
436+
let magicLink = try await passage.currentUser.changeEmail(newEmail: newEmail, language: language)
432437
result(magicLink.id)
433438
} catch let error as CurrentUserError {
434439
result(handleCurrentUserError(error))
@@ -444,14 +449,15 @@ internal class PassageFlutter {
444449
}
445450

446451
internal func changePhone(arguments: Any?, result: @escaping FlutterResult) {
447-
guard let newPhone = (arguments as? [String: String])?["newPhone"] else {
452+
guard let newPhone = (arguments as? [String: Any])?["newPhone"] as? String else {
448453
let error = PassageFlutterError.INVALID_ARGUMENT.defaultFlutterError
449454
result(error)
450455
return
451456
}
457+
let language = (arguments as? [String: Any])?["language"] as? String
452458
Task {
453459
do {
454-
let magicLink = try await passage.currentUser.changePhone(newPhone: newPhone)
460+
let magicLink = try await passage.currentUser.changePhone(newPhone: newPhone, language: language)
455461
result(magicLink.id)
456462
} catch let error as CurrentUserError {
457463
result(handleCurrentUserError(error))

lib/passage_current_user.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,29 +22,31 @@ class PassageCurrentUser {
2222
///
2323
/// Parameters:
2424
/// - `newEmail`: The user's new email.
25+
/// - `language`: The language code for the email change.
2526
///
2627
/// Returns:
2728
/// A `Future<MagicLink>` representing the magic link
2829
///
2930
/// Throws:
3031
/// `PassageError`
3132
Future<MagicLink> changeEmail(String newEmail, {String? language}) {
32-
return PassageFlutterPlatform.instance.changeEmail(newEmail);
33+
return PassageFlutterPlatform.instance.changeEmail(newEmail, language);
3334
}
3435

3536
/// Initiates a phone number change for the authenticated user. A phone change requires verification,
3637
/// so an email will be sent to the user which they must verify before the phone change takes effect.
3738
///
3839
/// Parameters:
3940
/// - `newPhone`: The user's new phone number.
41+
/// - The language code for the phone change.
4042
///
4143
/// Returns:
4244
/// A `Future<MagicLink>` representing the magic link
4345
///
4446
/// Throws:
4547
/// `PassageError`
4648
Future<MagicLink> changePhone(String newPhone, {String? language}) {
47-
return PassageFlutterPlatform.instance.changePhone(newPhone);
49+
return PassageFlutterPlatform.instance.changePhone(newPhone, language);
4850
}
4951

5052
/// Attempts to create and register a new passkey for the authenticated user.

lib/passage_flutter_platform/passage_flutter_method_channel.dart

+12-12
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,21 @@ class MethodChannelPassageFlutter extends PassageFlutterPlatform {
6363
// OTP METHODS
6464

6565
@override
66-
Future<String> newRegisterOneTimePasscode(String identifier) async {
66+
Future<String> newRegisterOneTimePasscode(String identifier, String? language) async {
6767
try {
6868
final result = await methodChannel.invokeMethod<String>(
69-
'newRegisterOneTimePasscode', {'identifier': identifier});
69+
'newRegisterOneTimePasscode', {'identifier': identifier, 'language': language});
7070
return result!;
7171
} catch (e) {
7272
throw PassageError.fromObject(object: e);
7373
}
7474
}
7575

7676
@override
77-
Future<String> newLoginOneTimePasscode(String identifier) async {
77+
Future<String> newLoginOneTimePasscode(String identifier, String? language) async {
7878
try {
7979
final result = await methodChannel.invokeMethod<String>(
80-
'newLoginOneTimePasscode', {'identifier': identifier});
80+
'newLoginOneTimePasscode', {'identifier': identifier, 'language': language});
8181
return result!;
8282
} catch (e) {
8383
throw PassageError.fromObject(object: e);
@@ -98,21 +98,21 @@ class MethodChannelPassageFlutter extends PassageFlutterPlatform {
9898
// MAGIC LINK METHODS
9999

100100
@override
101-
Future<String> newRegisterMagicLink(String identifier) async {
101+
Future<String> newRegisterMagicLink(String identifier, String? language) async {
102102
try {
103103
final result = await methodChannel.invokeMethod<String>(
104-
'newRegisterMagicLink', {'identifier': identifier});
104+
'newRegisterMagicLink', {'identifier': identifier, 'language': language});
105105
return result!;
106106
} catch (e) {
107107
throw PassageError.fromObject(object: e);
108108
}
109109
}
110110

111111
@override
112-
Future<String> newLoginMagicLink(String identifier) async {
112+
Future<String> newLoginMagicLink(String identifier, String? language) async {
113113
try {
114114
final result = await methodChannel.invokeMethod<String>(
115-
'newLoginMagicLink', {'identifier': identifier});
115+
'newLoginMagicLink', {'identifier': identifier, 'language': language});
116116
return result!;
117117
} catch (e) {
118118
throw PassageError.fromObject(object: e);
@@ -316,21 +316,21 @@ class MethodChannelPassageFlutter extends PassageFlutterPlatform {
316316
}
317317

318318
@override
319-
Future<MagicLink> changeEmail(String newEmail) async {
319+
Future<MagicLink> changeEmail(String newEmail, String? language) async {
320320
try {
321321
final magicLinkId = await methodChannel
322-
.invokeMethod<String>('changeEmail', {'newEmail': newEmail});
322+
.invokeMethod<String>('changeEmail', {'newEmail': newEmail, 'language': language});
323323
return MagicLink(magicLinkId!);
324324
} catch (e) {
325325
throw PassageError.fromObject(object: e);
326326
}
327327
}
328328

329329
@override
330-
Future<MagicLink> changePhone(String newPhone) async {
330+
Future<MagicLink> changePhone(String newPhone, String? language) async {
331331
try {
332332
final magicLinkId = await methodChannel
333-
.invokeMethod<String>('changePhone', {'newPhone': newPhone});
333+
.invokeMethod<String>('changePhone', {'newPhone': newPhone, 'language': language});
334334
return MagicLink(magicLinkId!);
335335
} catch (e) {
336336
throw PassageError.fromObject(object: e);

lib/passage_flutter_platform/passage_flutter_platform_interface.dart

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ abstract class PassageFlutterPlatform extends PlatformInterface {
5454

5555
// OTP METHODS
5656

57-
Future<String> newRegisterOneTimePasscode(String identifier) {
57+
Future<String> newRegisterOneTimePasscode(String identifier, String? language) {
5858
throw UnimplementedError(
5959
'newRegisterOneTimePasscode() has not been implemented.');
6060
}
6161

62-
Future<String> newLoginOneTimePasscode(String identifier) {
62+
Future<String> newLoginOneTimePasscode(String identifier, String? language) {
6363
throw UnimplementedError(
6464
'newLoginOneTimePasscode() has not been implemented.');
6565
}
@@ -71,12 +71,12 @@ abstract class PassageFlutterPlatform extends PlatformInterface {
7171

7272
// MAGIC LINK METHODS
7373

74-
Future<String> newRegisterMagicLink(String identifier) {
74+
Future<String> newRegisterMagicLink(String identifier, String? language) {
7575
throw UnimplementedError(
7676
'newRegisterMagicLink() has not been implemented.');
7777
}
7878

79-
Future<String> newLoginMagicLink(String identifier) {
79+
Future<String> newLoginMagicLink(String identifier, String? language) {
8080
throw UnimplementedError('newLoginMagicLink() has not been implemented.');
8181
}
8282

@@ -153,11 +153,11 @@ abstract class PassageFlutterPlatform extends PlatformInterface {
153153
throw UnimplementedError('editPasskeyName() has not been implemented.');
154154
}
155155

156-
Future<MagicLink> changeEmail(String newEmail) {
156+
Future<MagicLink> changeEmail(String newEmail, String? language) {
157157
throw UnimplementedError('changeEmail() has not been implemented.');
158158
}
159159

160-
Future<MagicLink> changePhone(String newPhone) {
160+
Future<MagicLink> changePhone(String newPhone, String? language) {
161161
throw UnimplementedError('changePhone() has not been implemented.');
162162
}
163163

0 commit comments

Comments
 (0)