// Using the user store import { useKUNGalgameUserStore } from '@/store/modules/kungalgamer' // Error handling function import { onRequestError } from '@/error/onRequestError' type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' const successResponseArray = [200, 201, 202, 204, 205, 206] export type FetchOptions = { method: HttpMethod credentials: 'include' headers?: Record body?: BodyInit } // Fetch request function const kunFetchRequest = async ( url: string, options: FetchOptions ): Promise => { const baseUrl = import.meta.env.VITE_API_BASE_URL const fullUrl = `${baseUrl}${url}` // Add the token to the request headers const headers = { ...options.headers, Authorization: `Bearer ${useKUNGalgameUserStore().getToken()}`, } const response = await fetch(fullUrl, { ...options, headers }) // If not 20X, then throw an error if (!successResponseArray.includes(response.status)) { // Handle errors, such as token expiration await onRequestError(response) throw new Error('KUNGalgame Fetch Error occurred, but no problem') } const data: T = await response.json() return data } const fetchGet = async ( url: string, headers?: Record ): Promise => { const options: FetchOptions = { method: 'GET', credentials: 'include', headers: headers, } return await kunFetchRequest(url, options) } const fetchPost = async ( url: string, body?: Record, headers?: Record ): Promise => { const options: FetchOptions = { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/json', ...headers, }, body: JSON.stringify(body), } return await kunFetchRequest(url, options) } const fetchPut = async ( url: string, body?: Record, headers?: Record ): Promise => { const options: FetchOptions = { method: 'PUT', credentials: 'include', headers: { 'Content-Type': 'application/json', ...headers, }, body: JSON.stringify(body), } return await kunFetchRequest(url, options) } const fetchDelete = async ( url: string, headers?: Record ): Promise => { const options: FetchOptions = { method: 'DELETE', credentials: 'include', headers: headers, } return await kunFetchRequest(url, options) } const fetchPostWithFormData = async ( url: string, formData: FormData, headers?: Record ): Promise => { const options: FetchOptions = { method: 'POST', credentials: 'include', headers: { ...headers, }, body: formData, } return await kunFetchRequest(url, options) } export { fetchGet, fetchPost, fetchPut, fetchDelete, fetchPostWithFormData }