Skip to content
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
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,74 @@ class AuthsignalInAppModule(private val reactContext: ReactApplicationContext) :
}
}

@ReactMethod
fun createPin(pin: String, username: String, token: String?, promise: Promise) {
launch(promise) {
val response = it.createPin(
pin = pin,
username = username,
token = token,
)

if (response.error != null) {
val errorCode = response.errorCode ?: defaultError

promise.reject(errorCode, response.error)
} else {
promise.resolve(response.data)
}
}
}

@ReactMethod
fun verifyPin(pin: String, username: String, action: String?, promise: Promise) {
launch(promise) {
val response = it.verifyPin(
pin = pin,
username = username,
action = action,
)

if (response.error != null) {
val errorCode = response.errorCode ?: defaultError

promise.reject(errorCode, response.error)
} else {
promise.resolve(response.data)
}
}
}

@ReactMethod
fun deletePin(username: String, promise: Promise) {
launch(promise) {
val response = it.deletePin(username = username)

if (response.error != null) {
val errorCode = response.errorCode ?: defaultError

promise.reject(errorCode, response.error)
} else {
promise.resolve(response.data)
}
}
}

@ReactMethod
fun getAllUsernames(promise: Promise) {
launch(promise) {
val response = it.getAllUsernames()

if (response.error != null) {
val errorCode = response.errorCode ?: defaultError

promise.reject(errorCode, response.error)
} else {
promise.resolve(response.data)
}
}
}

