"use client"; import { Fetcher } from "openapi-typescript-fetch"; import { getUser } from "./fetch"; import { paths, components } from "muzak/data/types"; const fetcher = Fetcher.for(); const BASE_URL = process.env.BACKEND_HOST || "http://127.0.0.1:8001"; // Configure the fetcher fetcher.configure({ baseUrl: BASE_URL, init: { headers: { "Content-Type": "application/json", }, }, use: [ // Add authentication token to request async (url, init, next) => { const user = getUser(); if (user?.access_token) { init.headers = { ...init.headers, Authorization: `Bearer ${user.access_token}`, "Content-Type": "application/json", }; } return next(url, init); }, // Handle errors async (url, init, next) => { const response = await next(url, init); if (!response.ok) { if (response.status === 401) { console.warn("Authentication failed - token may be expired"); } console.error(`API Error: ${response.status} ${response.statusText}`, { url, method: init.method, }); } return response; }, ], }); export const api = { tracks: { list: fetcher.path("/api/track/").method("get").create(), detail: fetcher.path("/api/track/{id}").method("get").create(), vote: fetcher.path("/api/track/vote").method("get").create(), nominate: fetcher.path("/api/track/").method("post").create(), }, artists: { list: fetcher.path("/api/artist").method("get").create(), detail: fetcher.path("/api/artist/{id}").method("get").create(), }, albums: { list: fetcher.path("/api/album/").method("get").create(), detail: fetcher.path("/api/album/{id}").method("get").create(), }, votes: { list: fetcher.path("/api/vote/").method("get").create(), detail: fetcher.path("/api/vote/{id}").method("get").create(), userVotes: fetcher.path("/api/user/{user_id}/votes").method("get").create(), }, users: { list: fetcher.path("/api/user/").method("get").create(), detail: fetcher.path("/api/user/{id}").method("get").create(), }, profiles: { detail: fetcher.path("/api/profile/{id}").method("get").create(), backgrounds: { list: fetcher.path("/api/profile/background").method("get").create(), detail: fetcher .path("/api/profile/background/{id}") .method("get") .create(), }, }, }; export type User = components["schemas"]["User"]; export type Track = components["schemas"]["Track"]; export type Album = components["schemas"]["Album"]; export type Vote = components["schemas"]["Vote"]; export default api;