Files
komodo/frontend/src/util/client.ts
2022-03-13 01:18:24 -08:00

110 lines
2.7 KiB
TypeScript

import axios from "axios";
import { URL } from "..";
import { User } from "@oauth2/types";
export default class Client {
token = localStorage.getItem("access_token");
constructor(private baseURL: string) {
const params = new URLSearchParams(location.search);
const token = params.get("token");
const redirect = params.get("redirect")
if (token) {
this.token = token;
localStorage.setItem("access_token", this.token);
history.replaceState(
{},
"",
`${URL}${redirect ? `/?redirect=${redirect}` : ""}`
);
} else if (params.get("logout") === "true") {
this.logout();
}
}
async login(username: string, password: string) {
const jwt: string = await this.post("/login/local", { username, password });
this.token = jwt;
localStorage.setItem("access_token", this.token);
return await this.getUser();
}
async signup(username: string, password: string) {
const jwt: string = await this.post("/signup", { username, password });
this.token = jwt;
localStorage.setItem("access_token", this.token);
return await this.getUser();
}
logout() {
localStorage.removeItem("access_token");
this.token = null;
}
async getUser(): Promise<User | false> {
// this basically check to see if user is authenticated
if (this.token) {
try {
return await this.get("/user");
} catch {
this.logout();
return false;
}
} else {
return false;
}
}
async get<T = any>(url: string) {
return await axios({
method: "get",
url: this.baseURL + url,
headers: {
authorization: `Bearer ${this.token}`,
},
}).then(({ data }) => data as T);
}
async post<Data = any>(url: string, data?: Data) {
return await axios({
method: "post",
url: this.baseURL + url,
headers: {
authorization: `Bearer ${this.token}`,
},
data,
}).then(({ data }) => data);
}
async put<Data = any>(url: string, data: Data) {
return await axios({
method: "put",
url: this.baseURL + url,
headers: {
authorization: `Bearer ${this.token}`,
},
data,
}).then(({ data }) => data);
}
async patch<Data = any>(url: string, data: Data) {
return await axios({
method: "patch",
url: this.baseURL + url,
headers: {
authorization: `Bearer ${this.token}`,
},
data,
}).then(({ data }) => data);
}
async delete(url: string) {
return await axios({
method: "delete",
url: this.baseURL + url,
headers: {
authorization: `Bearer ${this.token}`,
},
}).then(({ data }) => data);
}
}