11import { HttpClient } from '@angular/common/http' ;
22import { Injectable } from '@angular/core' ;
33import { environment } from '../../environments/environment' ;
4- import { BehaviorSubject , map , tap } from 'rxjs' ;
4+ import { BehaviorSubject , from , map , tap } from 'rxjs' ;
55import { User } from './user.model' ;
6+ import { Preferences } from '@capacitor/preferences' ; ;
67
78export interface AuthResponseData {
89 kind : string ;
@@ -44,6 +45,39 @@ export class AuthService {
4445 }
4546 constructor ( private http : HttpClient ) { }
4647
48+ autoLogin ( ) {
49+ return from ( Preferences . get ( { key : 'authData' } ) ) . pipe (
50+ map ( ( storedData ) => {
51+ if ( ! storedData || ! storedData . value ) {
52+ return null ;
53+ }
54+ const parsedData = JSON . parse ( storedData . value ) as {
55+ token : string ;
56+ tokenExpirationDate : string ;
57+ userId : string ;
58+ email : string ;
59+ } ;
60+ const expirationTime = new Date ( parsedData . tokenExpirationDate ) ;
61+ if ( expirationTime <= new Date ( ) ) {
62+ return null ;
63+ }
64+ const user = new User (
65+ parsedData . userId ,
66+ parsedData . email ,
67+ parsedData . token ,
68+ expirationTime
69+ ) ;
70+ return user ;
71+ } ) , tap ( user => {
72+ if ( user ) {
73+ this . _user . next ( user ) ;
74+ }
75+ } ) , map ( user => {
76+ return ! ! user ;
77+ } )
78+ ) ;
79+ }
80+
4781 signup ( email : string , password : string ) {
4882 return this . http
4983 . post < AuthResponseData > (
@@ -54,25 +88,45 @@ export class AuthService {
5488 }
5589
5690 login ( email : string , password : string ) {
57- return this . http . post < AuthResponseData > (
58- `https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=${ environment . firebaseAPIKey } ` ,
59- { email : email , password : password , returnSecureToken : true }
60- ) . pipe ( tap ( this . setUserData . bind ( this ) ) ) ;
91+ return this . http
92+ . post < AuthResponseData > (
93+ `https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key=${ environment . firebaseAPIKey } ` ,
94+ { email : email , password : password , returnSecureToken : true }
95+ )
96+ . pipe ( tap ( this . setUserData . bind ( this ) ) ) ;
6197 }
6298
6399 logout ( ) {
64100 this . _user . next ( null ) ;
65101 }
66102
67103 private setUserData ( userData : AuthResponseData ) {
68- const expTime = new Date ( ) . getTime ( ) + + userData . expiresIn * 1000 ;
104+ const expTime = new Date ( new Date ( ) . getTime ( ) + + userData . expiresIn * 1000 ) ;
69105 this . _user . next (
70- new User (
71- userData . localId ,
72- userData . email ,
73- userData . idToken ,
74- new Date ( expTime )
75- )
106+ new User ( userData . localId , userData . email , userData . idToken , expTime )
107+ ) ;
108+ this . storeAuthData (
109+ userData . localId ,
110+ userData . idToken ,
111+ expTime . toISOString ( ) ,
112+ userData . email
76113 ) ;
77114 }
115+
116+ private storeAuthData (
117+ userId : string ,
118+ token : string ,
119+ tokenExpirationDate : string ,
120+ email : string
121+ ) {
122+ Preferences . set ( {
123+ key : 'authData' ,
124+ value : JSON . stringify ( {
125+ userId : userId ,
126+ token : token ,
127+ tokenExpirationDate : tokenExpirationDate ,
128+ email : email
129+ } ) ,
130+ } ) ;
131+ }
78132}
0 commit comments