]> Untitled Git - lemmy-ui.git/blobdiff - src/shared/services/UserService.ts
fix toaster upon user settings change (#1802)
[lemmy-ui.git] / src / shared / services / UserService.ts
index 4fd5b747d5afd29e38dff68117f21c41209b02f3..70e8e9cadae7b79e8de43aa288ce14adf8031b58 100644 (file)
@@ -1,59 +1,92 @@
-// import Cookies from 'js-cookie';
-import IsomorphicCookie from "isomorphic-cookie";
-import { UserSafeSettings, LoginResponse } from "lemmy-js-client";
+import { isAuthPath } from "@utils/app";
+import { clearAuthCookie, isBrowser, setAuthCookie } from "@utils/browser";
+import * as cookie from "cookie";
 import jwt_decode from "jwt-decode";
-import { Subject, BehaviorSubject } from "rxjs";
+import { LoginResponse, MyUserInfo } from "lemmy-js-client";
+import { toast } from "../toast";
+import { I18NextService } from "./I18NextService";
 
 interface Claims {
-  id: number;
+  sub: number;
   iss: string;
+  iat: number;
+}
+
+interface JwtInfo {
+  claims: Claims;
+  jwt: string;
 }
 
 export class UserService {
-  private static _instance: UserService;
-  public user: UserSafeSettings;
-  public claims: Claims;
-  public jwtSub: Subject<string> = new Subject<string>();
-  public unreadCountSub: BehaviorSubject<number> = new BehaviorSubject<number>(
-    0
-  );
+  static #instance: UserService;
+  public myUserInfo?: MyUserInfo;
+  public jwtInfo?: JwtInfo;
 
   private constructor() {
-    if (this.auth) {
-      this.setClaims(this.auth);
-    } else {
-      // setTheme();
-      console.log("No JWT cookie found.");
-    }
+    this.#setJwtInfo();
   }
 
-  public login(res: LoginResponse) {
-    let expires = new Date();
+  public login({
+    res,
+    showToast = true,
+  }: {
+    res: LoginResponse;
+    showToast?: boolean;
+  }) {
+    const expires = new Date();
     expires.setDate(expires.getDate() + 365);
-    IsomorphicCookie.save("jwt", res.jwt, { expires, secure: false });
-    console.log("jwt cookie set");
-    this.setClaims(res.jwt);
+
+    if (isBrowser() && res.jwt) {
+      showToast && toast(I18NextService.i18n.t("logged_in"));
+      setAuthCookie(res.jwt);
+      this.#setJwtInfo();
+    }
   }
 
   public logout() {
-    IsomorphicCookie.remove("jwt", { secure: false });
-    this.claims = undefined;
-    this.user = undefined;
-    // setTheme();
-    this.jwtSub.next();
-    console.log("Logged out.");
+    this.jwtInfo = undefined;
+    this.myUserInfo = undefined;
+
+    if (isBrowser()) {
+      clearAuthCookie();
+    }
+
+    if (isAuthPath(location.pathname)) {
+      location.replace("/");
+    } else {
+      location.reload();
+    }
   }
 
-  public get auth(): string {
-    return IsomorphicCookie.load("jwt");
+  public auth(throwErr = false): string | undefined {
+    const jwt = this.jwtInfo?.jwt;
+
+    if (jwt) {
+      return jwt;
+    } else {
+      const msg = "No JWT cookie found";
+
+      if (throwErr && isBrowser()) {
+        console.error(msg);
+        toast(I18NextService.i18n.t("not_logged_in"), "danger");
+      }
+
+      return undefined;
+      // throw msg;
+    }
   }
 
-  private setClaims(jwt: string) {
-    this.claims = jwt_decode(jwt);
-    this.jwtSub.next(jwt);
+  #setJwtInfo() {
+    if (isBrowser()) {
+      const { jwt } = cookie.parse(document.cookie);
+
+      if (jwt) {
+        this.jwtInfo = { jwt, claims: jwt_decode(jwt) };
+      }
+    }
   }
 
   public static get Instance() {
-    return this._instance || (this._instance = new this());
+    return this.#instance || (this.#instance = new this());
   }
 }