Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 5823548

Browse files
Feature Request - Passing State in Email Actions #1146
1 parent 95a2257 commit 5823548

File tree

5 files changed

+107
-15
lines changed

5 files changed

+107
-15
lines changed

docs/AUTHENTICATION.md

+40-8
Original file line numberDiff line numberDiff line change
@@ -746,14 +746,46 @@ When this happens (or to prevent it from happening), re-authenticate the user.
746746
Sending an "email confirmation" email can be done after the user logged in:
747747

748748
```js
749-
firebase.sendEmailVerification().then(
750-
function () {
751-
console.log("Email verification sent");
752-
},
753-
function (error) {
754-
console.log("Error sending email verification: " + error);
755-
}
756-
);
749+
firebase.sendEmailVerification().then(
750+
function () {
751+
console.log("Email verification sent");
752+
},
753+
function (error) {
754+
console.log("Error sending email verification: " + error);
755+
}
756+
);
757+
```
758+
759+
You can also pass state to this function - for details on the properties, see [the Firebase docs](https://firebase.google.com/docs/auth/web/passing-state-in-email-actions).
760+
761+
```js
762+
firebase.sendEmailVerification({
763+
url: "https://www.google.com",
764+
handleCodeInApp: true,
765+
iOS: {
766+
bundleId: "com.bla.hoopla",
767+
dynamicLinkDomain: "xyz"
768+
},
769+
android: {
770+
minimumVersion: "13",
771+
installApp: true,
772+
packageName: "x.y.z"
773+
}
774+
}).then(
775+
function () {
776+
console.log("Email verification sent");
777+
},
778+
function (error) {
779+
console.log("Error sending email verification: " + error);
780+
}
781+
);
757782
```
758783

784+
Note that you can also use this with the Web API:
785+
786+
```js
787+
const firebaseWebApi = require("nativescript-plugin-firebase/app");
788+
const user = firebaseWebApi.auth().currentUser;
759789

790+
user.sendEmailVerification() // see the implementation above
791+
```

src/app/auth/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export module auth {
55
export class Auth {
66
private authStateChangedHandler;
77
public currentUser: User;
8+
public languageCode: string | null;
89

910
public onAuthStateChanged(handler: (user: User) => void): void {
1011
this.authStateChangedHandler = handler;

src/firebase.android.ts

+22-3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { AndroidActivityResultEventData } from "tns-core-modules/application";
33
import lazy from "tns-core-modules/utils/lazy";
44
import { ad as AndroidUtils } from "tns-core-modules/utils/utils";
55
import {
6+
ActionCodeSettings,
67
DataSnapshot,
78
FBDataSingleEvent,
89
FBErrorData,
@@ -631,7 +632,7 @@ firebase.getCurrentUser = arg => {
631632
});
632633
};
633634

634-
firebase.sendEmailVerification = () => {
635+
firebase.sendEmailVerification = (actionCodeSettings?: ActionCodeSettings) => {
635636
return new Promise((resolve, reject) => {
636637
try {
637638
const firebaseAuth = com.google.firebase.auth.FirebaseAuth.getInstance();
@@ -647,7 +648,24 @@ firebase.sendEmailVerification = () => {
647648
}
648649
});
649650

650-
user.sendEmailVerification().addOnCompleteListener(addOnCompleteListener);
651+
if (actionCodeSettings) {
652+
const settingsBuilder = new com.google.firebase.auth.ActionCodeSettings.newBuilder();
653+
if (actionCodeSettings.handleCodeInApp !== undefined) {
654+
settingsBuilder.setHandleCodeInApp(actionCodeSettings.handleCodeInApp);
655+
}
656+
if (actionCodeSettings.url) {
657+
settingsBuilder.setUrl(actionCodeSettings.url);
658+
}
659+
if (actionCodeSettings.iOS && actionCodeSettings.iOS.bundleId) {
660+
settingsBuilder.setIOSBundleId(actionCodeSettings.iOS.bundleId);
661+
}
662+
if (actionCodeSettings.android && actionCodeSettings.android.packageName) {
663+
settingsBuilder.setAndroidPackageName(actionCodeSettings.android.packageName, actionCodeSettings.android.installApp, actionCodeSettings.android.minimumVersion || null);
664+
}
665+
user.sendEmailVerification(settingsBuilder.build()).addOnCompleteListener(addOnCompleteListener);
666+
} else {
667+
user.sendEmailVerification().addOnCompleteListener(addOnCompleteListener);
668+
}
651669
} else {
652670
reject("Log in first");
653671
}
@@ -783,7 +801,8 @@ function toLoginResult(user, additionalUserInfo?): User {
783801
metadata: {
784802
creationTimestamp: user.getMetadata() ? new Date(user.getMetadata().getCreationTimestamp() as number) : null,
785803
lastSignInTimestamp: user.getMetadata() ? new Date(user.getMetadata().getLastSignInTimestamp() as number) : null
786-
}
804+
},
805+
sendEmailVerification: (actionCodeSettings?: ActionCodeSettings) => firebase.sendEmailVerification(actionCodeSettings)
787806
};
788807

789808
if (firebase.currentAdditionalUserInfo) {

src/firebase.d.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,20 @@ export interface ReauthenticateOptions {
322322
password?: string;
323323
}
324324

325+
type ActionCodeSettings = {
326+
url: string;
327+
handleCodeInApp?: boolean;
328+
android?: {
329+
installApp?: boolean;
330+
minimumVersion?: string;
331+
packageName: string;
332+
};
333+
iOS?: {
334+
bundleId: string;
335+
dynamicLinkDomain?: string;
336+
};
337+
};
338+
325339
/**
326340
* The returned object from the login function.
327341
*/
@@ -339,6 +353,8 @@ export interface User {
339353
additionalUserInfo?: AdditionalUserInfo;
340354
/** iOS only */
341355
refreshToken?: string;
356+
357+
sendEmailVerification(actionCodeSettings?: ActionCodeSettings): Promise<void>;
342358
}
343359

344360
/**
@@ -943,7 +959,7 @@ export function fetchProvidersForEmail(email: string): Promise<Array<string>>;
943959

944960
export function fetchSignInMethodsForEmail(email: string): Promise<Array<string>>;
945961

946-
export function sendEmailVerification(): Promise<any>;
962+
export function sendEmailVerification(actionCodeSettings?: ActionCodeSettings): Promise<any>;
947963

948964
export function createUser(options: CreateUserOptions): Promise<User>;
949965

src/firebase.ios.ts

+27-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as application from "tns-core-modules/application/application";
22
import {
3+
ActionCodeSettings,
34
DataSnapshot,
45
FBDataSingleEvent,
56
firestore,
@@ -543,7 +544,7 @@ firebase.getCurrentUser = arg => {
543544
});
544545
};
545546

546-
firebase.sendEmailVerification = () => {
547+
firebase.sendEmailVerification = (actionCodeSettings?: ActionCodeSettings) => {
547548
return new Promise((resolve, reject) => {
548549
try {
549550
const fAuth = FIRAuth.auth();
@@ -561,7 +562,29 @@ firebase.sendEmailVerification = () => {
561562
resolve(true);
562563
}
563564
};
564-
user.sendEmailVerificationWithCompletion(onCompletion);
565+
if (actionCodeSettings) {
566+
const firActionCodeSettings = FIRActionCodeSettings.new();
567+
if (actionCodeSettings.handleCodeInApp !== undefined) {
568+
firActionCodeSettings.handleCodeInApp = actionCodeSettings.handleCodeInApp;
569+
}
570+
if (actionCodeSettings.url) {
571+
firActionCodeSettings.URL = NSURL.URLWithString(actionCodeSettings.url);
572+
}
573+
if (actionCodeSettings.iOS) {
574+
if (actionCodeSettings.iOS.bundleId) {
575+
firActionCodeSettings.setIOSBundleID(actionCodeSettings.iOS.bundleId);
576+
}
577+
if (actionCodeSettings.iOS.dynamicLinkDomain) {
578+
firActionCodeSettings.dynamicLinkDomain = actionCodeSettings.iOS.dynamicLinkDomain;
579+
}
580+
}
581+
if (actionCodeSettings.android && actionCodeSettings.android.packageName) {
582+
firActionCodeSettings.setAndroidPackageNameInstallIfNotAvailableMinimumVersion(actionCodeSettings.android.packageName, actionCodeSettings.android.installApp, actionCodeSettings.android.minimumVersion || null);
583+
}
584+
user.sendEmailVerificationWithActionCodeSettingsCompletion(firActionCodeSettings, onCompletion);
585+
} else {
586+
user.sendEmailVerificationWithCompletion(onCompletion);
587+
}
565588
} else {
566589
reject("Log in first");
567590
}
@@ -660,7 +683,8 @@ function toLoginResult(user, additionalUserInfo?: FIRAdditionalUserInfo): User {
660683
metadata: {
661684
creationTimestamp: user.metadata.creationDate as Date,
662685
lastSignInTimestamp: user.metadata.lastSignInDate as Date
663-
}
686+
},
687+
sendEmailVerification: (actionCodeSettings?: ActionCodeSettings) => firebase.sendEmailVerification(actionCodeSettings)
664688
};
665689

666690
if (firebase.currentAdditionalUserInfo) {

0 commit comments

Comments
 (0)