Add podcast image picker to the Email Templates welcome card; v2.3.2
Publish Container / build (push) Failing after 27s
Publish Container / build (push) Failing after 27s
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
abfbb1981b
commit
4931bfab4d
2 files changed
+10
-3
No files matched your search
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "siteforge",
|
"name": "siteforge",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "2.3.1",
|
"version": "2.3.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
|
|||||||
+9
-2
@@ -364,10 +364,14 @@ function EmailTemplatesPanel({
|
|||||||
form,
|
form,
|
||||||
handleChange,
|
handleChange,
|
||||||
renderSaveStatus,
|
renderSaveStatus,
|
||||||
|
renderImageAssetSelector,
|
||||||
|
renderImagePreview,
|
||||||
}: {
|
}: {
|
||||||
form: SiteContent
|
form: SiteContent
|
||||||
handleChange: (key: StringField, value: string) => void
|
handleChange: (key: StringField, value: string) => void
|
||||||
renderSaveStatus: () => React.ReactNode
|
renderSaveStatus: () => React.ReactNode
|
||||||
|
renderImageAssetSelector: (value: string | null | undefined, onChange: (value: string) => void, fieldId: string) => React.ReactNode
|
||||||
|
renderImagePreview: (value: string | null | undefined, alt: string) => React.ReactNode
|
||||||
}) {
|
}) {
|
||||||
const [expandedEmail, setExpandedEmail] = useState<string | null>(null)
|
const [expandedEmail, setExpandedEmail] = useState<string | null>(null)
|
||||||
|
|
||||||
@@ -417,6 +421,8 @@ function EmailTemplatesPanel({
|
|||||||
? <textarea id={`field-et-${key}`} rows={3} value={form[key as StringField] as string} onChange={e => handleChange(key as StringField, e.target.value)} />
|
? <textarea id={`field-et-${key}`} rows={3} value={form[key as StringField] as string} onChange={e => handleChange(key as StringField, e.target.value)} />
|
||||||
: <input id={`field-et-${key}`} type="text" value={form[key as StringField] as string} onChange={e => handleChange(key as StringField, e.target.value)} />
|
: <input id={`field-et-${key}`} type="text" value={form[key as StringField] as string} onChange={e => handleChange(key as StringField, e.target.value)} />
|
||||||
}
|
}
|
||||||
|
{key.includes('ImageUrl') && renderImageAssetSelector(form[key as StringField] as string, value => handleChange(key as StringField, value), `field-et-${key}-asset`)}
|
||||||
|
{key.includes('ImageUrl') && renderImagePreview(form[key as StringField] as string, `${field.label} preview`)}
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
})}
|
})}
|
||||||
@@ -436,7 +442,7 @@ function EmailTemplatesPanel({
|
|||||||
<EmailTemplateCard type="newsletter" icon="📬" title="Newsletter Welcome"
|
<EmailTemplateCard type="newsletter" icon="📬" title="Newsletter Welcome"
|
||||||
trigger="Someone subscribes via the homepage form or contact page"
|
trigger="Someone subscribes via the homepage form or contact page"
|
||||||
autoVars="Subscriber's first name, Spotify / Apple / Amazon links"
|
autoVars="Subscriber's first name, Spotify / Apple / Amazon links"
|
||||||
fieldKeys={['welcomeEmailSubject','welcomeEmailGreetingPrefix','welcomeEmailIntro','welcomeEmailCurrentSeries','welcomeEmailStartHereTitle','welcomeEmailStartHereSummary','welcomeEmailStartHereUrl','welcomeEmailStartHereLinkLabel','welcomeEmailWhatToExpect1','welcomeEmailWhatToExpect2','welcomeEmailWhatToExpect3','welcomeEmailScripture','welcomeEmailScriptureRef','welcomeEmailSignoff','welcomeEmailSpotifyUrl','welcomeEmailSpotifyBtnLabel','welcomeEmailAppleUrl','welcomeEmailAppleBtnLabel','welcomeEmailAmazonUrl']}
|
fieldKeys={['welcomeEmailSubject','welcomeEmailImageUrl','welcomeEmailGreetingPrefix','welcomeEmailIntro','welcomeEmailCurrentSeries','welcomeEmailStartHereTitle','welcomeEmailStartHereSummary','welcomeEmailStartHereUrl','welcomeEmailStartHereLinkLabel','welcomeEmailWhatToExpect1','welcomeEmailWhatToExpect2','welcomeEmailWhatToExpect3','welcomeEmailScripture','welcomeEmailScriptureRef','welcomeEmailSignoff','welcomeEmailSpotifyUrl','welcomeEmailSpotifyBtnLabel','welcomeEmailAppleUrl','welcomeEmailAppleBtnLabel','welcomeEmailAmazonUrl']}
|
||||||
openKey="newsletter-welcome" />
|
openKey="newsletter-welcome" />
|
||||||
|
|
||||||
<EmailTemplateCard type="study" icon="📖" title="Study Account — New Account"
|
<EmailTemplateCard type="study" icon="📖" title="Study Account — New Account"
|
||||||
@@ -971,6 +977,7 @@ const FIELDS: Array<{ key: StringField; label: string; multiline?: boolean; sect
|
|||||||
{ key: 'welcomeEmailSignoff', label: 'Signoff', multiline: true, section: 'global' },
|
{ key: 'welcomeEmailSignoff', label: 'Signoff', multiline: true, section: 'global' },
|
||||||
// ── Email Templates section ──
|
// ── Email Templates section ──
|
||||||
{ key: 'welcomeEmailSubject', label: 'Subject Line', section: 'email-templates' },
|
{ key: 'welcomeEmailSubject', label: 'Subject Line', section: 'email-templates' },
|
||||||
|
{ key: 'welcomeEmailImageUrl', label: 'Podcast Image (shown at top of email)', section: 'email-templates' },
|
||||||
{ key: 'welcomeEmailGreetingPrefix', label: 'Greeting Prefix (before subscriber name)', section: 'email-templates' },
|
{ key: 'welcomeEmailGreetingPrefix', label: 'Greeting Prefix (before subscriber name)', section: 'email-templates' },
|
||||||
{ key: 'welcomeEmailIntro', label: 'Intro Paragraph', multiline: true, section: 'email-templates' },
|
{ key: 'welcomeEmailIntro', label: 'Intro Paragraph', multiline: true, section: 'email-templates' },
|
||||||
{ key: 'welcomeEmailCurrentSeries', label: 'Current Series Blurb', multiline: true, section: 'email-templates' },
|
{ key: 'welcomeEmailCurrentSeries', label: 'Current Series Blurb', multiline: true, section: 'email-templates' },
|
||||||
@@ -5703,7 +5710,7 @@ async function handleAssetUpload(event: ChangeEvent<HTMLInputElement>) {
|
|||||||
|
|
||||||
{/* EMAIL TEMPLATES */}
|
{/* EMAIL TEMPLATES */}
|
||||||
{adminView === 'email-templates' && (
|
{adminView === 'email-templates' && (
|
||||||
<EmailTemplatesPanel form={form} handleChange={handleChange} renderSaveStatus={renderSaveStatus} />
|
<EmailTemplatesPanel form={form} handleChange={handleChange} renderSaveStatus={renderSaveStatus} renderImageAssetSelector={renderImageAssetSelector} renderImagePreview={renderImagePreview} />
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* QUESTIONS */}
|
{/* QUESTIONS */}
|
||||||
|
|||||||
Reference in new issue
Block a user