181 lines
3.8 KiB
TypeScript

import {
gateway as MoltinGateway
} from '@moltin/sdk'
const Moltin = MoltinGateway({
client_id: process.env.NEXT_PUBLIC_ELASTICPATH_CLIENTID
})
import { Product, ProductImage } from '@commerce/types/product'
const getPrices = (prices:any) => {
if(!prices) {
return [{
"value": 0,
"currencyCode": 'USD'
}];
}
let allPrices = []
for(let key in prices) {
allPrices.push({
"value": prices[key].amount/100,
"currencyCode": key
})
}
return allPrices
}
async function normalizeProductImages (product:any, allImages?:boolean): Promise< ProductImage[]> {
let fileCalls = [],
fileData = product?.relationships?.files?.data || [];
for(let {id} of fileData) {
id && fileCalls.push(Moltin.Files.Get(id));
}
try{
let allFileRes = await Promise.allSettled(fileCalls);
let allFiles:ProductImage[] = [];
allFileRes.filter((item) => {
if(item.status === 'fulfilled') {
let {data} = item.value;
allFiles.push({
"url": data?.link?.href || '',
"alt": data?.file_name || 'no image'
});
}
});
return allFiles;
} catch(err) {
return [{
"url": '/',
"alt": 'no image'
}];
}
}
const getVariants = (variations: any) => {
let allVariants: any = [
{
"id": '',
"options": []
},
{
"id": '',
"options": []
}
]
if(variations){
for(let i in variations){
if(variations[i] !== 'undefined'){
if(variations[i].name === 'Color'){
allVariants[i].id = variations[i].id;
variations[i].options.map((opt: any) => {
allVariants[i].options.push({
"id": opt.id,
"displayName": opt.name,
"values": [{
"label": opt.name.toLowerCase(),
"hexColors": [opt.name]
}]
})
})
}
if(variations[i].name === 'Size'){
allVariants[i].id = variations[i].id;
variations[i].options.map((opt: any) => {
allVariants[i].options.push({
"id": opt.id,
"displayName": opt.name,
"values": [{
"label": opt.name.length > 2 ? opt.name.slice(0, 1) : opt.name
}]
})
})
}
}
}
}
return allVariants
}
const getOptions = (variations: any) => {
let allOptions: any = [
{
"id": '',
"displayName": '',
"values": []
},
{
"id": '',
"displayName": '',
"values": []
}
]
if(variations){
for(let i in variations){
if(variations[i] !== 'undefined'){
variations[i].options.map((opt: any) => {
if(variations[i].name === 'Color'){
allOptions[i].id = variations[i].id;
allOptions[i].displayName = variations[i].name;
allOptions[i].values.push({
"label": opt.name.toLowerCase(),
"hexColors": [opt.name]
})
}
if(variations[i].name === 'Size'){
allOptions[i].id = variations[i].id;
allOptions[i].displayName = variations[i].name;
allOptions[i].values.push({
"label": opt.name.slice(0, 1)
})
}
})
}
}
return allOptions;
}
}
export const normalizeProduct = async(product:any, allImages?: boolean) => {
let emptyVariant: any = [
{
"id": '',
"options": []
}
]
let emptyOption: any = []
return {
"id": product?.id,
"name": product?.attributes?.name,
"path": "/"+product?.attributes?.slug,
"slug": product?.attributes?.slug,
"price": getPrices(product?.attributes?.price)[0],
"description": product?.attributes?.description,
"images": await normalizeProductImages(product, allImages),
"variants": (product?.meta?.variations) ? getVariants(product?.meta?.variations) : emptyVariant,
"options": (product?.meta?.variations) ? getOptions(product?.meta?.variations) : emptyOption
}
};
const normalizeProducts = async(products:any) => {
let allProducts:Product[] = [];
for (let index in products) {
let product = products[index];
allProducts.push(await normalizeProduct(product));
}
return allProducts;
}
export default normalizeProducts;