import React from "react"; const BASE_URL = "http://192.168.100.163:8080"; // TODO change this function authHeader(token?: string) { return token ? { Authorization: `Bearer ${token}` } : {}; } async function request( method: string, path: string, token?: string, body?: object, params?: Record, ): Promise { const url = new URL(`${BASE_URL}${path}`); if (params) { Object.entries(params).forEach(([k, v]) => { if (v !== undefined && v !== null) url.searchParams.set(k, String(v)); }); } const res = await fetch(url.toString(), { method, // @ts-ignore headers: { "Content-Type": "application/json", ...authHeader(token) }, ...(body ? { body: JSON.stringify(body) } : {}), }); if (!res.ok) throw new Error(await res.text().catch(() => `HTTP ${res.status}`)); return res.json(); } export function get(path: string, token?: string, params?: Record) { return request("GET", path, token, undefined, params); } export function post(path: string, body: object, token?: string) { return request("POST", path, token, body); } export function put( path: string, body?: object, token?: string ) { return request("PUT", path, token, body); } export function del(path: string, token?: string) { return request("DELETE", path, token); } export type Subject = { id: string; name: string; }; export type JwtResponse = { token: string; email: string; userId: string; message: string; }; export type UserDTO = { id: string; email: string; subjectSet: Subject[]; }; export type UserUpdateDTO = { email: string; newEmail?: string; password?: string; subjectSet: { id: string }[]; // pass existing subscriptions so they aren't wiped }; export type Entry = { id: string; title: string; timePublished: string; groupName: string; infoEntry: string; paragraph: string; filepath?: string; subject: Subject; }; export type SpringPage = { content: T[]; totalPages: number; last: boolean; number: number; }; export type LoginPayload = { email: string; password: string }; export type RegisterPayload = { email: string; password: string; name?: string }; export const authApi = { login: (p: LoginPayload) => post("/login", p), register: (p: RegisterPayload) => post("/register", p), getUser: (userId: string, token: string) => get(`/users/${userId}`, token), updateUser: (body: UserUpdateDTO, token: string) => request("PUT", "/users", token, body), }; export const subjectsApi = { getAll: (token?: string) => get("/subjects", token), }; export const subscriptionsApi = { subscribe: (userId: string, subjectId: string, token: string) => put( `/users/${userId}/subjects/${subjectId}`, {}, // body placeholder token ), unsubscribe: (userId: string, subjectId: string, token: string) => del( `/users/${userId}/subjects/${subjectId}`, token ), }; export const entriesApi = { getEntries: (params: { subjectId?: string; groupName?: string; page?: number }) => get>("/entries", undefined, params), getEntry: (id: string) => get(`/entries/${id}`), };