Spaces:
Running
Running
import React, { createContext, useContext, ReactNode } from "react"; | |
interface ApiContextType { | |
baseUrl: string; | |
wsBaseUrl: string; | |
fetchWithHeaders: (url: string, options?: RequestInit) => Promise<Response>; | |
} | |
const ApiContext = createContext<ApiContextType | undefined>(undefined); | |
const DEFAULT_LOCALHOST = "http://localhost:8000"; | |
const DEFAULT_WS_LOCALHOST = "ws://localhost:8000"; | |
interface ApiProviderProps { | |
children: ReactNode; | |
} | |
export const ApiProvider: React.FC<ApiProviderProps> = ({ children }) => { | |
const baseUrl = DEFAULT_LOCALHOST; | |
const wsBaseUrl = DEFAULT_WS_LOCALHOST; | |
// Enhanced fetch function that automatically includes necessary headers | |
const fetchWithHeaders = async ( | |
url: string, | |
options: RequestInit = {} | |
): Promise<Response> => { | |
const enhancedOptions: RequestInit = { | |
...options, | |
headers: { | |
"Content-Type": "application/json", | |
...options.headers, | |
}, | |
}; | |
return fetch(url, enhancedOptions); | |
}; | |
return ( | |
<ApiContext.Provider | |
value={{ | |
baseUrl, | |
wsBaseUrl, | |
fetchWithHeaders, | |
}} | |
> | |
{children} | |
</ApiContext.Provider> | |
); | |
}; | |
export const useApi = (): ApiContextType => { | |
const context = useContext(ApiContext); | |
if (context === undefined) { | |
throw new Error("useApi must be used within an ApiProvider"); | |
} | |
return context; | |
}; | |