flatten dynamicLinkInfo to the top-level, move the mandatory keys validation to the javascript from the native modules and some minor fixes
This commit is contained in:
parent
adafa45380
commit
fbdc733d53
@ -37,7 +37,7 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
void onResolved(String url);
|
void onResolved(String url);
|
||||||
}
|
}
|
||||||
|
|
||||||
private interface ErrorHandler {
|
private interface ErrorHandler {
|
||||||
void onError(Exception e);
|
void onError(Exception e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void resloveLink(Intent intent, final ResolveHandler resolveHandler, final ErrorHandler errorHandler) {
|
private void resolveLink(Intent intent, final ResolveHandler resolveHandler, final ErrorHandler errorHandler) {
|
||||||
FirebaseDynamicLinks.getInstance()
|
FirebaseDynamicLinks.getInstance()
|
||||||
.getDynamicLink(intent)
|
.getDynamicLink(intent)
|
||||||
.addOnSuccessListener(new OnSuccessListener<PendingDynamicLinkData>() {
|
.addOnSuccessListener(new OnSuccessListener<PendingDynamicLinkData>() {
|
||||||
@ -83,7 +83,7 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
} else {
|
} else {
|
||||||
Activity activity = getCurrentActivity();
|
Activity activity = getCurrentActivity();
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
resloveLink(activity.getIntent(), new ResolveHandler() {
|
resolveLink(activity.getIntent(), new ResolveHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void onResolved(String url) {
|
public void onResolved(String url) {
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
@ -115,7 +115,7 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNewIntent(Intent intent) {
|
public void onNewIntent(Intent intent) {
|
||||||
resloveLink(intent, new ResolveHandler() {
|
resolveLink(intent, new ResolveHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void onResolved(String url) {
|
public void onResolved(String url) {
|
||||||
if (url != null) {
|
if (url != null) {
|
||||||
@ -150,9 +150,9 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
@ReactMethod
|
@ReactMethod
|
||||||
public void createDynamicLink(final ReadableMap parameters, final Promise promise) {
|
public void createDynamicLink(final ReadableMap parameters, final Promise promise) {
|
||||||
try {
|
try {
|
||||||
Map<String, Object> m = Utils.recursivelyDeconstructReadableMap(parameters);
|
Map<String, Object> metaData = Utils.recursivelyDeconstructReadableMap(parameters);
|
||||||
|
|
||||||
DynamicLink.Builder builder = getDynamicLinkBuilderFromMap(m);
|
DynamicLink.Builder builder = getDynamicLinkBuilderFromMap(metaData);
|
||||||
Uri link = builder.buildDynamicLink().getUri();
|
Uri link = builder.buildDynamicLink().getUri();
|
||||||
|
|
||||||
Log.d(TAG, "created dynamic link: " + link.toString());
|
Log.d(TAG, "created dynamic link: " + link.toString());
|
||||||
@ -166,11 +166,11 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
@ReactMethod
|
@ReactMethod
|
||||||
public void createShortDynamicLink(final ReadableMap parameters, final Promise promise) {
|
public void createShortDynamicLink(final ReadableMap parameters, final Promise promise) {
|
||||||
try {
|
try {
|
||||||
Map<String, Object> m = Utils.recursivelyDeconstructReadableMap(parameters);
|
Map<String, Object> metaData = Utils.recursivelyDeconstructReadableMap(parameters);
|
||||||
|
|
||||||
DynamicLink.Builder builder = getDynamicLinkBuilderFromMap(m);
|
DynamicLink.Builder builder = getDynamicLinkBuilderFromMap(metaData);
|
||||||
|
|
||||||
Task<ShortDynamicLink> shortLinkTask = getShortDynamicLinkTask(builder, m)
|
Task<ShortDynamicLink> shortLinkTask = getShortDynamicLinkTask(builder, metaData)
|
||||||
.addOnCompleteListener(new OnCompleteListener<ShortDynamicLink>() {
|
.addOnCompleteListener(new OnCompleteListener<ShortDynamicLink>() {
|
||||||
@Override
|
@Override
|
||||||
public void onComplete(@NonNull Task<ShortDynamicLink> task) {
|
public void onComplete(@NonNull Task<ShortDynamicLink> task) {
|
||||||
@ -190,26 +190,23 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private DynamicLink.Builder getDynamicLinkBuilderFromMap(final Map<String, Object> m) {
|
private DynamicLink.Builder getDynamicLinkBuilderFromMap(final Map<String, Object> metaData) {
|
||||||
DynamicLink.Builder parametersBuilder = FirebaseDynamicLinks.getInstance().createDynamicLink();
|
DynamicLink.Builder parametersBuilder = FirebaseDynamicLinks.getInstance().createDynamicLink();
|
||||||
Map<String, Object> dynamicLinkInfo = (Map<String, Object>) m.get("dynamicLinkInfo");
|
try {
|
||||||
if (dynamicLinkInfo != null) {
|
parametersBuilder.setLink(Uri.parse((String) metaData.get("link")));
|
||||||
try {
|
parametersBuilder.setDynamicLinkDomain((String) metaData.get("dynamicLinkDomain"));
|
||||||
parametersBuilder.setLink(Uri.parse((String) dynamicLinkInfo.get("link")));
|
setAndroidParameters(metaData, parametersBuilder);
|
||||||
parametersBuilder.setDynamicLinkDomain((String) dynamicLinkInfo.get("dynamicLinkDomain"));
|
setIosParameters(metaData, parametersBuilder);
|
||||||
setAndroidParameters(dynamicLinkInfo, parametersBuilder);
|
setSocialMetaTagParameters(metaData, parametersBuilder);
|
||||||
setIosParameters(dynamicLinkInfo, parametersBuilder);
|
} catch (Exception e) {
|
||||||
setSocialMetaTagParameters(dynamicLinkInfo, parametersBuilder);
|
Log.e(TAG, "error while building parameters " + e.getMessage());
|
||||||
} catch (Exception e) {
|
throw e;
|
||||||
Log.e(TAG, "error while building parameters " + e.getMessage());
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return parametersBuilder;
|
return parametersBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Task<ShortDynamicLink> getShortDynamicLinkTask(final DynamicLink.Builder builder, final Map<String, Object> m) {
|
private Task<ShortDynamicLink> getShortDynamicLinkTask(final DynamicLink.Builder builder, final Map<String, Object> metaData) {
|
||||||
Map<String, Object> suffix = (Map<String, Object>) m.get("suffix");
|
Map<String, Object> suffix = (Map<String, Object>) metaData.get("suffix");
|
||||||
if (suffix != null) {
|
if (suffix != null) {
|
||||||
String option = (String) suffix.get("option");
|
String option = (String) suffix.get("option");
|
||||||
if ("SHORT".equals(option)) {
|
if ("SHORT".equals(option)) {
|
||||||
@ -222,13 +219,9 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void setAndroidParameters(final Map<String, Object> dynamicLinkInfo, final DynamicLink.Builder parametersBuilder) {
|
private void setAndroidParameters(final Map<String, Object> metaData, final DynamicLink.Builder parametersBuilder) {
|
||||||
Map<String, Object> androidParameters = (Map<String, Object>) dynamicLinkInfo.get("androidInfo");
|
Map<String, Object> androidParameters = (Map<String, Object>) metaData.get("androidInfo");
|
||||||
if (androidParameters != null) {
|
if (androidParameters != null) {
|
||||||
if (!androidParameters.containsKey("androidPackageName")) {
|
|
||||||
throw new IllegalArgumentException("no androidPackageName was specified.");
|
|
||||||
}
|
|
||||||
|
|
||||||
DynamicLink.AndroidParameters.Builder androidParametersBuilder =
|
DynamicLink.AndroidParameters.Builder androidParametersBuilder =
|
||||||
new DynamicLink.AndroidParameters.Builder((String) androidParameters.get("androidPackageName"));
|
new DynamicLink.AndroidParameters.Builder((String) androidParameters.get("androidPackageName"));
|
||||||
|
|
||||||
@ -242,12 +235,9 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setIosParameters(final Map<String, Object> dynamicLinkInfo, final DynamicLink.Builder parametersBuilder) {
|
private void setIosParameters(final Map<String, Object> metaData, final DynamicLink.Builder parametersBuilder) {
|
||||||
Map<String, Object> iosParameters = (Map<String, Object>) dynamicLinkInfo.get("iosInfo");
|
Map<String, Object> iosParameters = (Map<String, Object>) metaData.get("iosInfo");
|
||||||
if (iosParameters != null) {
|
if (iosParameters != null) {
|
||||||
if (!iosParameters.containsKey("iosBundleId")) {
|
|
||||||
throw new IllegalArgumentException("no iosBundleId was specified.");
|
|
||||||
}
|
|
||||||
DynamicLink.IosParameters.Builder iosParametersBuilder =
|
DynamicLink.IosParameters.Builder iosParametersBuilder =
|
||||||
new DynamicLink.IosParameters.Builder((String) iosParameters.get("iosBundleId"));
|
new DynamicLink.IosParameters.Builder((String) iosParameters.get("iosBundleId"));
|
||||||
|
|
||||||
@ -273,8 +263,8 @@ public class RNFirebaseLinks extends ReactContextBaseJavaModule implements Activ
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSocialMetaTagParameters(final Map<String, Object> dynamicLinkInfo, final DynamicLink.Builder parametersBuilder) {
|
private void setSocialMetaTagParameters(final Map<String, Object> metaData, final DynamicLink.Builder parametersBuilder) {
|
||||||
Map<String, Object> socialMetaTagParameters = (Map<String, Object>) dynamicLinkInfo.get("socialMetaTagInfo");
|
Map<String, Object> socialMetaTagParameters = (Map<String, Object>) metaData.get("socialMetaTagInfo");
|
||||||
if (socialMetaTagParameters != null) {
|
if (socialMetaTagParameters != null) {
|
||||||
DynamicLink.SocialMetaTagParameters.Builder socialMetaTagParametersBuilder =
|
DynamicLink.SocialMetaTagParameters.Builder socialMetaTagParametersBuilder =
|
||||||
new DynamicLink.SocialMetaTagParameters.Builder();
|
new DynamicLink.SocialMetaTagParameters.Builder();
|
||||||
|
@ -28,18 +28,6 @@ public class RNFirebaseLinksPackage implements ReactPackage {
|
|||||||
return modules;
|
return modules;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return list of JS modules to register with the newly created catalyst instance.
|
|
||||||
* <p/>
|
|
||||||
* IMPORTANT: Note that only modules that needs to be accessible from the native code should be
|
|
||||||
* listed here. Also listing a native module here doesn't imply that the JS implementation of it
|
|
||||||
* will be automatically included in the JS bundle.
|
|
||||||
*/
|
|
||||||
// TODO: Removed in 0.47.0. Here for backwards compatability
|
|
||||||
public List<Class<? extends JavaScriptModule>> createJSModules() {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param reactContext
|
* @param reactContext
|
||||||
* @return a list of view managers that should be registered with {@link UIManagerModule}
|
* @return a list of view managers that should be registered with {@link UIManagerModule}
|
||||||
|
@ -25,8 +25,8 @@
|
|||||||
- [Cloud Messaging](/modules/cloud-messaging)
|
- [Cloud Messaging](/modules/cloud-messaging)
|
||||||
- [Crash Reporting](/modules/crash)
|
- [Crash Reporting](/modules/crash)
|
||||||
- [Database](/modules/database)
|
- [Database](/modules/database)
|
||||||
- [Firestore (Beta)](/modules/firestore)
|
|
||||||
- [Dynamic Links](/modules/links)
|
- [Dynamic Links](/modules/links)
|
||||||
|
- [Firestore (Beta)](/modules/firestore)
|
||||||
- [Remote Config](/modules/config)
|
- [Remote Config](/modules/config)
|
||||||
- [Storage](/modules/storage)
|
- [Storage](/modules/storage)
|
||||||
- [Transactions](/modules/transactions)
|
- [Transactions](/modules/transactions)
|
||||||
|
@ -11,6 +11,7 @@ RNFirebase mimics [Firebase's REST API](https://firebase.google.com/docs/dynamic
|
|||||||
The differences from the REST API are:
|
The differences from the REST API are:
|
||||||
1. The input for the methods is a javascript object instead of a JSON object.
|
1. The input for the methods is a javascript object instead of a JSON object.
|
||||||
2. The response contains the URL string only.
|
2. The response contains the URL string only.
|
||||||
|
3. There is no `dynamicLinkInfo` element. Instead, all of the elements under it were moved to be under the top-level.
|
||||||
|
|
||||||
### Methods
|
### Methods
|
||||||
|
|
||||||
@ -20,15 +21,13 @@ Creates a long dynamic link.
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
firebase.links().createDynamicLink({
|
firebase.links().createDynamicLink({
|
||||||
dynamicLinkInfo: {
|
dynamicLinkDomain: "abc123.app.goo.gl",
|
||||||
dynamicLinkDomain: "abc123.app.goo.gl",
|
link: "https://example.com?param1=foo¶m2=bar",
|
||||||
link: "https://example.com?param1=foo¶m2=bar",
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName: "com.example.android"
|
||||||
androidPackageName: "com.example.android"
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId: "com.example.ios"
|
||||||
iosBundleId: "com.example.ios"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}).
|
}).
|
||||||
then((url) => {
|
then((url) => {
|
||||||
@ -41,15 +40,14 @@ then((url) => {
|
|||||||
Creates a short dynamic link.
|
Creates a short dynamic link.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
firebase.links().createShortDynamicLink(dynamicLinkInfo: {
|
firebase.links().createShortDynamicLink({
|
||||||
dynamicLinkDomain: "abc123.app.goo.gl",
|
dynamicLinkDomain: "abc123.app.goo.gl",
|
||||||
link: "https://example.com?param1=foo¶m2=bar",
|
link: "https://example.com?param1=foo¶m2=bar",
|
||||||
androidInfo: {
|
androidInfo: {
|
||||||
androidPackageName: "com.example.android"
|
androidPackageName: "com.example.android"
|
||||||
},
|
},
|
||||||
iosInfo: {
|
iosInfo: {
|
||||||
iosBundleId: "com.example.ios"
|
iosBundleId: "com.example.ios"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}).
|
}).
|
||||||
then((url) => {
|
then((url) => {
|
||||||
@ -62,35 +60,35 @@ Only the following parameters are currently supported:
|
|||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
{
|
{
|
||||||
dynamicLinkInfo: {
|
dynamicLinkDomain: 'string',
|
||||||
dynamicLinkDomain: string,
|
link: 'string',
|
||||||
link: string,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName: 'string',
|
||||||
androidPackageName: string,
|
androidFallbackLink: 'string',
|
||||||
androidFallbackLink: string,
|
androidMinPackageVersionCode: 'string',
|
||||||
androidMinPackageVersionCode: string,
|
androidLink: 'string',
|
||||||
androidLink: string
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId: 'string',
|
||||||
iosBundleId: string,
|
iosFallbackLink: 'string',
|
||||||
iosFallbackLink: string,
|
iosCustomScheme: 'string',
|
||||||
iosCustomScheme: string,
|
iosIpadFallbackLink: 'string',
|
||||||
iosIpadFallbackLink: string,
|
iosIpadBundleId: 'string',
|
||||||
iosIpadBundleId: string,
|
iosAppStoreId: 'string',
|
||||||
iosAppStoreId: string
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle: 'string',
|
||||||
socialTitle: string,
|
socialDescription: 'string',
|
||||||
socialDescription: string,
|
socialImageLink: 'string',
|
||||||
socialImageLink: string
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
suffix: {
|
suffix: {
|
||||||
option: "SHORT" or "UNGUESSABLE"
|
option: 'string',
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
?> Please note that when using `androidInfo` or `iosInfo`, `androidPackageName` and `iosBundleId` are mandatory (respectively).
|
**please note:**
|
||||||
|
1. dynamicLinkDomain and link are mandatory fields. In addition, when using `androidInfo` or `iosInfo`, `androidPackageName` and `iosBundleId` are mandatory (respectively).
|
||||||
|
2. In oppose to the REST API, There is no `dynamicLinkInfo` element. Instead, all of the elements under it were moved to be under the top-level.
|
||||||
|
|
||||||
For more information [see reference](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)
|
For more information [see reference](https://firebase.google.com/docs/reference/dynamic-links/link-shortener)
|
||||||
|
|
||||||
|
@ -171,15 +171,14 @@ RCT_EXPORT_METHOD(createShortDynamicLink: (NSDictionary *) metadata resolver:(RC
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (FIRDynamicLinkComponents *)getDynamicLinkComponentsFromMetadata:(NSDictionary *)metadata {
|
- (FIRDynamicLinkComponents *)getDynamicLinkComponentsFromMetadata:(NSDictionary *)metadata {
|
||||||
NSDictionary* dynamicLinkInfoMetadata = metadata[@"dynamicLinkInfo"];
|
|
||||||
@try {
|
@try {
|
||||||
NSURL *link = [NSURL URLWithString:dynamicLinkInfoMetadata[@"link"]];
|
NSURL *link = [NSURL URLWithString:metadata[@"link"]];
|
||||||
FIRDynamicLinkComponents *components =
|
FIRDynamicLinkComponents *components =
|
||||||
[FIRDynamicLinkComponents componentsWithLink:link domain:dynamicLinkInfoMetadata[@"dynamicLinkDomain"]];
|
[FIRDynamicLinkComponents componentsWithLink:link domain:metadata[@"dynamicLinkDomain"]];
|
||||||
|
|
||||||
[self setAndroidParameters:dynamicLinkInfoMetadata components:components];
|
[self setAndroidParameters:metadata components:components];
|
||||||
[self setIosParameters:dynamicLinkInfoMetadata components:components];
|
[self setIosParameters:metadata components:components];
|
||||||
[self setSocialMetaTagParameters:dynamicLinkInfoMetadata components:components];
|
[self setSocialMetaTagParameters:metadata components:components];
|
||||||
|
|
||||||
return components;
|
return components;
|
||||||
}
|
}
|
||||||
@ -193,12 +192,6 @@ RCT_EXPORT_METHOD(createShortDynamicLink: (NSDictionary *) metadata resolver:(RC
|
|||||||
components:(FIRDynamicLinkComponents *)components {
|
components:(FIRDynamicLinkComponents *)components {
|
||||||
NSDictionary *androidParametersDict = metadata[@"androidInfo"];
|
NSDictionary *androidParametersDict = metadata[@"androidInfo"];
|
||||||
if (androidParametersDict) {
|
if (androidParametersDict) {
|
||||||
if (!androidParametersDict[@"androidPackageName"]) {
|
|
||||||
@throw [NSException
|
|
||||||
exceptionWithName:@"missing arguments"
|
|
||||||
reason:@"no androidPackageName was specified."
|
|
||||||
userInfo:nil];
|
|
||||||
}
|
|
||||||
FIRDynamicLinkAndroidParameters *androidParams = [FIRDynamicLinkAndroidParameters
|
FIRDynamicLinkAndroidParameters *androidParams = [FIRDynamicLinkAndroidParameters
|
||||||
parametersWithPackageName: androidParametersDict[@"androidPackageName"]];
|
parametersWithPackageName: androidParametersDict[@"androidPackageName"]];
|
||||||
|
|
||||||
@ -207,7 +200,6 @@ RCT_EXPORT_METHOD(createShortDynamicLink: (NSDictionary *) metadata resolver:(RC
|
|||||||
}
|
}
|
||||||
if (androidParametersDict[@"androidMinPackageVersionCode"]) {
|
if (androidParametersDict[@"androidMinPackageVersionCode"]) {
|
||||||
androidParams.minimumVersion = [androidParametersDict[@"androidMinPackageVersionCode"] integerValue];
|
androidParams.minimumVersion = [androidParametersDict[@"androidMinPackageVersionCode"] integerValue];
|
||||||
|
|
||||||
}
|
}
|
||||||
components.androidParameters = androidParams;
|
components.androidParameters = androidParams;
|
||||||
}
|
}
|
||||||
@ -217,12 +209,6 @@ RCT_EXPORT_METHOD(createShortDynamicLink: (NSDictionary *) metadata resolver:(RC
|
|||||||
components:(FIRDynamicLinkComponents *)components {
|
components:(FIRDynamicLinkComponents *)components {
|
||||||
NSDictionary *iosParametersDict = metadata[@"iosInfo"];
|
NSDictionary *iosParametersDict = metadata[@"iosInfo"];
|
||||||
if (iosParametersDict) {
|
if (iosParametersDict) {
|
||||||
if (!iosParametersDict[@"iosBundleId"]) {
|
|
||||||
@throw [NSException
|
|
||||||
exceptionWithName:@"missing arguments"
|
|
||||||
reason:@"no iosBundleId was specified."
|
|
||||||
userInfo:nil];
|
|
||||||
}
|
|
||||||
FIRDynamicLinkIOSParameters *iOSParams = [FIRDynamicLinkIOSParameters
|
FIRDynamicLinkIOSParameters *iOSParams = [FIRDynamicLinkIOSParameters
|
||||||
parametersWithBundleID:iosParametersDict[@"iosBundleId"]];
|
parametersWithBundleID:iosParametersDict[@"iosBundleId"]];
|
||||||
if (iosParametersDict[@"iosAppStoreId"]) {
|
if (iosParametersDict[@"iosAppStoreId"]) {
|
||||||
|
@ -1,40 +1,55 @@
|
|||||||
import ModuleBase from './../../utils/ModuleBase';
|
import ModuleBase from './../../utils/ModuleBase';
|
||||||
import { areObjectKeysContainedInOther } from './../../utils';
|
import { areObjectKeysContainedInOther, isObject, isString } from './../../utils';
|
||||||
|
|
||||||
const EVENT_TYPE = {
|
const EVENT_TYPE = {
|
||||||
Link: 'dynamic_link_received',
|
Link: 'dynamic_link_received',
|
||||||
};
|
};
|
||||||
|
|
||||||
function validateParameters(parameters: Object): boolean {
|
function validateParameters(parameters: Object): void {
|
||||||
const suportedParametersObject = {
|
const suportedParametersObject = {
|
||||||
dynamicLinkInfo: {
|
dynamicLinkDomain: 'string',
|
||||||
dynamicLinkDomain: 'string',
|
link: 'string',
|
||||||
link: 'string',
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName: 'string',
|
||||||
androidPackageName: 'string',
|
androidFallbackLink: 'string',
|
||||||
androidFallbackLink: 'string',
|
androidMinPackageVersionCode: 'string',
|
||||||
androidMinPackageVersionCode: 'string',
|
androidLink: 'string',
|
||||||
androidLink: 'string',
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId: 'string',
|
||||||
iosBundleId: 'string',
|
iosFallbackLink: 'string',
|
||||||
iosFallbackLink: 'string',
|
iosCustomScheme: 'string',
|
||||||
iosCustomScheme: 'string',
|
iosIpadFallbackLink: 'string',
|
||||||
iosIpadFallbackLink: 'string',
|
iosIpadBundleId: 'string',
|
||||||
iosIpadBundleId: 'string',
|
iosAppStoreId: 'string',
|
||||||
iosAppStoreId: 'string',
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle: 'string',
|
||||||
socialTitle: 'string',
|
socialDescription: 'string',
|
||||||
socialDescription: 'string',
|
socialImageLink: 'string',
|
||||||
socialImageLink: 'string',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
suffix: {
|
suffix: {
|
||||||
option: 'string',
|
option: 'string',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
return areObjectKeysContainedInOther(parameters, suportedParametersObject);
|
if (!areObjectKeysContainedInOther(parameters, suportedParametersObject)) {
|
||||||
|
throw new Error('Invalid Parameters.');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkForMandatoryParameters(parameters: Object): void {
|
||||||
|
if (!isString(parameters.dynamicLinkDomain)) {
|
||||||
|
throw new Error('No dynamicLinkDomain was specified.');
|
||||||
|
}
|
||||||
|
if (!isString(parameters.link)) {
|
||||||
|
throw new Error('No link was specified.');
|
||||||
|
}
|
||||||
|
if (isObject(parameters.androidInfo) && !isString(parameters.androidInfo.androidPackageName)) {
|
||||||
|
throw new Error('No androidPackageName was specified.');
|
||||||
|
}
|
||||||
|
if (isObject(parameters.iosInfo) && !isString(parameters.iosInfo.iosBundleId)) {
|
||||||
|
throw new Error('No iosBundleId was specified.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,10 +91,13 @@ export default class Links extends ModuleBase {
|
|||||||
* @returns {Promise.<String>}
|
* @returns {Promise.<String>}
|
||||||
*/
|
*/
|
||||||
createDynamicLink(parameters: Object = {}): Promise<String> {
|
createDynamicLink(parameters: Object = {}): Promise<String> {
|
||||||
if (!validateParameters(parameters)) {
|
try {
|
||||||
return Promise.reject(new Error('Invalid Parameters.'));
|
checkForMandatoryParameters(parameters);
|
||||||
|
validateParameters(parameters);
|
||||||
|
return this._native.createDynamicLink(parameters);
|
||||||
|
} catch (error) {
|
||||||
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
return this._native.createDynamicLink(parameters);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,10 +106,13 @@ export default class Links extends ModuleBase {
|
|||||||
* @returns {Promise.<String>}
|
* @returns {Promise.<String>}
|
||||||
*/
|
*/
|
||||||
createShortDynamicLink(parameters: Object = {}): Promise<String> {
|
createShortDynamicLink(parameters: Object = {}): Promise<String> {
|
||||||
if (!validateParameters(parameters)) {
|
try {
|
||||||
return Promise.reject(new Error('Invalid Parameters.'));
|
checkForMandatoryParameters(parameters);
|
||||||
|
validateParameters(parameters);
|
||||||
|
return this._native.createShortDynamicLink(parameters);
|
||||||
|
} catch (error) {
|
||||||
|
return Promise.reject(error);
|
||||||
}
|
}
|
||||||
return this._native.createShortDynamicLink(parameters);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,27 +25,25 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
|
|
||||||
it('create long dynamic link with all supported parameters', async () => {
|
it('create long dynamic link with all supported parameters', async () => {
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
androidFallbackLink,
|
||||||
androidFallbackLink,
|
androidMinPackageVersionCode,
|
||||||
androidMinPackageVersionCode,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
iosFallbackLink,
|
||||||
iosFallbackLink,
|
iosCustomScheme,
|
||||||
iosCustomScheme,
|
iosIpadFallbackLink,
|
||||||
iosIpadFallbackLink,
|
iosIpadBundleId,
|
||||||
iosIpadBundleId,
|
iosAppStoreId,
|
||||||
iosAppStoreId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle,
|
||||||
socialTitle,
|
socialDescription,
|
||||||
socialDescription,
|
socialImageLink,
|
||||||
socialImageLink,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -79,10 +77,8 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
|
|
||||||
it('create long dynamic link with minimal parameters', async () => {
|
it('create long dynamic link with minimal parameters', async () => {
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const result = await links.createDynamicLink(data);
|
const result = await links.createDynamicLink(data);
|
||||||
@ -101,8 +97,9 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
reject(new Error('createDynamicLink did not fail.'));
|
reject(new Error('createDynamicLink did not fail.'));
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
const failure = tryCatch(() => {
|
const failure = tryCatch((error) => {
|
||||||
// Assertion
|
// Assertion
|
||||||
|
error.message.should.equal('No dynamicLinkDomain was specified.');
|
||||||
resolve();
|
resolve();
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
@ -116,6 +113,29 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('fail to create long dynamic link without link object', () => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const success = tryCatch(() => {
|
||||||
|
// Assertion
|
||||||
|
reject(new Error('createDynamicLink did not fail.'));
|
||||||
|
}, reject);
|
||||||
|
|
||||||
|
const failure = tryCatch((error) => {
|
||||||
|
// Assertion
|
||||||
|
error.message.should.equal('No link was specified.');
|
||||||
|
resolve();
|
||||||
|
}, reject);
|
||||||
|
|
||||||
|
const data = { dynamicLinkDomain };
|
||||||
|
|
||||||
|
// Test
|
||||||
|
|
||||||
|
links.createDynamicLink(data)
|
||||||
|
.then(success)
|
||||||
|
.catch(failure);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it('fail to create long dynamic link without iosBundleId', () => {
|
it('fail to create long dynamic link without iosBundleId', () => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const success = tryCatch(() => {
|
const success = tryCatch(() => {
|
||||||
@ -125,32 +145,30 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
|
|
||||||
const failure = tryCatch((error) => {
|
const failure = tryCatch((error) => {
|
||||||
// Assertion
|
// Assertion
|
||||||
error.message.should.equal('no iosBundleId was specified.');
|
error.message.should.equal('No iosBundleId was specified.');
|
||||||
resolve();
|
resolve();
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
// Setup
|
// Setup
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
androidFallbackLink,
|
||||||
androidFallbackLink,
|
androidMinPackageVersionCode,
|
||||||
androidMinPackageVersionCode,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosFallbackLink,
|
||||||
iosFallbackLink,
|
iosCustomScheme,
|
||||||
iosCustomScheme,
|
iosIpadFallbackLink,
|
||||||
iosIpadFallbackLink,
|
iosIpadBundleId,
|
||||||
iosIpadBundleId,
|
iosAppStoreId,
|
||||||
iosAppStoreId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle,
|
||||||
socialTitle,
|
socialDescription,
|
||||||
socialDescription,
|
socialImageLink,
|
||||||
socialImageLink,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -171,32 +189,30 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
|
|
||||||
const failure = tryCatch((error) => {
|
const failure = tryCatch((error) => {
|
||||||
// Assertion
|
// Assertion
|
||||||
error.message.should.equal('no androidPackageName was specified.');
|
error.message.should.equal('No androidPackageName was specified.');
|
||||||
resolve();
|
resolve();
|
||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
// Setup
|
// Setup
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidFallbackLink,
|
||||||
androidFallbackLink,
|
androidMinPackageVersionCode,
|
||||||
androidMinPackageVersionCode,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
iosFallbackLink,
|
||||||
iosFallbackLink,
|
iosCustomScheme,
|
||||||
iosCustomScheme,
|
iosIpadFallbackLink,
|
||||||
iosIpadFallbackLink,
|
iosIpadBundleId,
|
||||||
iosIpadBundleId,
|
iosAppStoreId,
|
||||||
iosAppStoreId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle,
|
||||||
socialTitle,
|
socialDescription,
|
||||||
socialDescription,
|
socialImageLink,
|
||||||
socialImageLink,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -208,7 +224,7 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('fail to create long dynamic link with unsupported dynamicLinkInfo parameters', () => {
|
it('fail to create long dynamic link with unsupported parameter', () => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const success = tryCatch(() => {
|
const success = tryCatch(() => {
|
||||||
// Assertion
|
// Assertion
|
||||||
@ -222,11 +238,9 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
someInvalidParameter: 'invalid',
|
||||||
someInvalidParameter: 'invalid',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Test
|
// Test
|
||||||
@ -251,17 +265,15 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
someInvalidParameter: 'invalid',
|
||||||
someInvalidParameter: 'invalid',
|
someOtherParameter: 'invalid',
|
||||||
someOtherParameter: 'invalid',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -287,17 +299,15 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
someInvalidParameter: 'invalid',
|
||||||
someInvalidParameter: 'invalid',
|
someOtherParameter: 'invalid',
|
||||||
someOtherParameter: 'invalid',
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -323,19 +333,17 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
}, reject);
|
}, reject);
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link,
|
||||||
link,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
someInvalidParameter: 'invalid',
|
||||||
someInvalidParameter: 'invalid',
|
someOtherParameter: 'invalid',
|
||||||
someOtherParameter: 'invalid',
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -350,27 +358,25 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
it('create short (unguessable) dynamic link with all supported parameters', async () => {
|
it('create short (unguessable) dynamic link with all supported parameters', async () => {
|
||||||
const url = 'https://www.google.co.il/search?q=react+native+firebase';
|
const url = 'https://www.google.co.il/search?q=react+native+firebase';
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link: url,
|
||||||
link: url,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
androidFallbackLink,
|
||||||
androidFallbackLink,
|
androidMinPackageVersionCode,
|
||||||
androidMinPackageVersionCode,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
iosFallbackLink,
|
||||||
iosFallbackLink,
|
iosCustomScheme,
|
||||||
iosCustomScheme,
|
iosIpadFallbackLink,
|
||||||
iosIpadFallbackLink,
|
iosIpadBundleId,
|
||||||
iosIpadBundleId,
|
iosAppStoreId,
|
||||||
iosAppStoreId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle,
|
||||||
socialTitle,
|
socialDescription,
|
||||||
socialDescription,
|
socialImageLink,
|
||||||
socialImageLink,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -384,27 +390,25 @@ function linksTests({ describe, it, firebase, tryCatch }) {
|
|||||||
it('create short (short) dynamic link with all supported parameters', async () => {
|
it('create short (short) dynamic link with all supported parameters', async () => {
|
||||||
const url = 'https://www.google.co.il/search?q=react+native+firebase';
|
const url = 'https://www.google.co.il/search?q=react+native+firebase';
|
||||||
const data = {
|
const data = {
|
||||||
dynamicLinkInfo: {
|
link: url,
|
||||||
link: url,
|
dynamicLinkDomain,
|
||||||
dynamicLinkDomain,
|
androidInfo: {
|
||||||
androidInfo: {
|
androidPackageName,
|
||||||
androidPackageName,
|
androidFallbackLink,
|
||||||
androidFallbackLink,
|
androidMinPackageVersionCode,
|
||||||
androidMinPackageVersionCode,
|
},
|
||||||
},
|
iosInfo: {
|
||||||
iosInfo: {
|
iosBundleId,
|
||||||
iosBundleId,
|
iosFallbackLink,
|
||||||
iosFallbackLink,
|
iosCustomScheme,
|
||||||
iosCustomScheme,
|
iosIpadFallbackLink,
|
||||||
iosIpadFallbackLink,
|
iosIpadBundleId,
|
||||||
iosIpadBundleId,
|
iosAppStoreId,
|
||||||
iosAppStoreId,
|
},
|
||||||
},
|
socialMetaTagInfo: {
|
||||||
socialMetaTagInfo: {
|
socialTitle,
|
||||||
socialTitle,
|
socialDescription,
|
||||||
socialDescription,
|
socialImageLink,
|
||||||
socialImageLink,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
suffix: {
|
suffix: {
|
||||||
option: 'SHORT',
|
option: 'SHORT',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user