import INTERNALS from './../../internals'; /** * @url https://firebase.google.com/docs/reference/js/firebase.User */ export default class User { /** * * @param authClass Instance of Authentication class * @param authObj authentication result object from native */ constructor(authClass, authObj) { this._auth = authClass; this._user = null; this._updateValues(authObj); } /** * INTERNALS */ /** * * @param authObj * @private */ _updateValues(authObj) { this._authObj = authObj; if (authObj.user) { this._user = authObj.user; } else { this._user = null; } } /** * Returns a user property or null if does not exist * @param prop * @returns {*} * @private */ _valueOrNull(prop) { if (!this._user) return null; if (!Object.hasOwnProperty.call(this._user, prop)) return null; return this._user[prop]; } /** * Returns a user property or false if does not exist * @param prop * @returns {*} * @private */ _valueOrFalse(prop) { if (!this._user) return false; if (!Object.hasOwnProperty.call(this._user, prop)) return false; return this._user[prop]; } /** * PROPERTIES */ get displayName(): String | null { return this._valueOrNull('displayName'); } get email(): String | null { return this._valueOrNull('email'); } get emailVerified(): Boolean { return this._valueOrNull('emailVerified'); } get isAnonymous(): Boolean { return this._valueOrFalse('isAnonymous'); } get photoURL(): String | null { return this._valueOrNull('photoURL'); } get providerId() { return this._valueOrNull('providerId'); } get uid(): String { return this._valueOrNull('uid'); } // noinspection ReservedWordAsName /** * METHODS */ toJSON() { return Object.assign({}, this._user); } /** * Delete the current user * @return {Promise} */ delete(): Promise { return this._auth._interceptUserValue(this._auth._native.delete()); } /** * * @param credential */ linkWithCredential(credential: CredentialType) { return this._auth._interceptUserValue(this._auth._native.link(credential.providerId, credential.token, credential.secret)); } /** * * @param providerId * @return {Promise.|*} */ unlink(providerId: string) { return this._auth._interceptUserValue(this._auth._native.unlink(providerId)); } /** * Re-authenticate a user with a third-party authentication provider * @return {Promise} A promise resolved upon completion */ reauthenticateWithCredential(credential: CredentialType) { return this._auth._interceptUserValue(this._auth._native.reauthenticate(credential.providerId, credential.token, credential.secret)); } /** * Reload the current user * @return {Promise} */ reload(): Promise { return this._auth._interceptUserValue(this._auth._native.reload()); } /** * get the token of current user * @deprecated Deprecated getToken in favor of getIdToken. * @return {Promise} */ getToken(forceRefresh: Boolean = false): Promise { console.warn('Deprecated firebase.User.prototype.getToken in favor of firebase.User.prototype.getIdToken.'); return this._auth._native.getToken(forceRefresh); } /** * get the token of current user * @return {Promise} */ getIdToken(forceRefresh: Boolean = false): Promise { return this._auth._native.getToken(forceRefresh); } /** * * @returns {Array} */ get providerData(): Array { return this._valueOrNull('providerData') || []; } /** * Update the current user's email * * @param {string} email The user's _new_ email * @return {Promise} A promise resolved upon completion */ updateEmail(email: string): Promise { return this._auth._interceptUserValue(this._auth._native.updateEmail(email)); } /** * Update the current user's profile * @param {Object} updates An object containing the keys listed [here](https://firebase.google.com/docs/auth/ios/manage-users#update_a_users_profile) * @return {Promise} */ updateProfile(updates: Object = {}): Promise { return this._auth._interceptUserValue(this._auth._native.updateProfile(updates)); } /** * Update the current user's password * @param {string} password the new password * @return {Promise} */ updatePassword(password: string): Promise { return this._auth._interceptUserValue(this._auth._native.updatePassword(password)); } /** * Send verification email to current user. */ sendEmailVerification(): Promise { return this._auth._interceptUserValue(this._auth._native.sendEmailVerification()); } /** * KNOWN UNSUPPORTED METHODS */ linkAndRetrieveDataWithCredential() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'linkAndRetrieveDataWithCredential')); } linkWithPhoneNumber() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'linkWithPhoneNumber')); } linkWithPopup() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'linkWithPopup')); } linkWithRedirect() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'linkWithRedirect')); } reauthenticateWithPhoneNumber() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'reauthenticateWithPhoneNumber')); } reauthenticateWithPopup() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'reauthenticateWithPopup')); } reauthenticateWithRedirect() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'reauthenticateWithRedirect')); } updatePhoneNumber() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_METHOD('User', 'updatePhoneNumber')); } get refreshToken() { throw new Error(INTERNALS.STRINGS.ERROR_UNSUPPORTED_CLASS_PROPERTY('User', 'refreshToken')); } }