payload-plugin-newsletter 0.6.2 → 0.8.0
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 +51 -0
- package/README.md +143 -0
- package/dist/client.cjs +57 -65
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +7 -6
- package/dist/client.d.ts +7 -6
- package/dist/client.js +57 -65
- package/dist/client.js.map +1 -1
- package/dist/components.cjs +57 -65
- package/dist/components.cjs.map +1 -1
- package/dist/components.js +57 -65
- package/dist/components.js.map +1 -1
- package/dist/index.cjs +706 -68
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +67 -2
- package/dist/index.d.ts +67 -2
- package/dist/index.js +718 -67
- package/dist/index.js.map +1 -1
- package/package.json +11 -9
package/dist/components.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/exports/components.ts","../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts"],"sourcesContent":["'use client'\n\n// Re-export all components from the client export\n// This allows users to import directly from @payloadcms/plugin-newsletter/components\nexport * from './client'","'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 sessionTokenKey?: string\n apiEndpoint?: string\n}\n\nexport interface UseNewsletterAuthReturn {\n subscriber: Subscriber | null\n loading: boolean\n error: Error | null\n isAuthenticated: boolean\n login: (token: string) => Promise<void>\n logout: () => void\n refreshSubscriber: () => Promise<void>\n}\n\nexport function useNewsletterAuth(\n options: UseNewsletterAuthOptions = {}\n): UseNewsletterAuthReturn {\n const {\n sessionTokenKey = 'newsletter_session',\n apiEndpoint = '/api/newsletter/preferences',\n } = options\n\n const [subscriber, setSubscriber] = useState<Subscriber | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<Error | null>(null)\n\n // Get session token from localStorage\n const getSessionToken = useCallback(() => {\n if (typeof window === 'undefined') return null\n return localStorage.getItem(sessionTokenKey)\n }, [sessionTokenKey])\n\n // Set session token in localStorage\n const setSessionToken = useCallback((token: string | null) => {\n if (typeof window === 'undefined') return\n if (token) {\n localStorage.setItem(sessionTokenKey, token)\n } else {\n localStorage.removeItem(sessionTokenKey)\n }\n }, [sessionTokenKey])\n\n // Fetch subscriber data\n const fetchSubscriber = useCallback(async (token: string) => {\n try {\n const response = await fetch(apiEndpoint, {\n headers: {\n 'Authorization': `Bearer ${token}`,\n },\n })\n\n if (!response.ok) {\n if (response.status === 401) {\n // Token is invalid, clear it\n setSessionToken(null)\n throw new Error('Session expired')\n }\n throw new Error('Failed to fetch subscriber')\n }\n\n const data = await response.json()\n setSubscriber(data.subscriber)\n setError(null)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('An error occurred'))\n setSubscriber(null)\n throw err\n }\n }, [apiEndpoint, setSessionToken])\n\n // Initial load\n useEffect(() => {\n const token = getSessionToken()\n if (token) {\n fetchSubscriber(token)\n .catch(() => {\n // Error is already handled in fetchSubscriber\n })\n .finally(() => setLoading(false))\n } else {\n setLoading(false)\n }\n }, [])\n\n // Login with session token\n const login = useCallback(async (token: string) => {\n setLoading(true)\n setError(null)\n try {\n setSessionToken(token)\n await fetchSubscriber(token)\n } catch (err) {\n setSessionToken(null)\n throw err\n } finally {\n setLoading(false)\n }\n }, [fetchSubscriber, setSessionToken])\n\n // Logout\n const logout = useCallback(() => {\n setSessionToken(null)\n setSubscriber(null)\n setError(null)\n }, [setSessionToken])\n\n // Refresh subscriber data\n const refreshSubscriber = useCallback(async () => {\n const token = getSessionToken()\n if (!token) {\n throw new Error('Not authenticated')\n }\n await fetchSubscriber(token)\n }, [fetchSubscriber, getSessionToken])\n\n return {\n subscriber,\n loading,\n error,\n isAuthenticated: !!subscriber,\n login,\n logout,\n refreshSubscriber,\n }\n}"],"mappings":"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","names":["import_react","import_jsx_runtime","defaultStyles","import_react","import_jsx_runtime","defaultStyles","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../src/exports/components.ts","../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts"],"sourcesContent":["'use client'\n\n// Re-export all components from the client export\n// This allows users to import directly from @payloadcms/plugin-newsletter/components\nexport * from './client'","'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}"],"mappings":"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","names":["import_react","import_jsx_runtime","defaultStyles","import_react","import_jsx_runtime","defaultStyles","import_react"]}
|
package/dist/components.js
CHANGED
|
@@ -768,91 +768,83 @@ function createMagicLinkVerify(defaultProps) {
|
|
|
768
768
|
|
|
769
769
|
// src/hooks/useNewsletterAuth.ts
|
|
770
770
|
import { useState as useState4, useEffect as useEffect3, useCallback } from "react";
|
|
771
|
-
function useNewsletterAuth(
|
|
772
|
-
const {
|
|
773
|
-
sessionTokenKey = "newsletter_session",
|
|
774
|
-
apiEndpoint = "/api/newsletter/preferences"
|
|
775
|
-
} = options;
|
|
771
|
+
function useNewsletterAuth(_options = {}) {
|
|
776
772
|
const [subscriber, setSubscriber] = useState4(null);
|
|
777
|
-
const [
|
|
773
|
+
const [isLoading, setIsLoading] = useState4(true);
|
|
778
774
|
const [error, setError] = useState4(null);
|
|
779
|
-
const
|
|
780
|
-
if (typeof window === "undefined") return null;
|
|
781
|
-
return localStorage.getItem(sessionTokenKey);
|
|
782
|
-
}, [sessionTokenKey]);
|
|
783
|
-
const setSessionToken = useCallback((token) => {
|
|
784
|
-
if (typeof window === "undefined") return;
|
|
785
|
-
if (token) {
|
|
786
|
-
localStorage.setItem(sessionTokenKey, token);
|
|
787
|
-
} else {
|
|
788
|
-
localStorage.removeItem(sessionTokenKey);
|
|
789
|
-
}
|
|
790
|
-
}, [sessionTokenKey]);
|
|
791
|
-
const fetchSubscriber = useCallback(async (token) => {
|
|
775
|
+
const checkAuth = useCallback(async () => {
|
|
792
776
|
try {
|
|
793
|
-
const response = await fetch(
|
|
777
|
+
const response = await fetch("/api/newsletter/me", {
|
|
778
|
+
method: "GET",
|
|
779
|
+
credentials: "include",
|
|
794
780
|
headers: {
|
|
795
|
-
"
|
|
781
|
+
"Content-Type": "application/json"
|
|
796
782
|
}
|
|
797
783
|
});
|
|
798
|
-
if (
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
784
|
+
if (response.ok) {
|
|
785
|
+
const data = await response.json();
|
|
786
|
+
setSubscriber(data.subscriber);
|
|
787
|
+
setError(null);
|
|
788
|
+
} else {
|
|
789
|
+
setSubscriber(null);
|
|
790
|
+
if (response.status !== 401) {
|
|
791
|
+
setError(new Error("Failed to check authentication"));
|
|
802
792
|
}
|
|
803
|
-
throw new Error("Failed to fetch subscriber");
|
|
804
793
|
}
|
|
805
|
-
const data = await response.json();
|
|
806
|
-
setSubscriber(data.subscriber);
|
|
807
|
-
setError(null);
|
|
808
794
|
} catch (err) {
|
|
795
|
+
console.error("Auth check failed:", err);
|
|
809
796
|
setError(err instanceof Error ? err : new Error("An error occurred"));
|
|
810
797
|
setSubscriber(null);
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
}, [apiEndpoint, setSessionToken]);
|
|
814
|
-
useEffect3(() => {
|
|
815
|
-
const token = getSessionToken();
|
|
816
|
-
if (token) {
|
|
817
|
-
fetchSubscriber(token).catch(() => {
|
|
818
|
-
}).finally(() => setLoading(false));
|
|
819
|
-
} else {
|
|
820
|
-
setLoading(false);
|
|
798
|
+
} finally {
|
|
799
|
+
setIsLoading(false);
|
|
821
800
|
}
|
|
822
801
|
}, []);
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
802
|
+
useEffect3(() => {
|
|
803
|
+
checkAuth();
|
|
804
|
+
}, [checkAuth]);
|
|
805
|
+
const signOut = useCallback(async () => {
|
|
826
806
|
try {
|
|
827
|
-
|
|
828
|
-
|
|
807
|
+
const response = await fetch("/api/newsletter/signout", {
|
|
808
|
+
method: "POST",
|
|
809
|
+
credentials: "include",
|
|
810
|
+
headers: {
|
|
811
|
+
"Content-Type": "application/json"
|
|
812
|
+
}
|
|
813
|
+
});
|
|
814
|
+
if (response.ok) {
|
|
815
|
+
setSubscriber(null);
|
|
816
|
+
setError(null);
|
|
817
|
+
} else {
|
|
818
|
+
throw new Error("Failed to sign out");
|
|
819
|
+
}
|
|
829
820
|
} catch (err) {
|
|
830
|
-
|
|
821
|
+
console.error("Sign out error:", err);
|
|
822
|
+
setError(err instanceof Error ? err : new Error("Sign out failed"));
|
|
831
823
|
throw err;
|
|
832
|
-
} finally {
|
|
833
|
-
setLoading(false);
|
|
834
|
-
}
|
|
835
|
-
}, [fetchSubscriber, setSessionToken]);
|
|
836
|
-
const logout = useCallback(() => {
|
|
837
|
-
setSessionToken(null);
|
|
838
|
-
setSubscriber(null);
|
|
839
|
-
setError(null);
|
|
840
|
-
}, [setSessionToken]);
|
|
841
|
-
const refreshSubscriber = useCallback(async () => {
|
|
842
|
-
const token = getSessionToken();
|
|
843
|
-
if (!token) {
|
|
844
|
-
throw new Error("Not authenticated");
|
|
845
824
|
}
|
|
846
|
-
|
|
847
|
-
|
|
825
|
+
}, []);
|
|
826
|
+
const refreshAuth = useCallback(async () => {
|
|
827
|
+
setIsLoading(true);
|
|
828
|
+
await checkAuth();
|
|
829
|
+
}, [checkAuth]);
|
|
830
|
+
const login = useCallback(async (_token) => {
|
|
831
|
+
await refreshAuth();
|
|
832
|
+
}, [refreshAuth]);
|
|
848
833
|
return {
|
|
849
834
|
subscriber,
|
|
850
|
-
loading,
|
|
851
|
-
error,
|
|
852
835
|
isAuthenticated: !!subscriber,
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
836
|
+
isLoading,
|
|
837
|
+
loading: isLoading,
|
|
838
|
+
// Alias for backward compatibility
|
|
839
|
+
error,
|
|
840
|
+
signOut,
|
|
841
|
+
logout: signOut,
|
|
842
|
+
// Alias for backward compatibility
|
|
843
|
+
refreshAuth,
|
|
844
|
+
refreshSubscriber: refreshAuth,
|
|
845
|
+
// Alias for backward compatibility
|
|
846
|
+
login
|
|
847
|
+
// For backward compatibility
|
|
856
848
|
};
|
|
857
849
|
}
|
|
858
850
|
export {
|