payload-plugin-newsletter 0.20.1 → 0.20.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/admin.d.ts +706 -0
- package/dist/{components.js → admin.js} +832 -1458
- package/dist/broadcast-VMCYSZRY.js +6 -0
- package/dist/chunk-XVMYJQRQ.js +490 -0
- package/dist/client.d.ts +131 -15
- package/dist/client.js +1 -1
- package/dist/server.d.ts +735 -0
- package/dist/{index.js → server.js} +30 -654
- package/package.json +17 -27
- package/dist/client.cjs +0 -891
- package/dist/client.cjs.map +0 -1
- package/dist/client.d.cts +0 -53
- package/dist/client.js.map +0 -1
- package/dist/components.cjs +0 -2460
- package/dist/components.cjs.map +0 -1
- package/dist/components.d.cts +0 -66
- package/dist/components.d.ts +0 -66
- package/dist/components.js.map +0 -1
- package/dist/index.cjs +0 -5545
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -90
- package/dist/index.d.ts +0 -90
- package/dist/index.js.map +0 -1
package/dist/components.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts","../src/components/Broadcasts/EmailPreview.tsx","../src/utils/emailSafeHtml.ts","../src/utils/validateEmailHtml.ts","../src/contexts/PluginConfigContext.tsx","../src/components/Broadcasts/EmailPreviewField.tsx","../src/components/Broadcasts/BroadcastEditor.tsx","../src/components/Broadcasts/BroadcastInlinePreview.tsx","../src/components/Broadcasts/PreviewControls.tsx","../src/components/Broadcasts/BroadcastPreviewField.tsx","../src/components/Broadcasts/EmailRenderer.tsx","../src/components/Broadcasts/StatusBadge.tsx","../src/components/Broadcasts/EmptyField.tsx","../src/email-templates/DefaultBroadcastTemplate.tsx"],"sourcesContent":["'use client'\n\nimport React, { useState, FormEvent } from 'react'\nimport type { SignupFormProps } from '../types'\n\nconst defaultStyles = {\n form: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '1rem',\n maxWidth: '400px',\n margin: '0 auto',\n },\n inputGroup: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '0.5rem',\n },\n label: {\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n },\n input: {\n padding: '0.5rem 0.75rem',\n fontSize: '1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n outline: 'none',\n transition: 'border-color 0.2s',\n },\n button: {\n padding: '0.75rem 1.5rem',\n fontSize: '1rem',\n fontWeight: '500',\n color: '#ffffff',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n },\n buttonDisabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n error: {\n fontSize: '0.875rem',\n color: '#ef4444',\n marginTop: '0.25rem',\n },\n success: {\n fontSize: '0.875rem',\n color: '#10b981',\n marginTop: '0.25rem',\n },\n checkbox: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n },\n checkboxInput: {\n width: '1rem',\n height: '1rem',\n },\n checkboxLabel: {\n fontSize: '0.875rem',\n color: '#374151',\n },\n}\n\nexport const NewsletterForm: React.FC<SignupFormProps> = ({\n onSuccess,\n onError,\n showName = false,\n showPreferences = false,\n leadMagnet,\n className,\n styles: customStyles = {},\n apiEndpoint = '/api/newsletter/subscribe',\n buttonText = 'Subscribe',\n loadingText = 'Subscribing...',\n successMessage = 'Successfully subscribed!',\n placeholders = {\n email: 'Enter your email',\n name: 'Enter your name',\n },\n labels = {\n email: 'Email',\n name: 'Name',\n newsletter: 'Newsletter updates',\n announcements: 'Product announcements',\n },\n}) => {\n const [email, setEmail] = useState('')\n const [name, setName] = useState('')\n const [preferences, setPreferences] = useState({\n newsletter: true,\n announcements: true,\n })\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState(false)\n\n const styles = {\n form: { ...defaultStyles.form, ...customStyles.form },\n inputGroup: { ...defaultStyles.inputGroup, ...customStyles.inputGroup },\n label: { ...defaultStyles.label, ...customStyles.label },\n input: { ...defaultStyles.input, ...customStyles.input },\n button: { ...defaultStyles.button, ...customStyles.button },\n buttonDisabled: { ...defaultStyles.buttonDisabled, ...customStyles.buttonDisabled },\n error: { ...defaultStyles.error, ...customStyles.error },\n success: { ...defaultStyles.success, ...customStyles.success },\n checkbox: { ...defaultStyles.checkbox, ...customStyles.checkbox },\n checkboxInput: { ...defaultStyles.checkboxInput, ...customStyles.checkboxInput },\n checkboxLabel: { ...defaultStyles.checkboxLabel, ...customStyles.checkboxLabel },\n }\n\n const handleSubmit = async (e: FormEvent) => {\n e.preventDefault()\n setError(null)\n setLoading(true)\n\n try {\n const payload: any = {\n email,\n ...(showName && name && { name }),\n ...(showPreferences && { preferences }),\n ...(leadMagnet && { leadMagnet: leadMagnet.id }),\n metadata: {\n signupPage: window.location.href,\n ...(typeof window !== 'undefined' && window.location.search && {\n utmParams: Object.fromEntries(new URLSearchParams(window.location.search)),\n }),\n },\n }\n\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n throw new Error(data.error || data.errors?.join(', ') || 'Subscription failed')\n }\n\n setSuccess(true)\n setEmail('')\n setName('')\n if (onSuccess) {\n onSuccess(data.subscriber)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An error occurred'\n setError(errorMessage)\n if (onError) {\n onError(new Error(errorMessage))\n }\n } finally {\n setLoading(false)\n }\n }\n\n if (success && !showPreferences) {\n return (\n <div className={className} style={styles.form}>\n <p style={styles.success}>{successMessage}</p>\n </div>\n )\n }\n\n return (\n <form onSubmit={handleSubmit} className={className} style={styles.form}>\n <div style={styles.inputGroup}>\n <label htmlFor=\"email\" style={styles.label}>\n {labels.email}\n </label>\n <input\n id=\"email\"\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder={placeholders.email}\n required\n disabled={loading}\n style={{\n ...styles.input,\n ...(loading && { opacity: 0.5 }),\n }}\n />\n </div>\n\n {showName && (\n <div style={styles.inputGroup}>\n <label htmlFor=\"name\" style={styles.label}>\n {labels.name}\n </label>\n <input\n id=\"name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder={placeholders.name}\n disabled={loading}\n style={{\n ...styles.input,\n ...(loading && { opacity: 0.5 }),\n }}\n />\n </div>\n )}\n\n {showPreferences && (\n <div style={styles.inputGroup}>\n <label style={styles.label}>Email Preferences</label>\n <div style={styles.checkbox}>\n <input\n id=\"newsletter\"\n type=\"checkbox\"\n checked={preferences.newsletter}\n onChange={(e) =>\n setPreferences({ ...preferences, newsletter: e.target.checked })\n }\n disabled={loading}\n style={styles.checkboxInput}\n />\n <label htmlFor=\"newsletter\" style={styles.checkboxLabel}>\n {labels.newsletter}\n </label>\n </div>\n <div style={styles.checkbox}>\n <input\n id=\"announcements\"\n type=\"checkbox\"\n checked={preferences.announcements}\n onChange={(e) =>\n setPreferences({ ...preferences, announcements: e.target.checked })\n }\n disabled={loading}\n style={styles.checkboxInput}\n />\n <label htmlFor=\"announcements\" style={styles.checkboxLabel}>\n {labels.announcements}\n </label>\n </div>\n </div>\n )}\n\n <button\n type=\"submit\"\n disabled={loading}\n style={{\n ...styles.button,\n ...(loading && styles.buttonDisabled),\n }}\n >\n {loading ? loadingText : buttonText}\n </button>\n\n {error && <p style={styles.error}>{error}</p>}\n {success && <p style={styles.success}>{successMessage}</p>}\n </form>\n )\n}\n\n// Factory function for creating custom newsletter forms\nexport function createNewsletterForm(\n defaultProps: Partial<SignupFormProps>\n): React.FC<SignupFormProps> {\n return (props: SignupFormProps) => (\n <NewsletterForm {...defaultProps} {...props} />\n )\n}","'use client'\n\nimport React, { useState, useEffect, FormEvent } from 'react'\nimport type { PreferencesFormProps, Subscriber } from '../types'\n\nconst defaultStyles = {\n container: {\n maxWidth: '600px',\n margin: '0 auto',\n padding: '2rem',\n },\n heading: {\n fontSize: '1.5rem',\n fontWeight: '600',\n marginBottom: '1.5rem',\n color: '#111827',\n },\n form: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '1.5rem',\n },\n section: {\n padding: '1.5rem',\n backgroundColor: '#f9fafb',\n borderRadius: '0.5rem',\n border: '1px solid #e5e7eb',\n },\n sectionTitle: {\n fontSize: '1.125rem',\n fontWeight: '500',\n marginBottom: '1rem',\n color: '#111827',\n },\n inputGroup: {\n display: 'flex',\n flexDirection: 'column' as const,\n gap: '0.5rem',\n },\n label: {\n fontSize: '0.875rem',\n fontWeight: '500',\n color: '#374151',\n },\n input: {\n padding: '0.5rem 0.75rem',\n fontSize: '1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n outline: 'none',\n transition: 'border-color 0.2s',\n },\n select: {\n padding: '0.5rem 0.75rem',\n fontSize: '1rem',\n border: '1px solid #e5e7eb',\n borderRadius: '0.375rem',\n outline: 'none',\n backgroundColor: '#ffffff',\n },\n checkbox: {\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n marginBottom: '0.5rem',\n },\n checkboxInput: {\n width: '1rem',\n height: '1rem',\n },\n checkboxLabel: {\n fontSize: '0.875rem',\n color: '#374151',\n },\n buttonGroup: {\n display: 'flex',\n gap: '1rem',\n marginTop: '1rem',\n },\n button: {\n padding: '0.75rem 1.5rem',\n fontSize: '1rem',\n fontWeight: '500',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n transition: 'all 0.2s',\n border: 'none',\n },\n primaryButton: {\n color: '#ffffff',\n backgroundColor: '#3b82f6',\n },\n secondaryButton: {\n color: '#374151',\n backgroundColor: '#ffffff',\n border: '1px solid #e5e7eb',\n },\n dangerButton: {\n color: '#ffffff',\n backgroundColor: '#ef4444',\n },\n error: {\n fontSize: '0.875rem',\n color: '#ef4444',\n marginTop: '0.5rem',\n },\n success: {\n fontSize: '0.875rem',\n color: '#10b981',\n marginTop: '0.5rem',\n },\n info: {\n fontSize: '0.875rem',\n color: '#6b7280',\n marginTop: '0.5rem',\n },\n}\n\nexport const PreferencesForm: React.FC<PreferencesFormProps> = ({\n subscriber: initialSubscriber,\n onSuccess,\n onError,\n className,\n styles: customStyles = {},\n sessionToken,\n apiEndpoint = '/api/newsletter/preferences',\n showUnsubscribe = true,\n locales = ['en'],\n labels = {\n title: 'Newsletter Preferences',\n personalInfo: 'Personal Information',\n emailPreferences: 'Email Preferences',\n name: 'Name',\n language: 'Preferred Language',\n newsletter: 'Newsletter updates',\n announcements: 'Product announcements',\n saveButton: 'Save Preferences',\n unsubscribeButton: 'Unsubscribe',\n saving: 'Saving...',\n saved: 'Preferences saved successfully!',\n unsubscribeConfirm: 'Are you sure you want to unsubscribe? This cannot be undone.',\n },\n}) => {\n const [subscriber, setSubscriber] = useState<Partial<Subscriber>>(initialSubscriber || {})\n const [loading, setLoading] = useState(false)\n const [loadingData, setLoadingData] = useState(!initialSubscriber)\n const [error, setError] = useState<string | null>(null)\n const [success, setSuccess] = useState(false)\n\n const styles = {\n container: { ...defaultStyles.container, ...customStyles.container },\n heading: { ...defaultStyles.heading, ...customStyles.heading },\n form: { ...defaultStyles.form, ...customStyles.form },\n section: { ...defaultStyles.section, ...customStyles.section },\n sectionTitle: { ...defaultStyles.sectionTitle, ...customStyles.sectionTitle },\n inputGroup: { ...defaultStyles.inputGroup, ...customStyles.inputGroup },\n label: { ...defaultStyles.label, ...customStyles.label },\n input: { ...defaultStyles.input, ...customStyles.input },\n select: { ...defaultStyles.select, ...customStyles.select },\n checkbox: { ...defaultStyles.checkbox, ...customStyles.checkbox },\n checkboxInput: { ...defaultStyles.checkboxInput, ...customStyles.checkboxInput },\n checkboxLabel: { ...defaultStyles.checkboxLabel, ...customStyles.checkboxLabel },\n buttonGroup: { ...defaultStyles.buttonGroup, ...customStyles.buttonGroup },\n button: { ...defaultStyles.button, ...customStyles.button },\n primaryButton: { ...defaultStyles.primaryButton, ...customStyles.primaryButton },\n secondaryButton: { ...defaultStyles.secondaryButton, ...customStyles.secondaryButton },\n dangerButton: { ...defaultStyles.dangerButton, ...customStyles.dangerButton },\n error: { ...defaultStyles.error, ...customStyles.error },\n success: { ...defaultStyles.success, ...customStyles.success },\n info: { ...defaultStyles.info, ...customStyles.info },\n }\n\n // Fetch current preferences if not provided\n useEffect(() => {\n if (!initialSubscriber && sessionToken) {\n fetchPreferences()\n }\n }, [])\n\n const fetchPreferences = async () => {\n try {\n const response = await fetch(apiEndpoint, {\n headers: {\n 'Authorization': `Bearer ${sessionToken}`,\n },\n })\n\n if (!response.ok) {\n throw new Error('Failed to load preferences')\n }\n\n const data = await response.json()\n setSubscriber(data.subscriber)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load preferences')\n if (onError) {\n onError(err instanceof Error ? err : new Error('Failed to load preferences'))\n }\n } finally {\n setLoadingData(false)\n }\n }\n\n const handleSave = async (e: FormEvent) => {\n e.preventDefault()\n setError(null)\n setSuccess(false)\n setLoading(true)\n\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n },\n body: JSON.stringify({\n name: subscriber.name,\n locale: subscriber.locale,\n emailPreferences: subscriber.emailPreferences,\n }),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n throw new Error(data.error || 'Failed to save preferences')\n }\n\n setSubscriber(data.subscriber)\n setSuccess(true)\n if (onSuccess) {\n onSuccess(data.subscriber)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An error occurred'\n setError(errorMessage)\n if (onError) {\n onError(new Error(errorMessage))\n }\n } finally {\n setLoading(false)\n }\n }\n\n const handleUnsubscribe = async () => {\n if (!window.confirm(labels.unsubscribeConfirm)) {\n return\n }\n\n setLoading(true)\n setError(null)\n\n try {\n const response = await fetch('/api/newsletter/unsubscribe', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${sessionToken}`,\n },\n body: JSON.stringify({\n email: subscriber.email,\n }),\n })\n\n if (!response.ok) {\n throw new Error('Failed to unsubscribe')\n }\n\n setSubscriber({ ...subscriber, subscriptionStatus: 'unsubscribed' })\n if (onSuccess) {\n onSuccess({ ...subscriber, subscriptionStatus: 'unsubscribed' } as Subscriber)\n }\n } catch (err) {\n setError('Failed to unsubscribe. Please try again.')\n if (onError) {\n onError(err instanceof Error ? err : new Error('Failed to unsubscribe'))\n }\n } finally {\n setLoading(false)\n }\n }\n\n if (loadingData) {\n return (\n <div className={className} style={styles.container}>\n <p style={styles.info}>Loading preferences...</p>\n </div>\n )\n }\n\n if (subscriber.subscriptionStatus === 'unsubscribed') {\n return (\n <div className={className} style={styles.container}>\n <h2 style={styles.heading}>Unsubscribed</h2>\n <p style={styles.info}>\n You have been unsubscribed from all emails. \n To resubscribe, please sign up again.\n </p>\n </div>\n )\n }\n\n return (\n <div className={className} style={styles.container}>\n <h2 style={styles.heading}>{labels.title}</h2>\n \n <form onSubmit={handleSave} style={styles.form}>\n <div style={styles.section}>\n <h3 style={styles.sectionTitle}>{labels.personalInfo}</h3>\n \n <div style={styles.inputGroup}>\n <label htmlFor=\"name\" style={styles.label}>\n {labels.name}\n </label>\n <input\n id=\"name\"\n type=\"text\"\n value={subscriber.name || ''}\n onChange={(e) => setSubscriber({ ...subscriber, name: e.target.value })}\n disabled={loading}\n style={styles.input}\n />\n </div>\n\n {locales.length > 1 && (\n <div style={styles.inputGroup}>\n <label htmlFor=\"locale\" style={styles.label}>\n {labels.language}\n </label>\n <select\n id=\"locale\"\n value={subscriber.locale || locales[0]}\n onChange={(e) => setSubscriber({ ...subscriber, locale: e.target.value })}\n disabled={loading}\n style={styles.select}\n >\n {locales.map(locale => (\n <option key={locale} value={locale}>\n {locale.toUpperCase()}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n <div style={styles.section}>\n <h3 style={styles.sectionTitle}>{labels.emailPreferences}</h3>\n \n <div style={styles.checkbox}>\n <input\n id=\"pref-newsletter\"\n type=\"checkbox\"\n checked={subscriber.emailPreferences?.newsletter ?? true}\n onChange={(e) =>\n setSubscriber({\n ...subscriber,\n emailPreferences: {\n ...subscriber.emailPreferences,\n newsletter: e.target.checked,\n },\n })\n }\n disabled={loading}\n style={styles.checkboxInput}\n />\n <label htmlFor=\"pref-newsletter\" style={styles.checkboxLabel}>\n {labels.newsletter}\n </label>\n </div>\n\n <div style={styles.checkbox}>\n <input\n id=\"pref-announcements\"\n type=\"checkbox\"\n checked={subscriber.emailPreferences?.announcements ?? true}\n onChange={(e) =>\n setSubscriber({\n ...subscriber,\n emailPreferences: {\n ...subscriber.emailPreferences,\n announcements: e.target.checked,\n },\n })\n }\n disabled={loading}\n style={styles.checkboxInput}\n />\n <label htmlFor=\"pref-announcements\" style={styles.checkboxLabel}>\n {labels.announcements}\n </label>\n </div>\n </div>\n\n <div style={styles.buttonGroup}>\n <button\n type=\"submit\"\n disabled={loading}\n style={{\n ...styles.button,\n ...styles.primaryButton,\n ...(loading && { opacity: 0.5, cursor: 'not-allowed' }),\n }}\n >\n {loading ? labels.saving : labels.saveButton}\n </button>\n\n {showUnsubscribe && (\n <button\n type=\"button\"\n onClick={handleUnsubscribe}\n disabled={loading}\n style={{\n ...styles.button,\n ...styles.dangerButton,\n ...(loading && { opacity: 0.5, cursor: 'not-allowed' }),\n }}\n >\n {labels.unsubscribeButton}\n </button>\n )}\n </div>\n\n {error && <p style={styles.error}>{error}</p>}\n {success && <p style={styles.success}>{labels.saved}</p>}\n </form>\n </div>\n )\n}\n\n// Factory function for creating custom preferences forms\nexport function createPreferencesForm(\n defaultProps: Partial<PreferencesFormProps>\n): React.FC<PreferencesFormProps> {\n return (props: PreferencesFormProps) => (\n <PreferencesForm {...defaultProps} {...props} />\n )\n}","'use client'\n\nimport React, { useState, useEffect } from 'react'\n\nexport interface MagicLinkVerifyProps {\n token?: string\n onSuccess?: (sessionToken: string, subscriber: any) => void\n onError?: (error: Error) => void\n apiEndpoint?: string\n className?: string\n styles?: {\n container?: React.CSSProperties\n heading?: React.CSSProperties\n message?: React.CSSProperties\n error?: React.CSSProperties\n button?: React.CSSProperties\n }\n labels?: {\n verifying?: string\n success?: string\n error?: string\n expired?: string\n invalid?: string\n redirecting?: string\n tryAgain?: string\n }\n}\n\nconst defaultStyles = {\n container: {\n maxWidth: '400px',\n margin: '4rem auto',\n padding: '2rem',\n textAlign: 'center' as const,\n },\n heading: {\n fontSize: '1.5rem',\n fontWeight: '600',\n marginBottom: '1rem',\n color: '#111827',\n },\n message: {\n fontSize: '1rem',\n color: '#6b7280',\n marginBottom: '1.5rem',\n },\n error: {\n fontSize: '1rem',\n color: '#ef4444',\n marginBottom: '1.5rem',\n },\n button: {\n padding: '0.75rem 1.5rem',\n fontSize: '1rem',\n fontWeight: '500',\n color: '#ffffff',\n backgroundColor: '#3b82f6',\n border: 'none',\n borderRadius: '0.375rem',\n cursor: 'pointer',\n transition: 'background-color 0.2s',\n },\n}\n\nexport const MagicLinkVerify: React.FC<MagicLinkVerifyProps> = ({\n token: propToken,\n onSuccess,\n onError,\n apiEndpoint = '/api/newsletter/verify-magic-link',\n className,\n styles: customStyles = {},\n labels = {\n verifying: 'Verifying your magic link...',\n success: 'Successfully verified! Redirecting...',\n error: 'Failed to verify magic link',\n expired: 'This magic link has expired. Please request a new one.',\n invalid: 'This magic link is invalid. Please request a new one.',\n redirecting: 'Redirecting to your preferences...',\n tryAgain: 'Try Again',\n },\n}) => {\n const [status, setStatus] = useState<'verifying' | 'success' | 'error'>('verifying')\n const [error, setError] = useState<string | null>(null)\n const [_sessionToken, setSessionToken] = useState<string | null>(null)\n\n const styles = {\n container: { ...defaultStyles.container, ...customStyles.container },\n heading: { ...defaultStyles.heading, ...customStyles.heading },\n message: { ...defaultStyles.message, ...customStyles.message },\n error: { ...defaultStyles.error, ...customStyles.error },\n button: { ...defaultStyles.button, ...customStyles.button },\n }\n\n useEffect(() => {\n // Get token from props or URL\n const token = propToken || new URLSearchParams(window.location.search).get('token')\n \n if (token) {\n verifyToken(token)\n } else {\n setStatus('error')\n setError(labels.invalid || 'Invalid magic link')\n }\n }, [propToken])\n\n const verifyToken = async (token: string) => {\n try {\n const response = await fetch(apiEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ token }),\n })\n\n const data = await response.json()\n\n if (!response.ok) {\n if (data.error?.includes('expired')) {\n throw new Error(labels.expired)\n }\n throw new Error(data.error || labels.error)\n }\n\n setStatus('success')\n setSessionToken(data.sessionToken)\n\n // Store session token\n if (typeof window !== 'undefined' && data.sessionToken) {\n localStorage.setItem('newsletter_session', data.sessionToken)\n }\n\n if (onSuccess) {\n onSuccess(data.sessionToken, data.subscriber)\n }\n } catch (err) {\n setStatus('error')\n const errorMessage = err instanceof Error ? err.message : (labels.error || 'Verification failed')\n setError(errorMessage)\n if (onError) {\n onError(err instanceof Error ? err : new Error(errorMessage))\n }\n }\n }\n\n const handleTryAgain = () => {\n window.location.href = '/'\n }\n\n return (\n <div className={className} style={styles.container}>\n {status === 'verifying' && (\n <>\n <h2 style={styles.heading}>Verifying</h2>\n <p style={styles.message}>{labels.verifying}</p>\n </>\n )}\n\n {status === 'success' && (\n <>\n <h2 style={styles.heading}>Success!</h2>\n <p style={styles.message}>{labels.success}</p>\n </>\n )}\n\n {status === 'error' && (\n <>\n <h2 style={styles.heading}>Verification Failed</h2>\n <p style={styles.error}>{error}</p>\n <button onClick={handleTryAgain} style={styles.button}>\n {labels.tryAgain}\n </button>\n </>\n )}\n </div>\n )\n}\n\n// Factory function for creating custom magic link verify components\nexport function createMagicLinkVerify(\n defaultProps: Partial<MagicLinkVerifyProps>\n): React.FC<MagicLinkVerifyProps> {\n return (props: MagicLinkVerifyProps) => (\n <MagicLinkVerify {...defaultProps} {...props} />\n )\n}","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { Subscriber } from '../types'\n\nexport interface UseNewsletterAuthOptions {\n // Reserved for future use\n}\n\nexport interface UseNewsletterAuthReturn {\n subscriber: Subscriber | null\n isAuthenticated: boolean\n isLoading: boolean\n loading: boolean // Alias for backward compatibility\n error: Error | null\n signOut: () => Promise<void>\n logout: () => Promise<void> // Alias for backward compatibility\n refreshAuth: () => Promise<void>\n refreshSubscriber: () => Promise<void> // Alias for backward compatibility\n login: (token: string) => Promise<void> // For backward compatibility\n}\n\nexport function useNewsletterAuth(\n _options: UseNewsletterAuthOptions = {}\n): UseNewsletterAuthReturn {\n const [subscriber, setSubscriber] = useState<Subscriber | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n const checkAuth = useCallback(async () => {\n try {\n const response = await fetch('/api/newsletter/me', {\n method: 'GET',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (response.ok) {\n const data = await response.json()\n setSubscriber(data.subscriber)\n setError(null)\n } else {\n setSubscriber(null)\n if (response.status !== 401) {\n setError(new Error('Failed to check authentication'))\n }\n }\n } catch (err) {\n console.error('Auth check failed:', err)\n setError(err instanceof Error ? err : new Error('An error occurred'))\n setSubscriber(null)\n } finally {\n setIsLoading(false)\n }\n }, [])\n\n useEffect(() => {\n checkAuth()\n }, [checkAuth])\n\n const signOut = useCallback(async () => {\n try {\n const response = await fetch('/api/newsletter/signout', {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (response.ok) {\n setSubscriber(null)\n setError(null)\n } else {\n throw new Error('Failed to sign out')\n }\n } catch (err) {\n console.error('Sign out error:', err)\n setError(err instanceof Error ? err : new Error('Sign out failed'))\n throw err\n }\n }, [])\n\n const refreshAuth = useCallback(async () => {\n setIsLoading(true)\n await checkAuth()\n }, [checkAuth])\n\n // Backward compatibility: login function that accepts a token\n // In the new implementation, authentication is handled via cookies\n const login = useCallback(async (_token: string) => {\n // Token is now handled server-side via cookies\n // Just refresh the auth state\n await refreshAuth()\n }, [refreshAuth])\n\n return {\n subscriber,\n isAuthenticated: !!subscriber,\n isLoading,\n loading: isLoading, // Alias for backward compatibility\n error,\n signOut,\n logout: signOut, // Alias for backward compatibility\n refreshAuth,\n refreshSubscriber: refreshAuth, // Alias for backward compatibility\n login, // For backward compatibility\n }\n}","'use client'\n\nimport React, { useState, useEffect, useRef } from 'react'\nimport type { SerializedEditorState } from 'lexical'\nimport { convertToEmailSafeHtml, replacePersonalizationTags } from '../../utils/emailSafeHtml'\nimport { validateEmailHtml } from '../../utils/validateEmailHtml'\nimport type { NewsletterPluginConfig } from '../../types'\nimport { usePluginConfigOptional } from '../../contexts/PluginConfigContext'\n\ninterface EmailPreviewProps {\n content: SerializedEditorState | null\n subject: string\n preheader?: string\n mode?: 'desktop' | 'mobile'\n onValidation?: (result: { valid: boolean; warnings: string[]; errors: string[] }) => void\n pluginConfig?: NewsletterPluginConfig // Optional prop for direct config passing\n}\n\nconst SAMPLE_DATA = {\n 'subscriber.name': 'John Doe',\n 'subscriber.firstName': 'John',\n 'subscriber.lastName': 'Doe',\n 'subscriber.email': 'john.doe@example.com',\n}\n\nconst VIEWPORT_SIZES = {\n desktop: { width: 600, scale: 1 },\n mobile: { width: 320, scale: 0.8 },\n}\n\nexport const EmailPreview: React.FC<EmailPreviewProps> = ({\n content,\n subject,\n preheader,\n mode = 'desktop',\n onValidation,\n pluginConfig: propPluginConfig,\n}) => {\n // Use plugin config from prop or context\n const contextPluginConfig = usePluginConfigOptional()\n const pluginConfig = propPluginConfig || contextPluginConfig\n const [html, setHtml] = useState<string>('')\n const [loading, setLoading] = useState(false)\n const [validationResult, setValidationResult] = useState<ReturnType<typeof validateEmailHtml> | null>(null)\n const iframeRef = useRef<HTMLIFrameElement>(null)\n\n // Convert content to HTML whenever it changes\n useEffect(() => {\n const convertContent = async () => {\n if (!content) {\n setHtml('')\n return\n }\n\n setLoading(true)\n try {\n // Get email preview customization options\n const emailPreviewConfig = pluginConfig?.customizations?.broadcasts?.emailPreview\n \n // Convert to email-safe HTML with customization options\n const emailHtml = await convertToEmailSafeHtml(content, {\n wrapInTemplate: emailPreviewConfig?.wrapInTemplate ?? true,\n preheader,\n subject,\n customWrapper: emailPreviewConfig?.customWrapper,\n customBlockConverter: pluginConfig?.customizations?.broadcasts?.customBlockConverter,\n })\n\n // Replace personalization tags with sample data\n const personalizedHtml = replacePersonalizationTags(emailHtml, SAMPLE_DATA)\n\n // Add email header to the preview\n const previewHtml = addEmailHeader(personalizedHtml, {\n subject,\n from: 'Newsletter <noreply@example.com>',\n to: SAMPLE_DATA['subscriber.email'],\n })\n\n setHtml(previewHtml)\n\n // Validate the HTML\n const validation = validateEmailHtml(emailHtml)\n setValidationResult(validation)\n onValidation?.(validation)\n } catch (error) {\n console.error('Failed to convert content to HTML:', error)\n setHtml('<p>Error converting content to HTML</p>')\n } finally {\n setLoading(false)\n }\n }\n\n convertContent()\n }, [content, subject, preheader, onValidation, pluginConfig])\n\n // Update iframe content when HTML changes\n useEffect(() => {\n if (iframeRef.current && html) {\n const doc = iframeRef.current.contentDocument\n if (doc) {\n doc.open()\n doc.write(html)\n doc.close()\n }\n }\n }, [html])\n\n const viewport = VIEWPORT_SIZES[mode]\n\n return (\n <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>\n {/* Validation Messages */}\n {validationResult && (validationResult.errors.length > 0 || validationResult.warnings.length > 0) && (\n <div style={{ padding: '16px', borderBottom: '1px solid #e5e7eb' }}>\n {validationResult.errors.length > 0 && (\n <div style={{ marginBottom: '12px' }}>\n <h4 style={{ color: '#dc2626', margin: '0 0 8px 0', fontSize: '14px' }}>\n Errors ({validationResult.errors.length})\n </h4>\n <ul style={{ margin: 0, paddingLeft: '20px', fontSize: '13px', color: '#dc2626' }}>\n {validationResult.errors.map((error, index) => (\n <li key={index}>{error}</li>\n ))}\n </ul>\n </div>\n )}\n \n {validationResult.warnings.length > 0 && (\n <div>\n <h4 style={{ color: '#d97706', margin: '0 0 8px 0', fontSize: '14px' }}>\n Warnings ({validationResult.warnings.length})\n </h4>\n <ul style={{ margin: 0, paddingLeft: '20px', fontSize: '13px', color: '#d97706' }}>\n {validationResult.warnings.map((warning, index) => (\n <li key={index}>{warning}</li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n\n {/* Preview Frame */}\n <div style={{ \n flex: 1, \n display: 'flex', \n alignItems: 'center', \n justifyContent: 'center',\n backgroundColor: '#f3f4f6',\n padding: '20px',\n overflow: 'auto',\n }}>\n {loading ? (\n <div style={{ textAlign: 'center', color: '#6b7280' }}>\n <p>Loading preview...</p>\n </div>\n ) : html ? (\n <div style={{\n backgroundColor: 'white',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n borderRadius: '8px',\n overflow: 'hidden',\n transform: `scale(${viewport.scale})`,\n transformOrigin: 'top center',\n }}>\n <iframe\n ref={iframeRef}\n title=\"Email Preview\"\n style={{\n width: `${viewport.width}px`,\n height: '800px',\n border: 'none',\n display: 'block',\n }}\n sandbox=\"allow-same-origin\"\n />\n </div>\n ) : (\n <div style={{ textAlign: 'center', color: '#6b7280' }}>\n <p>Start typing to see the email preview</p>\n </div>\n )}\n </div>\n\n {/* Stats Bar */}\n {validationResult && (\n <div style={{ \n padding: '12px 16px', \n borderTop: '1px solid #e5e7eb',\n fontSize: '13px',\n color: '#6b7280',\n display: 'flex',\n gap: '24px',\n }}>\n <span>Size: {Math.round(validationResult.stats.sizeInBytes / 1024)}KB</span>\n <span>Links: {validationResult.stats.linkCount}</span>\n <span>Images: {validationResult.stats.imageCount}</span>\n <span>Viewport: {mode === 'desktop' ? '600px' : '320px'}</span>\n </div>\n )}\n </div>\n )\n}\n\n/**\n * Add email header for preview\n */\nfunction addEmailHeader(html: string, headers: {\n subject: string\n from: string\n to: string\n}): string {\n const headerHtml = `\n <div style=\"background-color: #f9fafb; border-bottom: 1px solid #e5e7eb; padding: 16px; font-family: monospace; font-size: 13px;\">\n <div style=\"margin-bottom: 8px;\"><strong>Subject:</strong> ${escapeHtml(headers.subject)}</div>\n <div style=\"margin-bottom: 8px;\"><strong>From:</strong> ${escapeHtml(headers.from)}</div>\n <div><strong>To:</strong> ${escapeHtml(headers.to)}</div>\n </div>\n `\n\n // Insert header after <body> tag\n return html.replace(/<body[^>]*>/, `$&${headerHtml}`)\n}\n\n/**\n * Escape HTML for display\n */\nfunction escapeHtml(text: string): string {\n const div = document.createElement('div')\n div.textContent = text\n return div.innerHTML\n}","import DOMPurify from 'isomorphic-dompurify'\nimport type { SerializedEditorState } from 'lexical'\n\n/**\n * DOMPurify configuration for email-safe HTML\n */\nexport const EMAIL_SAFE_CONFIG = {\n ALLOWED_TAGS: [\n 'p', 'br', 'strong', 'b', 'em', 'i', 'u', 'strike', 's', 'span',\n 'a', 'h1', 'h2', 'h3', 'ul', 'ol', 'li', 'blockquote', 'hr',\n 'img', 'div', 'table', 'tr', 'td', 'th', 'tbody', 'thead'\n ],\n ALLOWED_ATTR: ['href', 'style', 'target', 'rel', 'align', 'src', 'alt', 'width', 'height', 'border', 'cellpadding', 'cellspacing'],\n ALLOWED_STYLES: {\n '*': [\n 'color', 'background-color', 'font-size', 'font-weight',\n 'font-style', 'text-decoration', 'text-align', 'margin',\n 'margin-top', 'margin-right', 'margin-bottom', 'margin-left',\n 'padding', 'padding-top', 'padding-right', 'padding-bottom', \n 'padding-left', 'line-height', 'border-left', 'border-left-width',\n 'border-left-style', 'border-left-color'\n ],\n },\n FORBID_TAGS: ['script', 'style', 'iframe', 'object', 'embed', 'form', 'input'],\n FORBID_ATTR: ['class', 'id', 'onclick', 'onload', 'onerror'],\n}\n\n/**\n * Converts Lexical editor state to email-safe HTML\n */\nexport async function convertToEmailSafeHtml(\n editorState: SerializedEditorState | undefined | null,\n options?: {\n wrapInTemplate?: boolean\n preheader?: string\n mediaUrl?: string // Base URL for media files\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n payload?: any // Payload instance for populating relationships\n populateFields?: string[] | ((blockType: string) => string[]) // Fields to populate\n customWrapper?: (content: string, options?: { preheader?: string; subject?: string }) => string | Promise<string>\n subject?: string // Email subject for custom wrapper\n }\n): Promise<string> {\n // Handle empty content\n if (!editorState) {\n return ''\n }\n \n // First, convert Lexical state to HTML using custom converters\n const rawHtml = await lexicalToEmailHtml(editorState, options?.mediaUrl, options?.customBlockConverter)\n \n // Sanitize the HTML\n const sanitizedHtml = DOMPurify.sanitize(rawHtml, EMAIL_SAFE_CONFIG)\n \n // Optionally wrap in email template\n if (options?.wrapInTemplate) {\n if (options.customWrapper) {\n return await Promise.resolve(options.customWrapper(sanitizedHtml, { \n preheader: options.preheader,\n subject: options.subject \n }))\n }\n return wrapInEmailTemplate(sanitizedHtml, options.preheader)\n }\n \n return sanitizedHtml\n}\n\n/**\n * Custom Lexical to HTML converter for email\n */\nasync function lexicalToEmailHtml(\n editorState: SerializedEditorState, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const { root } = editorState\n \n if (!root || !root.children) {\n return ''\n }\n \n // Convert nodes asynchronously to support custom converters\n const htmlParts = await Promise.all(\n root.children.map((node: any) => convertNode(node, mediaUrl, customBlockConverter))\n )\n \n return htmlParts.join('')\n}\n\n/**\n * Convert individual Lexical nodes to email-safe HTML\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertNode(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n switch (node.type) {\n case 'paragraph':\n return convertParagraph(node, mediaUrl, customBlockConverter)\n case 'heading':\n return convertHeading(node, mediaUrl, customBlockConverter)\n case 'list':\n return convertList(node, mediaUrl, customBlockConverter)\n case 'listitem':\n return convertListItem(node, mediaUrl, customBlockConverter)\n case 'blockquote':\n return convertBlockquote(node, mediaUrl, customBlockConverter)\n case 'text':\n return convertText(node)\n case 'link':\n return convertLink(node, mediaUrl, customBlockConverter)\n case 'linebreak':\n return '<br>'\n case 'upload':\n return convertUpload(node, mediaUrl)\n case 'block':\n return await convertBlock(node, mediaUrl, customBlockConverter)\n default:\n // Unknown node type - convert children if any\n if (node.children) {\n const childParts = await Promise.all(\n node.children.map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n return childParts.join('')\n }\n return ''\n }\n}\n\n/**\n * Convert paragraph node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertParagraph(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const align = getAlignment(node.format)\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n \n if (!children.trim()) {\n return '<p class=\"mobile-margin-bottom-16\" style=\"margin: 0 0 16px 0; min-height: 1em;\"> </p>'\n }\n \n return `<p class=\"mobile-margin-bottom-16\" style=\"margin: 0 0 16px 0; text-align: ${align}; font-size: 16px; line-height: 1.5;\">${children}</p>`\n}\n\n/**\n * Convert heading node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertHeading(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const tag = node.tag || 'h1'\n const align = getAlignment(node.format)\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n \n const styles: Record<string, string> = {\n h1: 'font-size: 32px; font-weight: 700; margin: 0 0 24px 0; line-height: 1.2;',\n h2: 'font-size: 24px; font-weight: 600; margin: 0 0 16px 0; line-height: 1.3;',\n h3: 'font-size: 20px; font-weight: 600; margin: 0 0 12px 0; line-height: 1.4;',\n }\n \n const mobileClasses: Record<string, string> = {\n h1: 'mobile-font-size-24',\n h2: 'mobile-font-size-20',\n h3: 'mobile-font-size-16',\n }\n \n const style = `${styles[tag] || styles.h3} text-align: ${align};`\n const mobileClass = mobileClasses[tag] || mobileClasses.h3\n \n return `<${tag} class=\"${mobileClass}\" style=\"${style}\">${children}</${tag}>`\n}\n\n/**\n * Convert list node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertList(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const tag = node.listType === 'number' ? 'ol' : 'ul'\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n \n const style = tag === 'ul' \n ? 'margin: 0 0 16px 0; padding-left: 24px; list-style-type: disc; font-size: 16px; line-height: 1.5;'\n : 'margin: 0 0 16px 0; padding-left: 24px; list-style-type: decimal; font-size: 16px; line-height: 1.5;'\n \n return `<${tag} class=\"mobile-margin-bottom-16\" style=\"${style}\">${children}</${tag}>`\n}\n\n/**\n * Convert list item node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertListItem(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n return `<li style=\"margin: 0 0 8px 0;\">${children}</li>`\n}\n\n/**\n * Convert blockquote node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertBlockquote(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n const style = 'margin: 0 0 16px 0; padding-left: 16px; border-left: 4px solid #e5e7eb; color: #6b7280;'\n \n return `<blockquote style=\"${style}\">${children}</blockquote>`\n}\n\n/**\n * Convert text node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertText(node: any): string {\n let text = escapeHtml(node.text || '')\n \n // Apply formatting\n if (node.format & 1) { // Bold\n text = `<strong>${text}</strong>`\n }\n if (node.format & 2) { // Italic\n text = `<em>${text}</em>`\n }\n if (node.format & 8) { // Underline\n text = `<u>${text}</u>`\n }\n if (node.format & 4) { // Strikethrough\n text = `<strike>${text}</strike>`\n }\n \n return text\n}\n\n/**\n * Convert link node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertLink(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const childParts = await Promise.all(\n (node.children || []).map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n const children = childParts.join('')\n const url = node.fields?.url || '#'\n const newTab = node.fields?.newTab ?? false\n \n // Add target and rel attributes based on newTab setting\n const targetAttr = newTab ? ' target=\"_blank\"' : ''\n const relAttr = newTab ? ' rel=\"noopener noreferrer\"' : ''\n \n return `<a href=\"${escapeHtml(url)}\"${targetAttr}${relAttr} style=\"color: #2563eb; text-decoration: underline;\">${children}</a>`\n}\n\n/**\n * Convert upload (image) node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertUpload(node: any, mediaUrl?: string): string {\n const upload = node.value\n if (!upload) return ''\n \n // Get image URL - handle both direct URL and media object\n let src = ''\n if (typeof upload === 'string') {\n src = upload\n } else if (upload.url) {\n src = upload.url\n } else if (upload.filename && mediaUrl) {\n // Construct URL from media URL and filename\n src = `${mediaUrl}/${upload.filename}`\n }\n \n const alt = node.fields?.altText || upload.alt || ''\n const caption = node.fields?.caption || ''\n \n // Responsive email-safe image\n const imgHtml = `<img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(alt)}\" class=\"mobile-width-100\" style=\"max-width: 100%; height: auto; display: block; margin: 0 auto; border-radius: 6px;\" />`\n \n if (caption) {\n return `\n <div style=\"margin: 0 0 16px 0; text-align: center;\" class=\"mobile-margin-bottom-16\">\n ${imgHtml}\n <p style=\"margin: 8px 0 0 0; font-size: 14px; color: #6b7280; font-style: italic; text-align: center;\" class=\"mobile-font-size-14\">${escapeHtml(caption)}</p>\n </div>\n `\n }\n \n return `<div style=\"margin: 0 0 16px 0; text-align: center;\" class=\"mobile-margin-bottom-16\">${imgHtml}</div>`\n}\n\n/**\n * Convert custom block node\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function convertBlock(\n node: any, \n mediaUrl?: string,\n customBlockConverter?: (node: any, mediaUrl?: string) => Promise<string>\n): Promise<string> {\n const blockType = node.fields?.blockName || node.blockName\n \n // First, check if there's a custom converter for this block\n if (customBlockConverter) {\n try {\n const customHtml = await customBlockConverter(node, mediaUrl)\n if (customHtml) {\n return customHtml\n }\n } catch (error) {\n console.error(`Custom block converter error for ${blockType}:`, error)\n // Fall through to default handling\n }\n }\n \n // Default handling for built-in blocks\n switch (blockType) {\n case 'button':\n return convertButtonBlock(node.fields)\n case 'divider':\n return convertDividerBlock(node.fields)\n default:\n // Unknown block type - try to convert children\n if (node.children) {\n const childParts = await Promise.all(\n node.children.map((child: any) => convertNode(child, mediaUrl, customBlockConverter))\n )\n return childParts.join('')\n }\n return ''\n }\n}\n\n/**\n * Convert button block\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertButtonBlock(fields: any): string {\n const text = fields?.text || 'Click here'\n const url = fields?.url || '#'\n const style = fields?.style || 'primary'\n \n const styles: Record<string, string> = {\n primary: 'background-color: #2563eb; color: #ffffff; border: 2px solid #2563eb;',\n secondary: 'background-color: #6b7280; color: #ffffff; border: 2px solid #6b7280;',\n outline: 'background-color: transparent; color: #2563eb; border: 2px solid #2563eb;',\n }\n \n const buttonStyle = `${styles[style] || styles.primary} display: inline-block; padding: 12px 24px; font-size: 16px; font-weight: 600; text-decoration: none; border-radius: 6px; text-align: center;`\n \n return `\n <div style=\"margin: 0 0 16px 0; text-align: center;\">\n <a href=\"${escapeHtml(url)}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"${buttonStyle}\">${escapeHtml(text)}</a>\n </div>\n `\n}\n\n/**\n * Convert divider block\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction convertDividerBlock(fields: any): string {\n const style = fields?.style || 'solid'\n \n const styles: Record<string, string> = {\n solid: 'border-top: 1px solid #e5e7eb;',\n dashed: 'border-top: 1px dashed #e5e7eb;',\n dotted: 'border-top: 1px dotted #e5e7eb;',\n }\n \n return `<hr style=\"${styles[style] || styles.solid} margin: 24px 0; border-bottom: none; border-left: none; border-right: none;\" />`\n}\n\n/**\n * Get text alignment from format number\n */\nfunction getAlignment(format?: number): string {\n if (!format) return 'left'\n \n // Lexical alignment format values\n if (format & 2) return 'center'\n if (format & 3) return 'right'\n if (format & 4) return 'justify'\n \n return 'left'\n}\n\n/**\n * Escape HTML special characters\n */\nfunction escapeHtml(text: string): string {\n const map: Record<string, string> = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n }\n \n return text.replace(/[&<>\"']/g, m => map[m])\n}\n\n/**\n * Wrap content in a responsive email template\n */\nfunction wrapInEmailTemplate(content: string, preheader?: string): string {\n return `<!DOCTYPE html>\n<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n <meta name=\"x-apple-disable-message-reformatting\">\n <title>Newsletter</title>\n \n <!--[if mso]>\n <noscript>\n <xml>\n <o:OfficeDocumentSettings>\n <o:PixelsPerInch>96</o:PixelsPerInch>\n </o:OfficeDocumentSettings>\n </xml>\n </noscript>\n <![endif]-->\n \n <style>\n /* Reset and base styles */\n * {\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n }\n \n body {\n margin: 0 !important;\n padding: 0 !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\n font-size: 16px;\n line-height: 1.5;\n color: #1A1A1A;\n background-color: #f8f9fa;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n \n table {\n border-spacing: 0 !important;\n border-collapse: collapse !important;\n table-layout: fixed !important;\n margin: 0 auto !important;\n }\n \n table table table {\n table-layout: auto;\n }\n \n img {\n -ms-interpolation-mode: bicubic;\n max-width: 100%;\n height: auto;\n border: 0;\n outline: none;\n text-decoration: none;\n }\n \n /* Responsive styles */\n @media only screen and (max-width: 640px) {\n .mobile-hide {\n display: none !important;\n }\n \n .mobile-center {\n text-align: center !important;\n }\n \n .mobile-width-100 {\n width: 100% !important;\n max-width: 100% !important;\n }\n \n .mobile-padding {\n padding: 20px !important;\n }\n \n .mobile-padding-sm {\n padding: 16px !important;\n }\n \n .mobile-font-size-14 {\n font-size: 14px !important;\n }\n \n .mobile-font-size-16 {\n font-size: 16px !important;\n }\n \n .mobile-font-size-20 {\n font-size: 20px !important;\n line-height: 1.3 !important;\n }\n \n .mobile-font-size-24 {\n font-size: 24px !important;\n line-height: 1.2 !important;\n }\n \n /* Stack sections on mobile */\n .mobile-stack {\n display: block !important;\n width: 100% !important;\n }\n \n /* Mobile-specific spacing */\n .mobile-margin-bottom-16 {\n margin-bottom: 16px !important;\n }\n \n .mobile-margin-bottom-20 {\n margin-bottom: 20px !important;\n }\n }\n \n /* Dark mode support */\n @media (prefers-color-scheme: dark) {\n .dark-mode-bg {\n background-color: #1a1a1a !important;\n }\n \n .dark-mode-text {\n color: #ffffff !important;\n }\n \n .dark-mode-border {\n border-color: #333333 !important;\n }\n }\n \n /* Outlook-specific fixes */\n <!--[if mso]>\n <style>\n table {\n border-collapse: collapse;\n border-spacing: 0;\n border: none;\n margin: 0;\n }\n \n div, p {\n margin: 0;\n }\n </style>\n <![endif]-->\n </style>\n</head>\n<body style=\"margin: 0; padding: 0; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif; font-size: 16px; line-height: 1.5; color: #1A1A1A; background-color: #f8f9fa;\">\n ${preheader ? `\n <!-- Preheader text -->\n <div style=\"display: none; max-height: 0; overflow: hidden; font-size: 1px; line-height: 1px; color: transparent;\">\n ${escapeHtml(preheader)}\n </div>\n ` : ''}\n \n <!-- Main container -->\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\" style=\"margin: 0; padding: 0; background-color: #f8f9fa;\">\n <tr>\n <td align=\"center\" style=\"padding: 20px 10px;\">\n <!-- Email wrapper -->\n <table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" width=\"600\" class=\"mobile-width-100\" style=\"margin: 0 auto; max-width: 600px;\">\n <tr>\n <td class=\"mobile-padding\" style=\"padding: 0;\">\n <!-- Content area with light background -->\n <div style=\"background-color: #ffffff; padding: 40px 30px; border-radius: 8px;\" class=\"mobile-padding\">\n ${content}\n </div>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n</body>\n</html>`\n}\n\n/**\n * Extract personalization tags from content\n */\nexport function extractPersonalizationTags(html: string): string[] {\n const regex = /\\{\\{([^}]+)\\}\\}/g\n const tags: string[] = []\n let match\n \n while ((match = regex.exec(html)) !== null) {\n tags.push(match[1].trim())\n }\n \n return [...new Set(tags)]\n}\n\n/**\n * Replace personalization tags with sample data\n */\nexport function replacePersonalizationTags(\n html: string, \n sampleData: Record<string, string>\n): string {\n return html.replace(/\\{\\{([^}]+)\\}\\}/g, (match, tag) => {\n const trimmedTag = tag.trim()\n return sampleData[trimmedTag] || match\n })\n}","/**\n * Email HTML validation utilities\n */\n\nexport interface ValidationResult {\n valid: boolean\n warnings: string[]\n errors: string[]\n stats: {\n sizeInBytes: number\n imageCount: number\n linkCount: number\n hasExternalStyles: boolean\n hasJavaScript: boolean\n }\n}\n\n/**\n * Validate HTML for email compatibility\n */\nexport function validateEmailHtml(html: string): ValidationResult {\n const warnings: string[] = []\n const errors: string[] = []\n \n // Calculate size\n const sizeInBytes = new Blob([html]).size\n \n // Check size limits\n if (sizeInBytes > 102400) { // 100KB\n warnings.push(`Email size (${Math.round(sizeInBytes / 1024)}KB) exceeds Gmail's 102KB limit - email may be clipped`)\n }\n \n // Check for problematic CSS\n if (html.includes('position:') && (html.includes('position: absolute') || html.includes('position: fixed'))) {\n errors.push('Absolute/fixed positioning is not supported in most email clients')\n }\n \n if (html.includes('display: flex') || html.includes('display: grid')) {\n errors.push('Flexbox and Grid layouts are not supported in many email clients')\n }\n \n if (html.includes('@media')) {\n warnings.push('Media queries may not work in all email clients')\n }\n \n // Check for JavaScript\n const hasJavaScript = \n html.includes('<script') || \n html.includes('onclick') || \n html.includes('onload') ||\n html.includes('javascript:')\n \n if (hasJavaScript) {\n errors.push('JavaScript is not supported in email and will be stripped by email clients')\n }\n \n // Check for external styles\n const hasExternalStyles = html.includes('<link') && html.includes('stylesheet')\n if (hasExternalStyles) {\n errors.push('External stylesheets are not supported - use inline styles only')\n }\n \n // Check for forms\n if (html.includes('<form') || html.includes('<input') || html.includes('<button')) {\n errors.push('Forms and form elements are not reliably supported in email')\n }\n \n // Check for unsupported tags\n const unsupportedTags = [\n 'video', 'audio', 'iframe', 'embed', 'object', 'canvas', 'svg'\n ]\n \n for (const tag of unsupportedTags) {\n if (html.includes(`<${tag}`)) {\n errors.push(`<${tag}> tags are not supported in email`)\n }\n }\n \n // Count images and links\n const imageCount = (html.match(/<img/g) || []).length\n const linkCount = (html.match(/<a/g) || []).length\n \n // Check image usage\n if (imageCount > 20) {\n warnings.push(`High number of images (${imageCount}) may affect email performance`)\n }\n \n // Check for missing alt text\n const imagesWithoutAlt = (html.match(/<img(?![^>]*\\balt\\s*=)[^>]*>/g) || []).length\n if (imagesWithoutAlt > 0) {\n warnings.push(`${imagesWithoutAlt} image(s) missing alt text - important for accessibility`)\n }\n \n // Check for proper link attributes\n const linksWithoutTarget = (html.match(/<a(?![^>]*\\btarget\\s*=)[^>]*>/g) || []).length\n if (linksWithoutTarget > 0) {\n warnings.push(`${linksWithoutTarget} link(s) missing target=\"_blank\" attribute`)\n }\n \n // Check for CSS property usage\n if (html.includes('margin: auto') || html.includes('margin:auto')) {\n warnings.push('margin: auto is not supported in Outlook - use align=\"center\" or tables for centering')\n }\n \n if (html.includes('background-image')) {\n warnings.push('Background images are not reliably supported - consider using <img> tags instead')\n }\n \n // Check for rem/em units\n if (html.match(/\\d+\\s*(rem|em)/)) {\n warnings.push('rem/em units may render inconsistently - use px for reliable sizing')\n }\n \n // Check for negative margins\n if (html.match(/margin[^:]*:\\s*-\\d+/)) {\n errors.push('Negative margins are not supported in many email clients')\n }\n \n // Validate personalization tags\n const personalizationTags = html.match(/\\{\\{([^}]+)\\}\\}/g) || []\n const validTags = ['subscriber.name', 'subscriber.email', 'subscriber.firstName', 'subscriber.lastName']\n \n for (const tag of personalizationTags) {\n const tagContent = tag.replace(/[{}]/g, '').trim()\n if (!validTags.includes(tagContent)) {\n warnings.push(`Unknown personalization tag: ${tag}`)\n }\n }\n \n return {\n valid: errors.length === 0,\n warnings,\n errors,\n stats: {\n sizeInBytes,\n imageCount,\n linkCount,\n hasExternalStyles,\n hasJavaScript,\n }\n }\n}\n\n/**\n * Get email client compatibility warnings for specific HTML\n */\nexport function getClientCompatibilityWarnings(html: string): Record<string, string[]> {\n const warnings: Record<string, string[]> = {\n gmail: [],\n outlook: [],\n appleMail: [],\n mobile: [],\n }\n \n // Gmail specific\n if (html.includes('<style')) {\n warnings.gmail.push('Gmail may strip <style> tags in some contexts')\n }\n \n // Outlook specific\n if (html.includes('margin: auto') || html.includes('margin:auto')) {\n warnings.outlook.push('Outlook does not support margin: auto')\n }\n \n if (html.includes('padding') && html.includes('<p')) {\n warnings.outlook.push('Outlook may not respect padding on <p> tags')\n }\n \n if (html.includes('background-image')) {\n warnings.outlook.push('Outlook has limited background image support')\n }\n \n // Mobile specific\n const hasSmallText = html.match(/font-size:\\s*(\\d+)px/g)?.some(match => {\n const size = parseInt(match.match(/\\d+/)?.[0] || '16')\n return size < 14\n })\n \n if (hasSmallText) {\n warnings.mobile.push('Text smaller than 14px may be hard to read on mobile')\n }\n \n const hasSmallLinks = html.match(/<a[^>]*>[^<]{1,3}<\\/a>/g)\n if (hasSmallLinks) {\n warnings.mobile.push('Short link text may be hard to tap on mobile devices')\n }\n \n return warnings\n}\n\n/**\n * Suggest fixes for common email HTML issues\n */\nexport function suggestFixes(html: string): string[] {\n const suggestions: string[] = []\n \n if (html.includes('display: flex')) {\n suggestions.push('Replace flexbox with table-based layouts for better email client support')\n }\n \n if (html.includes('position: absolute')) {\n suggestions.push('Use table cells or margins instead of absolute positioning')\n }\n \n if (html.match(/\\d+rem/) || html.match(/\\d+em/)) {\n suggestions.push('Convert rem/em units to px for consistent rendering')\n }\n \n if (!html.includes('<!DOCTYPE')) {\n suggestions.push('Add <!DOCTYPE html> declaration for better rendering')\n }\n \n if (!html.includes('charset')) {\n suggestions.push('Add <meta charset=\"UTF-8\"> for proper character encoding')\n }\n \n return suggestions\n}","'use client'\n\nimport React, { createContext, useContext } from 'react'\nimport type { NewsletterPluginConfig } from '../types'\n\nconst PluginConfigContext = createContext<NewsletterPluginConfig | null>(null)\n\nexport const PluginConfigProvider: React.FC<{\n config: NewsletterPluginConfig\n children: React.ReactNode\n}> = ({ config, children }) => {\n return (\n <PluginConfigContext.Provider value={config}>\n {children}\n </PluginConfigContext.Provider>\n )\n}\n\nexport const usePluginConfig = () => {\n const config = useContext(PluginConfigContext)\n if (!config) {\n throw new Error('usePluginConfig must be used within PluginConfigProvider')\n }\n return config\n}\n\n/**\n * Hook to safely access plugin config without throwing if context is not available\n * This is useful for components that might be used outside of the plugin context\n */\nexport const usePluginConfigOptional = () => {\n return useContext(PluginConfigContext)\n}","'use client'\n\nimport React, { useState } from 'react'\nimport { useFormFields } from '@payloadcms/ui'\nimport { EmailPreview } from './EmailPreview'\nimport { usePluginConfigOptional } from '../../contexts/PluginConfigContext'\nimport type { SerializedEditorState } from 'lexical'\n\nexport const EmailPreviewField: React.FC = () => {\n const [previewMode, setPreviewMode] = useState<'desktop' | 'mobile'>('desktop')\n const [isValid, setIsValid] = useState(true)\n const [validationSummary, setValidationSummary] = useState<string>('')\n \n // Get plugin config from context\n const pluginConfig = usePluginConfigOptional()\n\n // Get form fields for preview\n const fields = useFormFields(([fields]) => ({\n content: fields['contentSection.content'],\n subject: fields['subject'],\n preheader: fields['contentSection.preheader'],\n channel: fields.channel,\n }))\n\n // Handle validation results from preview\n const handleValidation = (result: {\n valid: boolean\n warnings: string[]\n errors: string[]\n }) => {\n setIsValid(result.valid)\n \n const errorCount = result.errors.length\n const warningCount = result.warnings.length\n \n if (errorCount > 0) {\n setValidationSummary(`${errorCount} error${errorCount !== 1 ? 's' : ''}, ${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n } else if (warningCount > 0) {\n setValidationSummary(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n } else {\n setValidationSummary('')\n }\n }\n\n // Test email handler\n const handleTestEmail = async () => {\n // Get the current form ID from the URL\n const pathParts = window.location.pathname.split('/')\n const broadcastId = pathParts[pathParts.length - 1]\n \n if (!broadcastId || broadcastId === 'create') {\n alert('Please save the broadcast before sending a test email')\n return\n }\n\n try {\n const response = await fetch(`/api/broadcasts/${broadcastId}/test`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const data = await response.json()\n throw new Error(data.error || 'Failed to send test email')\n }\n\n alert('Test email sent successfully! Check your inbox.')\n } catch (error) {\n alert(error instanceof Error ? error.message : 'Failed to send test email')\n }\n }\n\n return (\n <div style={{\n marginTop: '24px',\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n overflow: 'hidden',\n }}>\n {/* Toolbar */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n borderBottom: '1px solid #e5e7eb',\n backgroundColor: '#f9fafb',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n <h3 style={{ margin: 0, fontSize: '16px', fontWeight: 600 }}>Email Preview</h3>\n\n {/* Preview Mode */}\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={() => setPreviewMode('desktop')}\n style={{\n padding: '6px 12px',\n backgroundColor: previewMode === 'desktop' ? '#6366f1' : '#e5e7eb',\n color: previewMode === 'desktop' ? 'white' : '#374151',\n border: 'none',\n borderRadius: '4px 0 0 4px',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Desktop\n </button>\n <button\n type=\"button\"\n onClick={() => setPreviewMode('mobile')}\n style={{\n padding: '6px 12px',\n backgroundColor: previewMode === 'mobile' ? '#6366f1' : '#e5e7eb',\n color: previewMode === 'mobile' ? 'white' : '#374151',\n border: 'none',\n borderRadius: '0 4px 4px 0',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Mobile\n </button>\n </div>\n\n {/* Validation Status */}\n {validationSummary && (\n <div style={{\n padding: '6px 12px',\n backgroundColor: isValid ? '#fef3c7' : '#fee2e2',\n color: isValid ? '#92400e' : '#991b1b',\n borderRadius: '4px',\n fontSize: '13px',\n }}>\n {validationSummary}\n </div>\n )}\n </div>\n\n {/* Test Email Button */}\n <button\n type=\"button\"\n onClick={handleTestEmail}\n style={{\n padding: '6px 12px',\n backgroundColor: '#10b981',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Send Test Email\n </button>\n </div>\n\n {/* Preview */}\n <div style={{ height: '600px' }}>\n <EmailPreview\n content={fields.content?.value as SerializedEditorState || null}\n subject={fields.subject?.value as string || 'Email Subject'}\n preheader={fields.preheader?.value as string}\n mode={previewMode}\n onValidation={handleValidation}\n pluginConfig={pluginConfig || undefined}\n />\n </div>\n </div>\n )\n}","'use client'\n\nimport React, { useState, useCallback } from 'react'\nimport type { RichTextField } from 'payload'\nimport { useField, useFormFields } from '@payloadcms/ui'\nimport { EmailPreview } from './EmailPreview'\nimport type { SerializedEditorState } from 'lexical'\n\ninterface BroadcastEditorProps {\n field: RichTextField\n path: string\n}\n\nexport const BroadcastEditor: React.FC<BroadcastEditorProps> = (props) => {\n const { value } = useField<SerializedEditorState>({ path: props.path })\n const [showPreview, setShowPreview] = useState(true)\n const [previewMode, setPreviewMode] = useState<'desktop' | 'mobile'>('desktop')\n const [isValid, setIsValid] = useState(true)\n const [validationSummary, setValidationSummary] = useState<string>('')\n\n // Get other form fields for preview\n const fields = useFormFields(([fields]) => ({\n subject: fields['subject'],\n preheader: fields['contentSection.preheader'],\n }))\n\n // Handle validation results from preview\n const handleValidation = useCallback((result: {\n valid: boolean\n warnings: string[]\n errors: string[]\n }) => {\n setIsValid(result.valid)\n \n const errorCount = result.errors.length\n const warningCount = result.warnings.length\n \n if (errorCount > 0) {\n setValidationSummary(`${errorCount} error${errorCount !== 1 ? 's' : ''}, ${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n } else if (warningCount > 0) {\n setValidationSummary(`${warningCount} warning${warningCount !== 1 ? 's' : ''}`)\n } else {\n setValidationSummary('')\n }\n }, [])\n\n // Test email handler\n const handleTestEmail = async () => {\n // Get the current form ID from the URL\n const pathParts = window.location.pathname.split('/')\n const broadcastId = pathParts[pathParts.length - 1]\n \n if (!broadcastId || broadcastId === 'create') {\n alert('Please save the broadcast before sending a test email')\n return\n }\n\n try {\n const response = await fetch(`/api/broadcasts/${broadcastId}/test`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n })\n\n if (!response.ok) {\n const data = await response.json()\n throw new Error(data.error || 'Failed to send test email')\n }\n\n alert('Test email sent successfully! Check your inbox.')\n } catch (error) {\n alert(error instanceof Error ? error.message : 'Failed to send test email')\n }\n }\n\n return (\n <div style={{ height: '600px', display: 'flex', flexDirection: 'column' }}>\n {/* Toolbar */}\n <div style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '12px 16px',\n borderBottom: '1px solid #e5e7eb',\n backgroundColor: '#f9fafb',\n }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '16px' }}>\n {/* Preview Toggle */}\n <button\n type=\"button\"\n onClick={() => setShowPreview(!showPreview)}\n style={{\n padding: '6px 12px',\n backgroundColor: showPreview ? '#3b82f6' : '#e5e7eb',\n color: showPreview ? 'white' : '#374151',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n {showPreview ? 'Hide Preview' : 'Show Preview'}\n </button>\n\n {/* Preview Mode */}\n {showPreview && (\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n type=\"button\"\n onClick={() => setPreviewMode('desktop')}\n style={{\n padding: '6px 12px',\n backgroundColor: previewMode === 'desktop' ? '#6366f1' : '#e5e7eb',\n color: previewMode === 'desktop' ? 'white' : '#374151',\n border: 'none',\n borderRadius: '4px 0 0 4px',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Desktop\n </button>\n <button\n type=\"button\"\n onClick={() => setPreviewMode('mobile')}\n style={{\n padding: '6px 12px',\n backgroundColor: previewMode === 'mobile' ? '#6366f1' : '#e5e7eb',\n color: previewMode === 'mobile' ? 'white' : '#374151',\n border: 'none',\n borderRadius: '0 4px 4px 0',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Mobile\n </button>\n </div>\n )}\n\n {/* Validation Status */}\n {showPreview && validationSummary && (\n <div style={{\n padding: '6px 12px',\n backgroundColor: isValid ? '#fef3c7' : '#fee2e2',\n color: isValid ? '#92400e' : '#991b1b',\n borderRadius: '4px',\n fontSize: '13px',\n }}>\n {validationSummary}\n </div>\n )}\n </div>\n\n {/* Test Email Button */}\n {showPreview && (\n <button\n type=\"button\"\n onClick={handleTestEmail}\n style={{\n padding: '6px 12px',\n backgroundColor: '#10b981',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n fontSize: '14px',\n cursor: 'pointer',\n }}\n >\n Send Test Email\n </button>\n )}\n </div>\n\n {/* Content Area */}\n <div style={{ flex: 1, display: 'flex', overflow: 'hidden' }}>\n {/* Editor */}\n <div style={{ \n flex: showPreview ? '0 0 50%' : '1',\n overflow: 'auto',\n borderRight: showPreview ? '1px solid #e5e7eb' : 'none',\n }}>\n <div style={{ padding: '16px' }}>\n {/* The actual rich text editor will be rendered by Payload */}\n {/* This component wraps it with preview functionality */}\n <div className=\"rich-text-lexical\">\n {/* Payload will inject the editor here */}\n </div>\n </div>\n </div>\n\n {/* Preview */}\n {showPreview && (\n <div style={{ flex: '0 0 50%', overflow: 'hidden' }}>\n <EmailPreview\n content={value}\n subject={fields.subject?.value as string || 'Email Subject'}\n preheader={fields.preheader?.value as string}\n mode={previewMode}\n onValidation={handleValidation}\n />\n </div>\n )}\n </div>\n </div>\n )\n}","'use client'\nimport React, { useState, useCallback } from 'react'\nimport { useFormFields } from '@payloadcms/ui'\nimport { PreviewControls } from './PreviewControls'\n\nexport const BroadcastInlinePreview: React.FC = () => {\n const [device, setDevice] = useState<'desktop' | 'mobile'>('desktop')\n const [isLoading, setIsLoading] = useState(false)\n const [showPreview, setShowPreview] = useState(false)\n const [previewHtml, setPreviewHtml] = useState<string | null>(null)\n const [error, setError] = useState<Error | null>(null)\n \n const fields = useFormFields(([fields]) => ({\n subject: fields['subject']?.value as string,\n preheader: fields['contentSection.preheader']?.value as string,\n content: fields['contentSection.content']?.value,\n }))\n \n const updatePreview = useCallback(async () => {\n if (!fields.content) {\n setError(new Error('Please add some content before previewing'))\n return\n }\n \n setIsLoading(true)\n setError(null)\n \n try {\n // Call the server-side preview endpoint\n const response = await fetch('/api/broadcasts/preview', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n content: fields.content,\n preheader: fields.preheader,\n subject: fields.subject,\n }),\n })\n \n const data = await response.json()\n \n if (!response.ok || !data.success) {\n throw new Error(data.error || 'Failed to generate preview')\n }\n \n setPreviewHtml(data.preview.html)\n setShowPreview(true)\n } catch (err) {\n setError(err as Error)\n console.error('Failed to update preview:', err)\n } finally {\n setIsLoading(false)\n }\n }, [fields])\n \n const containerStyle: React.CSSProperties = {\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n overflow: 'hidden',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n }\n \n const headerStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '1rem',\n background: '#f9fafb',\n borderBottom: '1px solid #e5e7eb',\n }\n \n const titleStyle: React.CSSProperties = {\n fontSize: '16px',\n fontWeight: 600,\n color: '#1f2937',\n margin: 0,\n }\n \n const previewContainerStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n flexDirection: 'column',\n background: '#f3f4f6',\n overflow: 'hidden',\n }\n \n const errorStyle: React.CSSProperties = {\n padding: '2rem',\n textAlign: 'center',\n }\n \n const toggleButtonStyle: React.CSSProperties = {\n padding: '0.5rem 1rem',\n background: showPreview ? '#ef4444' : '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n }\n \n return (\n <div style={containerStyle}>\n <div style={headerStyle}>\n <h3 style={titleStyle}>Email Preview</h3>\n <button\n onClick={() => showPreview ? setShowPreview(false) : updatePreview()}\n style={toggleButtonStyle}\n disabled={isLoading}\n >\n {isLoading ? 'Loading...' : showPreview ? 'Hide Preview' : 'Show Preview'}\n </button>\n </div>\n \n {showPreview && (\n <div style={previewContainerStyle}>\n {error ? (\n <div style={errorStyle}>\n <p style={{ color: '#ef4444', margin: '0 0 1rem' }}>{error.message}</p>\n <button \n onClick={updatePreview}\n style={{\n padding: '0.5rem 1rem',\n background: '#3b82f6',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Retry\n </button>\n </div>\n ) : previewHtml ? (\n <>\n <PreviewControls \n onUpdate={updatePreview}\n device={device}\n onDeviceChange={setDevice}\n isLoading={isLoading}\n />\n <div\n style={{\n flex: 1,\n padding: device === 'mobile' ? '1rem' : '2rem',\n display: 'flex',\n justifyContent: 'center',\n overflow: 'auto',\n }}\n >\n <div\n style={{\n width: device === 'mobile' ? '375px' : '600px',\n maxWidth: '100%',\n background: 'white',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n borderRadius: '8px',\n overflow: 'hidden',\n }}\n >\n <iframe\n srcDoc={previewHtml}\n style={{\n width: '100%',\n height: '100%',\n minHeight: '600px',\n border: 'none',\n }}\n title=\"Email Preview\"\n />\n </div>\n </div>\n </>\n ) : null}\n </div>\n )}\n </div>\n )\n}\n\nexport default BroadcastInlinePreview","'use client'\nimport React from 'react'\n\ninterface PreviewControlsProps {\n onUpdate: () => void\n device: 'desktop' | 'mobile'\n onDeviceChange: (device: 'desktop' | 'mobile') => void\n isLoading?: boolean\n}\n\nexport const PreviewControls: React.FC<PreviewControlsProps> = ({\n onUpdate,\n device,\n onDeviceChange,\n isLoading = false,\n}) => {\n const controlsStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '1rem',\n background: 'white',\n borderBottom: '1px solid #e5e7eb',\n }\n \n const updateButtonStyle: React.CSSProperties = {\n padding: '0.5rem 1rem',\n background: '#10b981',\n color: 'white',\n border: 'none',\n borderRadius: '4px',\n cursor: isLoading ? 'not-allowed' : 'pointer',\n fontSize: '14px',\n fontWeight: 500,\n opacity: isLoading ? 0.6 : 1,\n }\n \n const deviceSelectorStyle: React.CSSProperties = {\n display: 'flex',\n gap: '0.5rem',\n }\n \n const deviceButtonStyle = (isActive: boolean): React.CSSProperties => ({\n display: 'flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.5rem 0.75rem',\n background: isActive ? '#1f2937' : 'white',\n color: isActive ? 'white' : '#374151',\n border: `1px solid ${isActive ? '#1f2937' : '#e5e7eb'}`,\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '14px',\n })\n \n return (\n <div style={controlsStyle}>\n <button \n style={updateButtonStyle}\n onClick={onUpdate}\n disabled={isLoading}\n >\n {isLoading ? 'Updating...' : 'Update Preview'}\n </button>\n \n <div style={deviceSelectorStyle}>\n <button\n style={deviceButtonStyle(device === 'desktop')}\n onClick={() => onDeviceChange('desktop')}\n aria-label=\"Desktop view\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n Desktop\n </button>\n \n <button\n style={deviceButtonStyle(device === 'mobile')}\n onClick={() => onDeviceChange('mobile')}\n aria-label=\"Mobile view\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"18\" />\n </svg>\n Mobile\n </button>\n </div>\n </div>\n )\n}","'use client'\nimport React from 'react'\n\n// Simple placeholder for now - users should use BroadcastInlinePreview instead\nexport const BroadcastPreviewField: React.FC = () => {\n return (\n <div style={{ \n padding: '1rem', \n background: '#f9fafb', \n borderRadius: '4px',\n fontSize: '14px',\n color: '#6b7280',\n }}>\n Email preview is available inline below the content editor.\n </div>\n )\n}\n\nexport default BroadcastPreviewField","'use client'\nimport React, { useEffect, useState, useCallback, useRef } from 'react'\nimport { render } from '@react-email/render'\n\ninterface EmailRendererProps {\n template: React.ComponentType<any>\n data: {\n subject: string\n preheader?: string\n content: string\n [key: string]: any\n }\n device?: 'desktop' | 'mobile'\n onRender?: (html: string) => void\n}\n\nexport const EmailRenderer: React.FC<EmailRendererProps> = ({ \n template, \n data, \n device = 'desktop',\n onRender \n}) => {\n const [renderedHtml, setRenderedHtml] = useState<string>('')\n const [error, setError] = useState<Error | null>(null)\n const iframeRef = useRef<HTMLIFrameElement>(null)\n \n const renderEmail = useCallback(async () => {\n try {\n const TemplateComponent = template\n const element = <TemplateComponent {...data} />\n \n const html = await render(element, {\n pretty: true,\n })\n \n setRenderedHtml(html)\n onRender?.(html)\n setError(null)\n } catch (err) {\n setError(err as Error)\n console.error('Failed to render email template:', err)\n }\n }, [template, data, onRender])\n \n useEffect(() => {\n renderEmail()\n }, [renderEmail])\n \n useEffect(() => {\n if (iframeRef.current && renderedHtml) {\n const iframe = iframeRef.current\n const doc = iframe.contentDocument || iframe.contentWindow?.document\n \n if (doc) {\n doc.open()\n doc.write(renderedHtml)\n doc.close()\n }\n }\n }, [renderedHtml])\n \n const containerStyle: React.CSSProperties = {\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'flex-start',\n justifyContent: 'center',\n overflow: 'auto',\n padding: '2rem',\n boxSizing: 'border-box',\n }\n \n const iframeStyle: React.CSSProperties = {\n width: device === 'mobile' ? '375px' : '600px',\n height: '100%',\n minHeight: '600px',\n background: 'white',\n boxShadow: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',\n borderRadius: device === 'mobile' ? '20px' : '8px',\n border: 'none',\n display: 'block',\n }\n \n const errorStyle: React.CSSProperties = {\n background: 'white',\n border: '1px solid #ef4444',\n borderRadius: '4px',\n padding: '2rem',\n maxWidth: '500px',\n }\n \n if (error) {\n return (\n <div style={errorStyle}>\n <h3 style={{ color: '#ef4444', margin: '0 0 1rem' }}>Template Render Error</h3>\n <pre style={{ \n background: '#f9fafb', \n padding: '1rem', \n borderRadius: '4px',\n overflowX: 'auto',\n fontSize: '12px',\n color: '#374151',\n margin: 0,\n }}>{error.message}</pre>\n </div>\n )\n }\n \n return (\n <div style={containerStyle}>\n <iframe\n ref={iframeRef}\n style={iframeStyle}\n sandbox=\"allow-same-origin\"\n title=\"Email Preview\"\n />\n </div>\n )\n}","'use client'\n\nimport React from 'react'\nimport type { DefaultCellComponentProps } from 'payload'\nimport { BroadcastStatus } from '../../types'\n\nconst statusConfig = {\n [BroadcastStatus.DRAFT]: {\n label: 'Draft',\n color: '#6B7280', // gray\n backgroundColor: '#F3F4F6',\n },\n [BroadcastStatus.SCHEDULED]: {\n label: 'Scheduled',\n color: '#2563EB', // blue\n backgroundColor: '#DBEAFE',\n },\n [BroadcastStatus.SENDING]: {\n label: 'Sending',\n color: '#D97706', // yellow/orange\n backgroundColor: '#FEF3C7',\n },\n [BroadcastStatus.SENT]: {\n label: 'Sent',\n color: '#059669', // green\n backgroundColor: '#D1FAE5',\n },\n [BroadcastStatus.FAILED]: {\n label: 'Failed',\n color: '#DC2626', // red\n backgroundColor: '#FEE2E2',\n },\n [BroadcastStatus.PAUSED]: {\n label: 'Paused',\n color: '#9333EA', // purple\n backgroundColor: '#EDE9FE',\n },\n [BroadcastStatus.CANCELED]: {\n label: 'Canceled',\n color: '#6B7280', // gray\n backgroundColor: '#F3F4F6',\n },\n}\n\nexport const StatusBadge: React.FC<DefaultCellComponentProps> = ({ cellData }) => {\n const status = cellData as BroadcastStatus\n const config = statusConfig[status] || statusConfig[BroadcastStatus.DRAFT]\n\n return (\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n padding: '2px 10px',\n borderRadius: '12px',\n fontSize: '12px',\n fontWeight: '500',\n color: config.color,\n backgroundColor: config.backgroundColor,\n }}\n >\n {config.label}\n </span>\n )\n}","'use client'\n\nimport React from 'react'\n\n// Empty field component for UI fields that only display in list view\nexport const EmptyField: React.FC = () => {\n return null\n}","import React from 'react'\nimport {\n Body,\n Container,\n Head,\n Hr,\n Html,\n Link,\n Preview,\n Section,\n Text,\n} from '@react-email/components'\n\nexport interface BroadcastTemplateProps {\n subject: string\n preheader?: string\n content: string\n}\n\nexport const DefaultBroadcastTemplate: React.FC<BroadcastTemplateProps> = ({\n subject,\n preheader,\n content,\n}) => {\n return (\n <Html>\n <Head />\n <Preview>{preheader || subject}</Preview>\n <Body style={main}>\n <Container style={container}>\n <Section style={contentSection}>\n <div dangerouslySetInnerHTML={{ __html: content }} />\n </Section>\n \n <Hr style={divider} />\n \n <Section style={footer}>\n <Text style={footerText}>\n You're receiving this email because you subscribed to our newsletter.\n </Text>\n <Text style={footerText}>\n <Link href=\"{{unsubscribe_url}}\" style={footerLink}>\n Unsubscribe\n </Link>\n </Text>\n </Section>\n </Container>\n </Body>\n </Html>\n )\n}\n\n// Clean, modern styles\nconst main = {\n backgroundColor: '#ffffff',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif',\n}\n\nconst container = {\n margin: '0 auto',\n padding: '40px 20px',\n maxWidth: '600px',\n}\n\nconst contentSection = {\n fontSize: '16px',\n lineHeight: '1.6',\n color: '#374151',\n}\n\nconst divider = {\n borderColor: '#e5e7eb',\n margin: '40px 0 20px',\n}\n\nconst footer = {\n textAlign: 'center' as const,\n}\n\nconst footerText = {\n fontSize: '14px',\n lineHeight: '1.5',\n color: '#6b7280',\n margin: '0 0 10px',\n}\n\nconst footerLink = {\n color: '#6b7280',\n textDecoration: 'underline',\n}\n\nexport default DefaultBroadcastTemplate"],"mappings":"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","names":["useState","jsx","jsxs","defaultStyles","useState","useEffect","jsx","jsxs","defaultStyles","useState","useEffect","useState","useEffect","jsx","jsx","jsxs","useState","useEffect","escapeHtml","useState","jsx","jsxs","useState","fields","useState","useCallback","useFormFields","jsx","jsxs","useState","useFormFields","fields","useCallback","useState","useCallback","useFormFields","jsx","jsxs","Fragment","jsx","jsxs","useState","useFormFields","fields","useCallback","jsx","useEffect","useState","useCallback","useRef","jsx","jsxs","jsx","jsx","jsxs"]}
|