UNPKG

ttf-api

Version:

The TrueToForm API SDK

106 lines (88 loc) 2.88 kB
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), }; };