ttf-api
Version:
The TrueToForm API SDK
106 lines (88 loc) • 2.88 kB
JavaScript
export const sessionIdKey = "ttf-analytics-session-id";
export const userIdKey = "ttf-analytics-user-id";
export const createClient = (apiKey) => {
const isDev =
process.env.NODE_ENV === "development" ||
window.location.hostname === "localhost" ||
window.location.origin === "https://truetoform-test-store.myshopify.com";
const baseUrl = isDev
? "https://api.truetoform.online/v1"
: "https://api.truetoform.fit/v1";
const getHeaders = () => {
const headers = {
"Content-Type": "application/json",
"X-TTF-API-KEY": apiKey,
};
const sessionId = localStorage.getItem(sessionIdKey);
const userId = localStorage.getItem(userIdKey);
if (sessionId) {
headers["X-TTF-SESSION-ID"] = sessionId;
}
if (userId) {
headers["X-TTF-USER-ID"] = userId;
}
return headers;
};
const request = async (
method,
endpoint,
body = null,
signal = null,
eTag = null
) => {
const headers = getHeaders();
if (eTag) {
headers["If-None-Match"] = eTag;
}
const options = {
method,
headers,
body: body ? JSON.stringify(body) : null,
credentials: "include",
signal,
};
const response = await fetch(`${baseUrl}/${endpoint}`, options);
if (!response.ok && response.status !== 304) {
try {
const data = await response.json();
throw new Error(`Error ${response.status}: ${data?.message}`);
} catch (error) {
console.error(error);
throw new Error(`Error ${response.status}: ${response.statusText}`);
}
}
// Update session and user IDs from response headers
const newSessionId = response.headers.get("X-New-Session-ID");
const newUserId = response.headers.get("X-New-User-ID");
if (newSessionId) {
localStorage.setItem(sessionIdKey, newSessionId);
}
if (newUserId) {
localStorage.setItem(userIdKey, newUserId);
}
// Handle response body
if (response.status === 204) {
return null;
}
const contentType = response.headers.get("content-type");
if (contentType && contentType.includes("application/json")) {
const data = await response.json();
return data;
} else if (contentType && contentType.includes("text/event-stream")) {
return response.body;
} else {
if (response.status === 304) {
return { currentETag: localStorage.getItem("ttf-sdk-eTag") };
}
const text = await response.text();
return text;
}
};
return {
get: (endpoint, signal, eTag) =>
request("GET", endpoint, null, signal, eTag),
post: (endpoint, body, signal) => request("POST", endpoint, body, signal),
put: (endpoint, body, signal) => request("PUT", endpoint, body, signal),
delete: (endpoint, signal) => request("DELETE", endpoint, null, signal),
};
};