kushalkachari's picture
Improve Supabase auth error handling
26cc380
Raw
History Blame Contribute Delete
2.65 kB
const API_BASE = import.meta.env.VITE_API_BASE_URL || "";
function authHeaders() {
const token = localStorage.getItem("kyr_access_token");
return token ? { Authorization: `Bearer ${token}` } : {};
}
async function request(path, options = {}) {
const response = await fetch(`${API_BASE}${path}`, {
...options,
headers: {
...(options.body instanceof FormData ? {} : { "Content-Type": "application/json" }),
...authHeaders(),
...(options.headers || {}),
},
});
const contentType = response.headers.get("content-type") || "";
const data = contentType.includes("application/json") ? await response.json() : await response.text();
if (!response.ok) {
const detail = typeof data === "object" ? data.detail || data.message : data;
throw new Error(detail || `Request failed with status ${response.status}`);
}
return data;
}
export const api = {
config: () => request("/api/config"),
status: (sessionId) => request(`/api/status?session_id=${encodeURIComponent(sessionId)}`),
signIn: (email, password) =>
request("/api/auth/sign-in", {
method: "POST",
body: JSON.stringify({ email, password }),
}),
signUp: (email, password, redirectTo) =>
request("/api/auth/sign-up", {
method: "POST",
body: JSON.stringify({ email, password, redirect_to: redirectTo }),
}),
me: () => request("/api/auth/me"),
signOut: () => request("/api/auth/sign-out", { method: "POST" }),
estimateSource: (sourceUrl) =>
request("/api/sources/estimate", {
method: "POST",
body: JSON.stringify({ source_url: sourceUrl }),
}),
ingestSource: (sourceUrl, sessionId) =>
request("/api/ingest/source", {
method: "POST",
body: JSON.stringify({ source_url: sourceUrl, session_id: sessionId }),
}),
uploadFiles: (files, sessionId) => {
const formData = new FormData();
formData.append("session_id", sessionId);
Array.from(files).forEach((file) => formData.append("files", file));
return request("/api/ingest/upload", {
method: "POST",
body: formData,
});
},
job: (jobId, sessionId) => request(`/api/jobs/${encodeURIComponent(jobId)}?session_id=${encodeURIComponent(sessionId)}`),
search: ({ query, sessionId, topK, similarityThreshold }) =>
request("/api/search", {
method: "POST",
body: JSON.stringify({
query,
session_id: sessionId,
top_k: topK,
similarity_threshold: similarityThreshold,
}),
}),
chat: (question, chunks) =>
request("/api/chat", {
method: "POST",
body: JSON.stringify({ question, chunks }),
}),
};