| 1 |
import { AI_HOST } from '@constants'; |
| 2 |
import { reqDataBasics } from '@shared/lib/data'; |
| 3 |
import { retryTwice } from './helpers'; |
| 4 |
|
| 5 |
const generatePatterns = async (page, data) => { |
| 6 |
const { siteProfile, designBuild } = data; |
| 7 |
return await retryTwice(async () => { |
| 8 |
const response = await fetch(`${AI_HOST}/api/patterns`, { |
| 9 |
method: 'POST', |
| 10 |
headers: { 'Content-Type': 'application/json' }, |
| 11 |
body: JSON.stringify({ |
| 12 |
...reqDataBasics, |
| 13 |
siteProfile, |
| 14 |
page, |
| 15 |
buildId: designBuild?.buildId, |
| 16 |
}), |
| 17 |
}); |
| 18 |
if (!response.ok) { |
| 19 |
throw new Error( |
| 20 |
`Pattern generation failed with status ${response.status}`, |
| 21 |
); |
| 22 |
} |
| 23 |
return await response.json(); |
| 24 |
}); |
| 25 |
}; |
| 26 |
|
| 27 |
// Hold back patterns that already have finalized content (e.g. design build) |
| 28 |
const splitGeneratedContent = (page) => { |
| 29 |
const generated = page.patterns?.filter((p) => p.contentGenerated) ?? []; |
| 30 |
const rest = page.patterns?.filter((p) => !p.contentGenerated) ?? []; |
| 31 |
return { generated, toGenerate: { ...page, patterns: rest } }; |
| 32 |
}; |
| 33 |
|
| 34 |
export const generatePageContent = async (pages, data) => { |
| 35 |
const splits = pages.map(splitGeneratedContent); |
| 36 |
|
| 37 |
const result = await Promise.allSettled( |
| 38 |
splits.map(({ toGenerate }) => |
| 39 |
toGenerate.patterns.length |
| 40 |
? generatePatterns(toGenerate, data).catch(() => toGenerate) |
| 41 |
: Promise.resolve(toGenerate), |
| 42 |
), |
| 43 |
); |
| 44 |
|
| 45 |
return result?.map((pageResult, i) => { |
| 46 |
const original = pages[i]; |
| 47 |
const { generated } = splits[i]; |
| 48 |
const merged = |
| 49 |
pageResult.status === 'fulfilled' && pageResult.value |
| 50 |
? { ...original, ...pageResult.value } |
| 51 |
: original; |
| 52 |
return { |
| 53 |
...merged, |
| 54 |
patterns: [...generated, ...(merged.patterns ?? [])], |
| 55 |
}; |
| 56 |
}); |
| 57 |
}; |
| 58 |
|