import { redirect } from "react-router-dom"; import { ApiClient } from "./api_client"; import { Product, mapProduct } from "../models/product"; import { Card } from "../models/card"; import { refreshIfExpired, logout, presentSession } from "../lib/session"; import Token from "../lib/token"; import Order from "../models/order"; export async function loader({ request }) { if(presentSession()) { if(!refreshIfExpired()) { logout(); return redirect('/products'); } } const client = new ApiClient(); const url = new URL(request.url) const response = await client.get(`${url.pathname}${url.search}`); return response; } export async function cartLoader() { const product_data = new Array(); const cards_data = new Array(); const token = new Token(); const client = new ApiClient(); const product_request = await client.authenticatedGet("/account/cart"); const cards_request = await client.authenticatedGet("/account/cards"); if(product_request.response || cards_request.response) { token.logout(); return redirect("/products") } product_request.data.data.attributes.products.data.map(response_data => { product_data.push(mapProduct(response_data)); }); cards_request.data.data.map(data => { cards_data.push(data.attributes); }); return [product_data, cards_data]; } export async function addressLoader({ params }) { const client = new ApiClient(); const path = `/account/addresses/${params.addressId}`; const request = await client.authenticatedGet(path); if(request.response) return redirect("/account"); return request; } export async function cardLoader({ params }) { const client = new ApiClient(); const path = `/account/cards/${ params.cardId }`; const request = await client.authenticatedGet(path); if(request.response) return redirect("/account"); return request; } export async function accountLoader() { const client = new ApiClient(); const account_response = await client.authenticatedGet("/account"); const addresses_response = await client.authenticatedGet("/account/addresses"); const cards_response = await client.authenticatedGet("/account/cards"); // Authentication error handling. if(account_response.response || addresses_response.response || cards_response.response) return redirect("/products"); return [account_response, addresses_response, cards_response]; } export async function productLoader({ params }) { const client = new ApiClient(); const response = await client.getProduct(params.productId); return [response[0], response[1]]; } export async function ordersLoader() { const client = new ApiClient(); const response = await client.authenticatedGet('/orders'); const orders = new Array try { response.data.data.map(order => { delete order.attributes.products; order.attributes['id'] = order.id; orders.push(order.attributes) }); return orders; } catch(error) { return redirect('/products'); } }