private fun launch(promise: Promise, fn: suspend (client: AuthsignalInApp) -> Unit) {
coroutineScope.launch {
authsignal?.let {
Expand Down
12 changes: 8 additions & 4 deletions ios/Authsignal.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

/* Begin PBXFileReference section */
134814201AA4EA6300B7C361 /* libAuthsignal.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAuthsignal.a; sourceTree = BUILT_PRODUCTS_DIR; };
D870279B2ECD0BA40097560C /* AuthsignalInAppModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalInAppModule.m; sourceTree = "<group>"; };
D870279C2ECD0BA40097560C /* AuthsignalInAppModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalInAppModule.swift; sourceTree = "<group>"; };
D870279D2ECD0BA40097560C /* AuthsignalQRModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalQRModule.m; sourceTree = "<group>"; };
D870279E2ECD0BA40097560C /* AuthsignalQRModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalQRModule.swift; sourceTree = "<group>"; };
D8AE39E42C729A88003759EB /* AuthsignalEmailModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalEmailModule.m; sourceTree = "<group>"; };
D8AE39E52C729A88003759EB /* AuthsignalSMSModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalSMSModule.swift; sourceTree = "<group>"; };
D8AE39E62C729A88003759EB /* AuthsignalTOTPModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalTOTPModule.m; sourceTree = "<group>"; };
Expand All @@ -33,8 +37,6 @@
D8EC5CD52A4D1EE00085B442 /* AuthsignalPushModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalPushModule.m; sourceTree = "<group>"; };
D8EC5CD62A4D1EE00085B442 /* AuthsignalPasskeyModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalPasskeyModule.m; sourceTree = "<group>"; };
D8EC5CD72A4D1EE90085B442 /* Authsignal-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Authsignal-Bridging-Header.h"; sourceTree = "<group>"; };
DDDCE5EE2DDD8E5B0095B3F2 /* AuthsignalDeviceModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalDeviceModule.m; sourceTree = "<group>"; };
DDDCE5EF2DDD8E5B0095B3F2 /* AuthsignalDeviceModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalDeviceModule.swift; sourceTree = "<group>"; };
DDDD1001AAAA1111BBBB2222 /* AuthsignalWhatsappModule.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthsignalWhatsappModule.m; sourceTree = "<group>"; };
DDDD1002AAAA1111BBBB2222 /* AuthsignalWhatsappModule.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthsignalWhatsappModule.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
Expand Down Expand Up @@ -74,10 +76,12 @@
D8EC5CD32A4D1EE00085B442 /* AuthsignalPasskeyModule.swift */,
D8EC5CD52A4D1EE00085B442 /* AuthsignalPushModule.m */,
D8EC5CD42A4D1EE00085B442 /* AuthsignalPushModule.swift */,
DDDCE5EE2DDD8E5B0095B3F2 /* AuthsignalDeviceModule.m */,
DDDCE5EF2DDD8E5B0095B3F2 /* AuthsignalDeviceModule.swift */,
DDDD1001AAAA1111BBBB2222 /* AuthsignalWhatsappModule.m */,
DDDD1002AAAA1111BBBB2222 /* AuthsignalWhatsappModule.swift */,
D870279B2ECD0BA40097560C /* AuthsignalInAppModule.m */,
D870279C2ECD0BA40097560C /* AuthsignalInAppModule.swift */,
D870279D2ECD0BA40097560C /* AuthsignalQRModule.m */,
D870279E2ECD0BA40097560C /* AuthsignalQRModule.swift */,
134814211AA4EA7D00B7C361 /* Products */,
);
sourceTree = "<group>";
Expand Down
19 changes: 19 additions & 0 deletions ios/AuthsignalInAppModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,23 @@ @interface RCT_EXTERN_MODULE(AuthsignalInAppModule, NSObject)
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(createPin:(NSString)pin
withUsername:(NSString)username
withToken:(NSString)token
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(verifyPin:(NSString)pin
withUsername:(NSString)username
withAction:(NSString)action
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(deletePin:(NSString)username
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(getAllUsernames:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

@end
105 changes: 105 additions & 0 deletions ios/AuthsignalInAppModule.swift
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,111 @@ class AuthsignalInAppModule: NSObject {
}
}
}

@objc func createPin(
_ pin: NSString,
withUsername username: NSString,
withToken token: NSString?,
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) -> Void {
guard let authsignal = authsignal else {
resolve(nil)
return
}

let pinStr = pin as String
let usernameStr = username as String
let tokenStr = token as String?

Task.init {
let response = await authsignal.createPin(
pin: pinStr,
username: usernameStr,
token: tokenStr
)

if let error = response.error {
reject(response.errorCode ?? "unexpected_error", error, nil)
} else {
resolve(response.data)
}
}
}

@objc func verifyPin(
_ pin: NSString,
withUsername username: NSString,
withAction action: NSString?,
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) -> Void {
guard let authsignal = authsignal else {
resolve(nil)
return
}

let pinStr = pin as String
let usernameStr = username as String
let actionStr = action as String?

Task.init {
let response = await authsignal.verifyPin(
pin: pinStr,
username: usernameStr,
action: actionStr
)

if let error = response.error {
reject(response.errorCode ?? "unexpected_error", error, nil)
} else {
resolve(response.data)
}
}
}

@objc func deletePin(
_ username: NSString,
resolver resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) -> Void {
guard let authsignal = authsignal else {
resolve(nil)
return
}

let usernameStr = username as String

Task.init {
let response = await authsignal.deletePin(username: usernameStr)

if let error = response.error {
reject(response.errorCode ?? "unexpected_error", error, nil)
} else {
resolve(response.data)
}
}
}

@objc func getAllUsernames(
_ resolve: @escaping RCTPromiseResolveBlock,
rejecter reject: @escaping RCTPromiseRejectBlock
) -> Void {
guard let authsignal = authsignal else {
resolve(nil)
return
}

Task.init {
let response = await authsignal.getAllUsernames()

if let error = response.error {
reject(response.errorCode ?? "unexpected_error", error, nil)
} else {
resolve(response.data)
}
}
}

func getKeychainAccess(value: String?) -> KeychainAccess {
switch value {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "react-native-authsignal",
"version": "2.2.0",
"version": "2.2.1",
"description": "The official Authsignal React Native library.",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down
2 changes: 1 addition & 1 deletion react-native-authsignal.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
s.source_files = "ios/**/*.{h,m,mm,swift}"

s.dependency "React-Core"
s.dependency 'Authsignal', '2.2.1'
s.dependency 'Authsignal', '2.2.2'

# Don't install the dependencies when we run `pod install` in the old architecture.
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
Expand Down
77 changes: 75 additions & 2 deletions src/inapp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@ import { handleErrorCodes, LINKING_ERROR } from './error';
import type {
AuthsignalResponse,
AppCredential,
InAppVerifyRequest,
InAppVerifyInput,
InAppVerifyResponse,
InAppAddCredentialInput,
InAppGetCredentialInput,
InAppRemoveCredentialInput,
CreatePinInput,
VerifyPinInput,
VerifyPinResponse,
} from './types';

interface ConstructorArgs {
Expand Down Expand Up @@ -106,7 +109,7 @@ export class AuthsignalInApp {
}
}

async verify({ action, username }: InAppVerifyRequest = {}): Promise<
async verify({ action, username }: InAppVerifyInput = {}): Promise<
AuthsignalResponse<InAppVerifyResponse>
> {
await this.ensureModuleIsInitialized();
Expand All @@ -124,6 +127,76 @@ export class AuthsignalInApp {
}
}

async createPin({
pin,
username,
token,
}: CreatePinInput): Promise<AuthsignalResponse<AppCredential>> {
await this.ensureModuleIsInitialized();

try {
const data = await AuthsignalInAppModule.createPin(pin, username, token);
return { data };
} catch (ex) {
if (this.enableLogging) {
console.log(ex);
}

return handleErrorCodes(ex);
}
}

async verifyPin({
pin,
username,
action,
}: VerifyPinInput): Promise<AuthsignalResponse<VerifyPinResponse>> {
await this.ensureModuleIsInitialized();

try {
const data = await AuthsignalInAppModule.verifyPin(pin, username, action);
return { data };
} catch (ex) {
if (this.enableLogging) {
console.log(ex);
}

return handleErrorCodes(ex);
}
}

async deletePin({
username,
}: VerifyPinInput): Promise<AuthsignalResponse<boolean>> {
await this.ensureModuleIsInitialized();

try {
const data = await AuthsignalInAppModule.deletePin(username);
return { data };
} catch (ex) {
if (this.enableLogging) {
console.log(ex);
}

return handleErrorCodes(ex);
}
}

async getAllUsernames(): Promise<AuthsignalResponse<string[]>> {
await this.ensureModuleIsInitialized();

try {
const data = await AuthsignalInAppModule.getAllUsernames();
return { data };
} catch (ex) {
if (this.enableLogging) {
console.log(ex);
}

return handleErrorCodes(ex);
}
}

private async ensureModuleIsInitialized() {
if (initialized) {
return;
Expand Down
Loading
Loading