import { User } from '../types/User'; const BASE = 'https://khofmann.userpage.fu-berlin.de/phpCourse/exam/api/'; let instance: ApiImpl; class ApiImpl { private token: string = ''; constructor() { if (instance) { throw new Error('New instance cannot be created!!'); } instance = this; } public logIn = async (email: string, password: string): Promise => { const { user, token } = await (await this.post('login', { email, password })).json(); this.token = token; return user; }; public logOut = async (): Promise => { return await (await this.postAuth('logout')).json(); }; private post = async ( endpoint: string, body: Record | undefined = undefined, headers: HeadersInit | undefined = undefined ) => { const response = await fetch(`${BASE}${endpoint}`, { mode: 'cors', method: 'post', headers, body: JSON.stringify(body), }); if (response.ok) return response; throw await response.json(); }; private postAuth = async ( endpoint: string, body: Record | undefined = undefined, headers: HeadersInit | undefined = undefined ) => { const response = await fetch(`${BASE}${endpoint}`, { mode: 'cors', method: 'post', headers: { token: this.token, ...headers }, body: JSON.stringify(body), }); if (response.ok) return response; throw await response.json(); }; } const Api = new ApiImpl(); export default Api;