-// import Cookies from 'js-cookie';
-import IsomorphicCookie from 'isomorphic-cookie';
-import { User_, LoginResponse } from 'lemmy-js-client';
-import jwt_decode from 'jwt-decode';
-import { Subject, BehaviorSubject } from 'rxjs';
-import { i18n } from '../i18next';
-import { toast } from '../utils';
+import { isAuthPath } from "@utils/app";
+import { clearAuthCookie, isBrowser, setAuthCookie } from "@utils/browser";
+import * as cookie from "cookie";
+import jwt_decode from "jwt-decode";
+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: User_;
- 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();
+ }
- public get auth(): string {
- return IsomorphicCookie.load('jwt');
+ if (isAuthPath(location.pathname)) {
+ location.replace("/");
+ } else {
+ location.reload();
+ }
}
- public authField(throwErr: boolean = true): string {
- if (this.auth == null && throwErr) {
- toast(i18n.t('not_logged_in'), 'danger');
- throw 'Not logged in';
+ public auth(throwErr = false): string | undefined {
+ const jwt = this.jwtInfo?.jwt;
+
+ if (jwt) {
+ return jwt;
} else {
- return this.auth;
+ 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());
}
}