var products = []; var fileData = ""; const GITHUB_TOKEN = atob( "Z2l0aHViX3BhdF8xMUFYNEtVTlkwY05lbWNpZHVrWDYxXzczTzV2bTh2Wk5uMzlpQm0wb1BXRmd5dUx2a0VKSGluZ0dZeURPV0JFWTJXMk9YTFFINVRLT2xpU2ts" ); console.log( GITHUB_TOKEN === "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" ); const GITHUB_OWNER = "Adityadn64"; const GITHUB_REPO = "FINAL-PROJECT---ACQ20RC"; const USERS_FILE_PATH = "database/users.json"; const PRODUCTS_FILE_PATH = "database/products.json"; async function getUsers() { const res = await fetch( `https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/contents/${USERS_FILE_PATH}`, { headers: { Accept: "application/vnd.github+json", Authorization: `Bearer ${GITHUB_TOKEN}`, }, } ); fileData = await res.json(); let currentUsers = {}; try { currentUsers = JSON.parse(atob(fileData.content)); } catch (e) { console.error("Error parsing current users; using empty object", e); } return currentUsers; } async function getUserData() { const storedDataStr = localStorage.getItem("userData"); if (!storedDataStr) return null; const storedData = JSON.parse(storedDataStr); const usersDB = await getUsers(); let userData = storedData.uid && usersDB && usersDB[storedData.uid] ? usersDB[storedData.uid] : storedData; // Ensure uid is set if (storedData.uid) { userData.uid = storedData.uid; } return userData; } async function getCarts() { const userData = await getUserData(); let localCart = []; const cartStr = localStorage.getItem("cart"); if (cartStr) { try { localCart = JSON.parse(cartStr); if (!Array.isArray(localCart)) { localCart = []; } } catch (e) { console.error( "Error parsing local cart data; using empty array", e ); localCart = []; } } let cartData; if (userData && userData.cart && Array.isArray(userData.cart)) { cartData = userData.cart; } else { cartData = localCart; } return cartData; } function convertImageToBase64(imageUrl) { return new Promise((resolve, reject) => { fetch(imageUrl) .then(res => res.blob()) .then(blob => { const reader = new FileReader(); reader.readAsDataURL(blob); reader.onloadend = () => resolve(reader.result); reader.onerror = error => reject(error); }) .catch(err => reject(err)); }); } async function uploadFileToGitHub(filePath, base64Data) { try { const fileRes = await fetch( `https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/contents/${filePath}`, { method: "PUT", headers: { Accept: "application/vnd.github+json", Authorization: `Bearer ${GITHUB_TOKEN}`, }, body: JSON.stringify({ message: "Upload user photo", content: base64Data.split(",")[1], // Hanya ambil data Base64 tanpa prefix }), } ); const result = await fileRes.json(); return result; } catch (err) { console.error("Error uploading file to GitHub:", err); return null; } } async function updateUserDataToGitHub(userData) { try { let currentUsers = await getUsers(); const isNotValidUID = !userData.uid || userData.uid === undefined; if (isNotValidUID) { localStorage.clear(); window.location.href = `/profile.html?redirect=${urlNow}` + (message ? `&message=${message}` : ""); } if (!userData.photo_profile.includes("github")) { const photoFilePath = `assets/users/photo_profile/${userData.uid}.jpg`; let photoBase64 = userData.photo_profile; if (!photoBase64.startsWith("data:image/")) { photoBase64 = await convertImageToBase64(userData.photo_profile); } const photoUploadRes = await uploadFileToGitHub(photoFilePath, photoBase64); if (photoUploadRes) { userData.photo_profile = `https://raw.githubusercontent.com/${GITHUB_OWNER}/${GITHUB_REPO}/main/${photoFilePath}`; } } currentUsers[userData.uid] = { name: userData.name ? userData.name : "", email: userData.email ? userData.email : "", phone: userData.phone ? userData.phone : "", address: userData.address ? userData.address : "", photo_profile: userData.photo_profile ? userData.photo_profile : "", cart: userData.cart ? userData.cart : [], transactions: userData.transactions ? userData.transactions : {}, }; const newContent = btoa(JSON.stringify(currentUsers, null, 4)); const updateRes = await fetch( `https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/contents/${USERS_FILE_PATH}`, { method: "PUT", headers: { Accept: "application/vnd.github+json", Authorization: `Bearer ${GITHUB_TOKEN}`, }, body: JSON.stringify({ message: "Update user data via login Google", content: newContent, sha: fileData.sha, }), } ); const result = await updateRes.json(); console.log("Update user data result:", result, currentUsers); } catch (err) { console.error("Error updating user data to GitHub:", err); } } async function fetchProductsData() { const response = await fetch( `https://api.github.com/repos/${GITHUB_OWNER}/${GITHUB_REPO}/contents/${PRODUCTS_FILE_PATH}`, { headers: { Accept: "application/vnd.github.v3+json", Authorization: `Bearer ${GITHUB_TOKEN}`, }, } ); const data = await response.json(); const fileContent = atob(data.content); products = JSON.parse(fileContent); return products; } document.addEventListener("DOMContentLoaded", async function () { AOS.init(); products = await fetchProductsData(); });