mirror of
https://github.com/vercel/commerce.git
synced 2025-05-18 07:26:59 +00:00
181 lines
3.8 KiB
TypeScript
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; |