@mcmhomes/panorama-viewer
Version:
Provides React components to render panoramas.
112 lines (104 loc) • 3.98 kB
JSX
import {contains, each, findIndex, INT_LAX, IS_ARRAY, IS_OBJECT, ISSET, mapToArray} from './PanoramaUtils.jsx';
export const getSelectedVariationIndexesBySku = (variationGroups, skus) =>
{
const selectedVariationIndexes = mapToArray(variationGroups, () => 0);
if(IS_ARRAY(skus))
{
each(skus, (sku, groupIndex) =>
{
let skuFound = false;
each(variationGroups, (group, groupIndex) =>
{
let variationIndex = findIndex(group?.variations, variation => (variation?.sku === sku));
if(ISSET(variationIndex))
{
selectedVariationIndexes[groupIndex] = variationIndex;
skuFound = true;
}
});
if(!skuFound)
{
console.warn('[PanoramaViewer] SKU not found:', sku);
}
});
}
else if(IS_OBJECT(skus))
{
each(skus, (sku, groupId) =>
{
const groupIndex = findIndex(variationGroups, variationGroup => (variationGroup?.groupId === groupId));
if(groupIndex !== null)
{
const group = variationGroups[groupIndex];
const variationIndex = findIndex(group?.variations, variation => (variation?.sku === sku));
if(ISSET(variationIndex))
{
selectedVariationIndexes[groupIndex] = variationIndex;
}
else
{
console.warn('[PanoramaViewer] SKU not found in group:', sku, group);
}
}
else
{
console.warn('[PanoramaViewer] SKU Group ID not found:', groupId);
}
});
}
else if(ISSET(skus))
{
console.warn('[PanoramaViewer] Invalid SKUs:', skus);
}
return selectedVariationIndexes;
};
export const getTexturePathsToRender = (variationGroups, selectedVariationIndexes, locationVariationGroups, styleIndex, locationIndex, homeUrl) =>
{
let result = [];
let variationIndexesForLocation = [];
let locationVariationIndexIndexed = {};
let locationVariationGroupsIndexed = {};
/** add full render **/
each(variationGroups, (group, groupIndex) =>
{
const locationVariationIndex = findIndex(locationVariationGroups, locationVariationGroup => (locationVariationGroup?.groupId === group?.groupId));
const locationVariationGroup = (locationVariationIndex === null) ? null : locationVariationGroups?.[locationVariationIndex];
locationVariationIndexIndexed[group?.groupId] = locationVariationIndex;
locationVariationGroupsIndexed[group?.groupId] = locationVariationGroup;
if(locationVariationGroup && !locationVariationGroup?.layer)
{
variationIndexesForLocation.push(INT_LAX(selectedVariationIndexes[groupIndex]));
}
else
{
variationIndexesForLocation.push(0);
}
});
result.push({styleIndex, locationIndex, layerRenderOrder:0, basePath:homeUrl + 'img_' + styleIndex + '_' + locationIndex + ((variationIndexesForLocation.length <= 0) ? '' : '_' + variationIndexesForLocation.join('_'))});
/** add layers **/
each(variationGroups, (layerGroup, layerGroupIndex) =>
{
const locationVariationGroup = locationVariationGroupsIndexed[layerGroup?.groupId];
if(!locationVariationGroup || !locationVariationGroup?.layer)
{
return;
}
const locationVariationIndex = locationVariationIndexIndexed[layerGroup?.groupId];
variationIndexesForLocation = [];
each(variationGroups, (group, groupIndex) =>
{
if((layerGroup?.groupId === group?.groupId) || contains(locationVariationGroup?.layerDependencyGroupIds, group?.groupId))
{
variationIndexesForLocation.push(INT_LAX(selectedVariationIndexes[groupIndex]));
}
else
{
variationIndexesForLocation.push(0);
}
});
const colorPath = 'img_' + styleIndex + '_' + locationIndex + '_' + layerGroupIndex + 'c' + ((variationIndexesForLocation.length <= 0) ? '' : '_' + variationIndexesForLocation.join('_'));
const maskPath = 'img_' + styleIndex + '_' + locationIndex + '_' + layerGroupIndex + 'm' + ((variationIndexesForLocation.length <= 0) ? '' : '_' + variationIndexesForLocation.join('_'));
result.push({styleIndex, locationIndex, layerRenderOrder:(locationVariationIndex + 1), basePath:homeUrl + colorPath, maskBasePath:homeUrl + maskPath});
});
return result;
};