diff --git a/ios/RNFirebase/functions/RNFirebaseFunctions.m b/ios/RNFirebase/functions/RNFirebaseFunctions.m index 2c84e239..2fe4e9d2 100644 --- a/ios/RNFirebase/functions/RNFirebaseFunctions.m +++ b/ios/RNFirebase/functions/RNFirebaseFunctions.m @@ -2,20 +2,106 @@ #if __has_include() #import +#import +#import @implementation RNFirebaseFunctions RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD(httpsCallable: - (NSString *)name + (NSString *) name wrapper: - (NSDictionary *)wrapper + (NSDictionary *) wrapper resolver: (RCTPromiseResolveBlock) resolve rejecter: (RCTPromiseRejectBlock) reject ) { - // TODO + FIRFunctions *functions = [FIRFunctions functions]; + + [[functions HTTPSCallableWithName:name] callWithObject:[wrapper valueForKey:@"data"] completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { + if (error) { + NSObject *details = [NSNull null]; + NSString *message = error.localizedDescription; + if (error.domain == FIRFunctionsErrorDomain) { + details = error.userInfo[FIRFunctionsErrorDetailsKey]; + if (details == nil) { + details = [NSNull null]; + } + } + + resolve(@{ + @"__error": @true, + @"code": [self getErrorCodeName:error], + @"message": message, + @"details": details + }); + } else { + resolve(@{ @"data": [result data] }); + } + }]; + +} + +- (NSString *)getErrorCodeName:(NSError *)error { + NSString *code = @"UNKNOWN"; + switch (error.code) { + case FIRFunctionsErrorCodeOK: + code = @"OK"; + break; + case FIRFunctionsErrorCodeCancelled: + code = @"CANCELLED"; + break; + case FIRFunctionsErrorCodeUnknown: + code = @"UNKNOWN"; + break; + case FIRFunctionsErrorCodeInvalidArgument: + code = @"INVALID_ARGUMENT"; + break; + case FIRFunctionsErrorCodeDeadlineExceeded: + code = @"DEADLINE_EXCEEDED"; + break; + case FIRFunctionsErrorCodeNotFound: + code = @"NOT_FOUND"; + break; + case FIRFunctionsErrorCodeAlreadyExists: + code = @"ALREADY_EXISTS"; + break; + case FIRFunctionsErrorCodePermissionDenied: + code = @"PERMISSION_DENIED"; + break; + case FIRFunctionsErrorCodeResourceExhausted: + code = @"RESOURCE_EXHAUSTED"; + break; + case FIRFunctionsErrorCodeFailedPrecondition: + code = @"FAILED_PRECONDITION"; + break; + case FIRFunctionsErrorCodeAborted: + code = @"ABORTED"; + break; + case FIRFunctionsErrorCodeOutOfRange: + code = @"OUT_OF_RANGE"; + break; + case FIRFunctionsErrorCodeUnimplemented: + code = @"UNIMPLEMENTED"; + break; + case FIRFunctionsErrorCodeInternal: + code = @"INTERNAL"; + break; + case FIRFunctionsErrorCodeUnavailable: + code = @"UNAVAILABLE"; + break; + case FIRFunctionsErrorCodeDataLoss: + code = @"DATA_LOSS"; + break; + case FIRFunctionsErrorCodeUnauthenticated: + code = @"UNAUTHENTICATED"; + break; + default: + break; + } + + return code; }