Skip to content
Snippets Groups Projects
auth.ts 2.38 KiB
Newer Older

import { apiRoot } from 'config';

export function getAuthHeader(): HeadersInit {
    if (isLoggedIn()) {
        return {
            'Authorization': `Brearer ${getToken()}`,
        };
    } else {
        return {};
    }
}

export function isLoggedIn(): boolean {
    return typeof getToken() === 'string';
}

export function getToken(): string | null {
    return localStorage.getItem('access-token');
}

export function setToken(token: string) {
    localStorage.setItem('access-token', token);
}

export function clearToken() {
    localStorage.removeItem('access-token');
}

extendAccessToken();
setInterval(extendAccessToken, 1000 * 60 * 30);

async function extendAccessToken() {
    if (isLoggedIn()) {
        try {
            const response = await fetch(`${apiRoot}/auth/extend`, { headers: getAuthHeader() });
            if (response.ok) {
                const json = await response.json();
                setToken(json.token);
                clearToken();
            }
        } catch(e) {
export async function register(username: string, password: string, realname: string | null, email: string | null): Promise<boolean> {
    try {
        const response = await fetch(`${apiRoot}/auth/register`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
            }),
        });
        if (response.ok) {
            const json = await response.json();
            setToken(json.token);
        }
        return response.ok;
    } catch (e) {
        // Probably a network errlor
        throw e;
    }
}

export async function login(username: string, password: string): Promise<boolean> {
    try {
        const response = await fetch(`${apiRoot}/auth/token`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                username: username,
                password: password
            }),
        });
        if (response.ok) {
            const json = await response.json();
            setToken(json.token);
        }
        return response.ok;
    } catch (e) {
        // Probably a network error
        throw e;
    }
}