From d0f850e02dd6aea783b95c2462d930d22cb60c94 Mon Sep 17 00:00:00 2001
From: fengxiang <110431245@qq.com>
Date: Wed, 06 Jun 2018 15:14:46 +0800
Subject: [PATCH] 优化超时弹窗

---
 src/app/core/net/default.interceptor.ts |   74 +++++++++++++++++++++++-------------
 1 files changed, 47 insertions(+), 27 deletions(-)

diff --git a/src/app/core/net/default.interceptor.ts b/src/app/core/net/default.interceptor.ts
index d7280ea..462eed3 100644
--- a/src/app/core/net/default.interceptor.ts
+++ b/src/app/core/net/default.interceptor.ts
@@ -22,25 +22,36 @@
 @Injectable()
 export class DefaultInterceptor implements HttpInterceptor {
     private unLoginHandle: Subject<HttpErrorResponse> = new Subject<HttpErrorResponse>();
+    
     constructor(private injector: Injector) {
-         this.unLoginHandle.debounceTime(800).subscribe(event => {
-             if (!!event.error) {
-                  let errorMsg = '';
-                  const erroCode = Number.parseInt(event.error['errorCode']);
-                  switch (erroCode) {
-                     case 10: errorMsg = '���������,���������'; break;
-                     case 11: errorMsg = '������������,���������������'; break;
-                     case 12: errorMsg = '������������,������������������'; break;
-                     default: errorMsg = '������������,���������������'; break;
-                  }
-                  this.model.info({
-                    title: errorMsg,
-                    onOk: () => this.goTo('/passport/login')
-                  });
-             }
+         this.unLoginHandle.debounceTime(1000).subscribe( (event: HttpErrorResponse) => {
+                if (!this.isExpireModelShow && !!event.error) {
+                    this.isExpireModelShow = true;
+                    let errorMsg = '';
+                    const erroCode =  !!event.error['errorCode'] ? Number.parseInt(event.error['errorCode']) : 0;
+                    switch (erroCode) {
+                    case 10: errorMsg = '���������,���������'; break;
+                    case 11: errorMsg = '������������,���������������'; break;
+                    case 12: errorMsg = '������������,������������������'; break;
+                    case 0: errorMsg = '���������������������������'; break;
+                    default: errorMsg = '������������,���������������'; break;
+                    }
+                        // ������refresh���������������������
+                        this.loginService.clearRefreshToken();
+                        this.model.info({
+                        title: errorMsg,
+                        onOk: () => {
+                            this.isExpireModelShow = false;
+                            this.goTo('/passport/login');
+                        }
+                        });
+            }
          });
     }
-
+    private isExpireModelShow = false;
+    get loginService(): LoginService {
+        return this.injector.get<LoginService>(LoginService);
+    }
     get msg(): NzMessageService {
         return this.injector.get(NzMessageService);
     }
@@ -55,7 +66,8 @@
         // ��������������� `throw` ������������������ `_HttpClient` ��� `end()` ������
         // this.injector.get(_HttpClient).end();
         // ���������������������������������
-        switch (event.status) {
+        const status = !!event.status ? event.status : 401;
+        switch (status) {
             case 200:
                 // ��������������������������������������������������� `status` ��������� `0` ���������������������
                 // ��������� `error_message` ������
@@ -70,7 +82,7 @@
                 break;
             case 401: // ������������������
             // this.goTo('/passport/login');
-                if (location.hash && !location.hash.endsWith('login')) {
+                if (!this.isLoginPage) {
                     this.unLoginHandle.next(<HttpErrorResponse>event);
                 }
                 break;
@@ -87,13 +99,11 @@
             return of(event);
         }       
     }
-
+    private get isLoginPage(): boolean {
+        return !!location && !!location.hash && location.hash.endsWith('login');
+    }
     intercept(req: HttpRequest<any>, next: HttpHandler):
-        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {
-        if (!req.headers.get('X-Refrsh-Token')) {
-            const loginService = <LoginService>this.injector.get(LoginService);
-            loginService.refreshToken();
-        }        
+        Observable<HttpSentEvent | HttpHeaderResponse | HttpProgressEvent | HttpResponse<any> | HttpUserEvent<any>> {       
         // ���������������������������
         let url = req.url;
         if (!url.startsWith('https://') && !url.startsWith('http://') && !url.startsWith('assets')) {
@@ -107,12 +117,22 @@
         return next.handle(newReq).pipe(
                     mergeMap((event: any) => {                        
                         // ������������������������������������������������������������������������������������������������HTTP������������������200������������������
-                        if (event instanceof HttpResponse && event.status === 200)
-                            return this.handleData(event);
+                        if (event instanceof HttpResponse && event.status === 200) {
+                                // ������token���������������������������
+                                if (!this.isLoginPage 
+                                    && !!newReq.headers 
+                                    && !newReq.headers.get('X-Refrsh-Token')
+                                    && !url.startsWith('assets')) {                                    
+                                    this.loginService.refreshToken();
+                                } 
+                                return this.handleData(event);
+                            }
                         // ������������������������������������
                         return of(event);
                     }),
-                    catchError((err: HttpErrorResponse) => this.handleData(err))
+                    catchError((err: HttpErrorResponse) => {
+                        return this.handleData(err);
+                    })
                 );
     }
 }

--
Gitblit v1.8.0