diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java index 2851480bfb1a..10c62e55be1c 100644 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java +++ b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java @@ -32,8 +32,9 @@ public void onMethodCall(MethodCall call, final Result result) { switch (call.method) { case "CloudFunctions#call": String functionName = call.argument("functionName"); + String region = call.argument("region"); HttpsCallableReference httpsCallableReference = - FirebaseFunctions.getInstance().getHttpsCallable(functionName); + FirebaseFunctions.getInstance(region).getHttpsCallable(functionName); Map parameters = call.argument("parameters"); httpsCallableReference .call(parameters) diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m index 701c5efb3466..1aa5831682e5 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m @@ -34,37 +34,37 @@ - (instancetype)init { - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { if ([@"CloudFunctions#call" isEqualToString:call.method]) { NSString *functionName = call.arguments[@"functionName"]; + NSString *region = call.arguments[@"region"]; NSObject *parameters = call.arguments[@"parameters"]; - [[FIRFunctions functions] - callFunction:functionName - withObject:parameters - completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { - if (error) { - FlutterError *flutterError; - if (error.domain == FIRFunctionsErrorDomain) { - NSDictionary *details = [NSMutableDictionary dictionary]; - [details setValue:[self mapFunctionsErrorCodes:error.code] forKey:@"code"]; - if (error.localizedDescription != nil) { - [details setValue:error.localizedDescription forKey:@"message"]; + [[[FIRFunctions functionsForRegion:region] HTTPSCallableWithName:functionName] + callWithObject:parameters + completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { + if (error) { + FlutterError *flutterError; + if (error.domain == FIRFunctionsErrorDomain) { + NSDictionary *details = [NSMutableDictionary dictionary]; + [details setValue:[self mapFunctionsErrorCodes:error.code] forKey:@"code"]; + if (error.localizedDescription != nil) { + [details setValue:error.localizedDescription forKey:@"message"]; + } + if (error.userInfo[FIRFunctionsErrorDetailsKey] != nil) { + [details setValue:error.userInfo[FIRFunctionsErrorDetailsKey] + forKey:@"details"]; + } + flutterError = + [FlutterError errorWithCode:@"functionsError" + message:@"Firebase function failed with exception." + details:details]; + } else { + flutterError = [FlutterError errorWithCode:nil + message:error.localizedDescription + details:nil]; } - if (error.userInfo[FIRFunctionsErrorDetailsKey] != nil) { - [details setValue:error.userInfo[FIRFunctionsErrorDetailsKey] forKey:@"details"]; - } - - flutterError = - [FlutterError errorWithCode:@"functionsError" - message:@"Firebase function failed with exception." - details:details]; + result(flutterError); } else { - flutterError = [FlutterError errorWithCode:nil - message:error.localizedDescription - details:nil]; + result(callableResult.data); } - result(flutterError); - } else { - result(callableResult.data); - } - }]; + }]; } else { result(FlutterMethodNotImplemented); } diff --git a/packages/cloud_functions/lib/cloud_functions.dart b/packages/cloud_functions/lib/cloud_functions.dart index 59c8e4501cd1..9d131da90e2b 100644 --- a/packages/cloud_functions/lib/cloud_functions.dart +++ b/packages/cloud_functions/lib/cloud_functions.dart @@ -29,9 +29,12 @@ class CloudFunctions { /// Executes this Callable HTTPS trigger asynchronously. /// /// @param functionName The name of the callable function being triggered. + /// @param region The region where the callable function being triggered. Default: us-central1. /// @param parameters Parameters to be passed to the callable function. Future call( - {@required String functionName, Map parameters}) async { + {@required String functionName, + String region = 'us-central1', + Map parameters}) async { try { final dynamic response = // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. @@ -39,6 +42,7 @@ class CloudFunctions { // ignore: strong_mode_implicit_dynamic_method await channel.invokeMethod('CloudFunctions#call', { 'functionName': functionName, + 'region': region, 'parameters': parameters, }); return response; diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart index 51bf3f0a1edc..f0b49bbccad9 100644 --- a/packages/cloud_functions/test/cloud_functions_test.dart +++ b/packages/cloud_functions/test/cloud_functions_test.dart @@ -32,6 +32,8 @@ void main() { .call(functionName: 'qux', parameters: { 'quux': 'quuz', }); + await CloudFunctions.instance + .call(functionName: 'buz', region: 'us-east1'); expect( log, [ @@ -39,6 +41,7 @@ void main() { 'CloudFunctions#call', arguments: { 'functionName': 'baz', + 'region': 'us-central1', 'parameters': null, }, ), @@ -46,11 +49,20 @@ void main() { 'CloudFunctions#call', arguments: { 'functionName': 'qux', + 'region': 'us-central1', 'parameters': { 'quux': 'quuz', }, }, ), + isMethodCall( + 'CloudFunctions#call', + arguments: { + 'functionName': 'buz', + 'region': 'us-east1', + 'parameters': null, + }, + ), ], ); });