66 lines
2.3 KiB
JavaScript
66 lines
2.3 KiB
JavaScript
// utils/timeline-template-processor.js
|
|
|
|
export const generateTimelineFromTemplate = (template, mediaStoreData) => {
|
|
const { selectedMeme, selectedBackground, currentCaption } = mediaStoreData;
|
|
|
|
// If no selections, return empty timeline
|
|
if (!selectedMeme && !selectedBackground) {
|
|
return [];
|
|
}
|
|
|
|
// Calculate duration based on template config
|
|
let maxDuration = 5; // default fallback
|
|
if (template.max_duration_based_on === 'memes' && selectedMeme?.duration) {
|
|
maxDuration = parseFloat(selectedMeme.duration);
|
|
}
|
|
|
|
// Process each timeline element
|
|
const processedTimeline = template.timeline
|
|
.map((element) => {
|
|
let processedElement = { ...element };
|
|
|
|
// Update duration for all elements
|
|
processedElement.duration = maxDuration;
|
|
|
|
// Process by element ID/type
|
|
switch (element.id) {
|
|
case 'background':
|
|
if (selectedBackground) {
|
|
processedElement.source = selectedBackground.media_url;
|
|
processedElement.name = selectedBackground.prompt || 'Background';
|
|
} else {
|
|
return null; // Skip if no background selected
|
|
}
|
|
break;
|
|
|
|
case 'meme':
|
|
if (selectedMeme) {
|
|
processedElement.source_webm = selectedMeme.webm_url;
|
|
processedElement.source_mov = selectedMeme.mov_url;
|
|
processedElement.poster = selectedMeme.webp_url;
|
|
processedElement.name = selectedMeme.name;
|
|
} else {
|
|
return null; // Skip if no meme selected
|
|
}
|
|
break;
|
|
|
|
case 'caption':
|
|
if (currentCaption) {
|
|
processedElement.text = currentCaption;
|
|
} else {
|
|
return null; // Skip if no caption
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// Keep element as-is for any other types
|
|
break;
|
|
}
|
|
|
|
return processedElement;
|
|
})
|
|
.filter(Boolean); // Remove null elements
|
|
|
|
return processedTimeline;
|
|
};
|