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 CHANGED
@@ -1,3 +1,54 @@
1
+ ## [0.8.0] - 2025-06-30
2
+
3
+ - feat: complete welcome email implementation in afterCreate hook
4
+
5
+
6
+ ### Fixed
7
+ - Fixed CI test runner error by adding explicit Rollup dependency for Linux platforms
8
+ - Fixed verify magic link endpoint test by adding missing cookie method to response mock
9
+ - Fixed test execution by adding missing payload config properties to mocks
10
+ - Improved test reliability by updating mock objects to match real implementation
11
+
12
+ ## [0.7.0] - 2025-06-30
13
+
14
+ ### Added
15
+ - Complete magic link authentication implementation
16
+ - Magic link email sending for subscriber verification
17
+ - Welcome email sent after successful verification
18
+ - Sign-in endpoint (`POST /api/newsletter/signin`) for existing subscribers
19
+ - Rate limiting on sign-in endpoint (5 attempts per 15 minutes)
20
+ - Session cookie management (30-day expiry)
21
+ - Authentication endpoints
22
+ - `GET /api/newsletter/me` - Check authentication status
23
+ - `POST /api/newsletter/signout` - Clear authentication session
24
+ - Client-side authentication hook (`useNewsletterAuth`)
25
+ - Cookie-based authentication (replaces localStorage)
26
+ - Provides subscriber data, auth state, and sign out functionality
27
+ - Maintains backward compatibility with existing API
28
+ - Server-side session utilities
29
+ - `getTokenFromRequest` - Extract JWT from cookies
30
+ - `verifyToken` - Verify JWT tokens
31
+ - `getServerSideAuth` - SSR authentication helper
32
+ - `requireAuth` - Page protection middleware
33
+ - `isAuthenticated` - Simple auth check
34
+ - React Email templates
35
+ - MagicLink email template
36
+ - Welcome email template
37
+ - SignIn email template (alias for MagicLink)
38
+
39
+ ### Changed
40
+ - Email sending now uses React Email for better formatting and consistency
41
+ - Authentication now uses httpOnly cookies instead of localStorage for better security
42
+ - Verify endpoint now sets session cookie upon successful verification
43
+
44
+ ### Fixed
45
+ - Completed TODO items for email sending in subscribe and verify endpoints
46
+ - Added missing email sending functionality throughout the plugin
47
+
48
+ ## [0.6.1] - 2025-06-20
49
+
50
+ - fix: update Broadcast provider to use correct API endpoints
51
+
1
52
  ## [0.6.0] - 2025-06-20
2
53
 
3
54
  - fix: resolve ESLint error for unused variable in test mock
package/README.md CHANGED
@@ -286,6 +286,149 @@ Get or update subscriber preferences (requires magic link auth)
286
286
  ### POST `/api/newsletter/unsubscribe`
287
287
  Unsubscribe an email address
288
288
 
289
+ ### POST `/api/newsletter/signin`
290
+ Request a magic link for existing subscribers
291
+
292
+ ```typescript
293
+ // Request
294
+ {
295
+ "email": "user@example.com"
296
+ }
297
+
298
+ // Response
299
+ {
300
+ "success": true,
301
+ "message": "Check your email for the sign-in link"
302
+ }
303
+ ```
304
+
305
+ ### GET `/api/newsletter/me`
306
+ Get current authenticated subscriber (requires authentication)
307
+
308
+ ```typescript
309
+ // Response
310
+ {
311
+ "success": true,
312
+ "subscriber": {
313
+ "id": "123",
314
+ "email": "user@example.com",
315
+ "name": "John Doe",
316
+ "status": "active",
317
+ "preferences": { /* preferences */ }
318
+ }
319
+ }
320
+ ```
321
+
322
+ ### POST `/api/newsletter/signout`
323
+ Sign out the current subscriber
324
+
325
+ ```typescript
326
+ // Response
327
+ {
328
+ "success": true,
329
+ "message": "Signed out successfully"
330
+ }
331
+ ```
332
+
333
+ ## Authentication
334
+
335
+ The plugin provides complete magic link authentication for subscribers:
336
+
337
+ ### Client-Side Authentication
338
+
339
+ Use the `useNewsletterAuth` hook in your React components:
340
+
341
+ ```tsx
342
+ import { useNewsletterAuth } from 'payload-plugin-newsletter/client'
343
+
344
+ function MyComponent() {
345
+ const {
346
+ subscriber,
347
+ isAuthenticated,
348
+ isLoading,
349
+ signOut,
350
+ refreshAuth
351
+ } = useNewsletterAuth()
352
+
353
+ if (isLoading) return <div>Loading...</div>
354
+
355
+ if (!isAuthenticated) {
356
+ return <div>Please sign in to manage your preferences</div>
357
+ }
358
+
359
+ return (
360
+ <div>
361
+ <p>Welcome {subscriber.email}!</p>
362
+ <button onClick={signOut}>Sign Out</button>
363
+ </div>
364
+ )
365
+ }
366
+ ```
367
+
368
+ ### Server-Side Authentication
369
+
370
+ For Next.js applications, use the session utilities:
371
+
372
+ ```typescript
373
+ import { requireAuth, getServerSideAuth } from 'payload-plugin-newsletter'
374
+
375
+ // Protect a page - redirects to /auth/signin if not authenticated
376
+ export const getServerSideProps = requireAuth()
377
+
378
+ // Or with custom logic
379
+ export const getServerSideProps = requireAuth(async (context) => {
380
+ // Your custom logic here
381
+ const data = await fetchData()
382
+ return { props: { data } }
383
+ })
384
+
385
+ // Manual authentication check
386
+ export const getServerSideProps = async (context) => {
387
+ const { subscriber, isAuthenticated } = await getServerSideAuth(context)
388
+
389
+ if (!isAuthenticated) {
390
+ // Handle unauthenticated state
391
+ }
392
+
393
+ return {
394
+ props: { subscriber }
395
+ }
396
+ }
397
+ ```
398
+
399
+ ### Authentication Flow
400
+
401
+ 1. **Subscribe**: New users receive a magic link email to verify their email
402
+ 2. **Sign In**: Existing subscribers can request a new magic link via `/api/newsletter/signin`
403
+ 3. **Verify**: Clicking the magic link verifies the email and creates a session
404
+ 4. **Session**: Sessions are stored in httpOnly cookies (30-day expiry by default)
405
+ 5. **Sign Out**: Clears the session cookie
406
+
407
+ ### Configuration
408
+
409
+ ```typescript
410
+ newsletterPlugin({
411
+ auth: {
412
+ enabled: true, // Enable/disable authentication
413
+ tokenExpiration: '7d', // Magic link validity
414
+ magicLinkPath: '/newsletter/verify', // Verification redirect path
415
+ },
416
+ // Email templates can be customized
417
+ emails: {
418
+ magicLink: {
419
+ subject: 'Sign in to {{siteName}}',
420
+ },
421
+ welcome: {
422
+ enabled: true,
423
+ subject: 'Welcome to {{siteName}}!',
424
+ },
425
+ signIn: {
426
+ subject: 'Sign in to your account',
427
+ },
428
+ },
429
+ })
430
+ ```
431
+
289
432
  ## Newsletter Scheduling
290
433
 
291
434
  If you enable newsletter scheduling, the plugin adds scheduling fields to your articles collection:
package/dist/client.cjs CHANGED
@@ -799,91 +799,83 @@ function createMagicLinkVerify(defaultProps) {
799
799
 
800
800
  // src/hooks/useNewsletterAuth.ts
801
801
  var import_react4 = require("react");
802
- function useNewsletterAuth(options = {}) {
803
- const {
804
- sessionTokenKey = "newsletter_session",
805
- apiEndpoint = "/api/newsletter/preferences"
806
- } = options;
802
+ function useNewsletterAuth(_options = {}) {
807
803
  const [subscriber, setSubscriber] = (0, import_react4.useState)(null);
808
- const [loading, setLoading] = (0, import_react4.useState)(true);
804
+ const [isLoading, setIsLoading] = (0, import_react4.useState)(true);
809
805
  const [error, setError] = (0, import_react4.useState)(null);
810
- const getSessionToken = (0, import_react4.useCallback)(() => {
811
- if (typeof window === "undefined") return null;
812
- return localStorage.getItem(sessionTokenKey);
813
- }, [sessionTokenKey]);
814
- const setSessionToken = (0, import_react4.useCallback)((token) => {
815
- if (typeof window === "undefined") return;
816
- if (token) {
817
- localStorage.setItem(sessionTokenKey, token);
818
- } else {
819
- localStorage.removeItem(sessionTokenKey);
820
- }
821
- }, [sessionTokenKey]);
822
- const fetchSubscriber = (0, import_react4.useCallback)(async (token) => {
806
+ const checkAuth = (0, import_react4.useCallback)(async () => {
823
807
  try {
824
- const response = await fetch(apiEndpoint, {
808
+ const response = await fetch("/api/newsletter/me", {
809
+ method: "GET",
810
+ credentials: "include",
825
811
  headers: {
826
- "Authorization": `Bearer ${token}`
812
+ "Content-Type": "application/json"
827
813
  }
828
814
  });
829
- if (!response.ok) {
830
- if (response.status === 401) {
831
- setSessionToken(null);
832
- throw new Error("Session expired");
815
+ if (response.ok) {
816
+ const data = await response.json();
817
+ setSubscriber(data.subscriber);
818
+ setError(null);
819
+ } else {
820
+ setSubscriber(null);
821
+ if (response.status !== 401) {
822
+ setError(new Error("Failed to check authentication"));
833
823
  }
834
- throw new Error("Failed to fetch subscriber");
835
824
  }
836
- const data = await response.json();
837
- setSubscriber(data.subscriber);
838
- setError(null);
839
825
  } catch (err) {
826
+ console.error("Auth check failed:", err);
840
827
  setError(err instanceof Error ? err : new Error("An error occurred"));
841
828
  setSubscriber(null);
842
- throw err;
843
- }
844
- }, [apiEndpoint, setSessionToken]);
845
- (0, import_react4.useEffect)(() => {
846
- const token = getSessionToken();
847
- if (token) {
848
- fetchSubscriber(token).catch(() => {
849
- }).finally(() => setLoading(false));
850
- } else {
851
- setLoading(false);
829
+ } finally {
830
+ setIsLoading(false);
852
831
  }
853
832
  }, []);
854
- const login = (0, import_react4.useCallback)(async (token) => {
855
- setLoading(true);
856
- setError(null);
833
+ (0, import_react4.useEffect)(() => {
834
+ checkAuth();
835
+ }, [checkAuth]);
836
+ const signOut = (0, import_react4.useCallback)(async () => {
857
837
  try {
858
- setSessionToken(token);
859
- await fetchSubscriber(token);
838
+ const response = await fetch("/api/newsletter/signout", {
839
+ method: "POST",
840
+ credentials: "include",
841
+ headers: {
842
+ "Content-Type": "application/json"
843
+ }
844
+ });
845
+ if (response.ok) {
846
+ setSubscriber(null);
847
+ setError(null);
848
+ } else {
849
+ throw new Error("Failed to sign out");
850
+ }
860
851
  } catch (err) {
861
- setSessionToken(null);
852
+ console.error("Sign out error:", err);
853
+ setError(err instanceof Error ? err : new Error("Sign out failed"));
862
854
  throw err;
863
- } finally {
864
- setLoading(false);
865
- }
866
- }, [fetchSubscriber, setSessionToken]);
867
- const logout = (0, import_react4.useCallback)(() => {
868
- setSessionToken(null);
869
- setSubscriber(null);
870
- setError(null);
871
- }, [setSessionToken]);
872
- const refreshSubscriber = (0, import_react4.useCallback)(async () => {
873
- const token = getSessionToken();
874
- if (!token) {
875
- throw new Error("Not authenticated");
876
855
  }
877
- await fetchSubscriber(token);
878
- }, [fetchSubscriber, getSessionToken]);
856
+ }, []);
857
+ const refreshAuth = (0, import_react4.useCallback)(async () => {
858
+ setIsLoading(true);
859
+ await checkAuth();
860
+ }, [checkAuth]);
861
+ const login = (0, import_react4.useCallback)(async (_token) => {
862
+ await refreshAuth();
863
+ }, [refreshAuth]);
879
864
  return {
880
865
  subscriber,
881
- loading,
882
- error,
883
866
  isAuthenticated: !!subscriber,
884
- login,
885
- logout,
886
- refreshSubscriber
867
+ isLoading,
868
+ loading: isLoading,
869
+ // Alias for backward compatibility
870
+ error,
871
+ signOut,
872
+ logout: signOut,
873
+ // Alias for backward compatibility
874
+ refreshAuth,
875
+ refreshSubscriber: refreshAuth,
876
+ // Alias for backward compatibility
877
+ login
878
+ // For backward compatibility
887
879
  };
888
880
  }
889
881
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/exports/client.ts","../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts"],"sourcesContent":["'use client'\n\n// React components\nexport { \n NewsletterForm, \n createNewsletterForm,\n PreferencesForm,\n createPreferencesForm,\n MagicLinkVerify,\n createMagicLinkVerify,\n} from '../components'\n\n// Hooks\nexport { useNewsletterAuth } from '../hooks/useNewsletterAuth'\n\n// Types for client-side use\nexport type {\n SignupFormProps,\n PreferencesFormProps,\n Subscriber,\n} from '../types'\n\nexport type {\n MagicLinkVerifyProps,\n} from '../components'\n\nexport type {\n UseNewsletterAuthOptions,\n UseNewsletterAuthReturn,\n} from '../hooks/useNewsletterAuth'","'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/client.ts","../src/components/NewsletterForm.tsx","../src/components/PreferencesForm.tsx","../src/components/MagicLinkVerify.tsx","../src/hooks/useNewsletterAuth.ts"],"sourcesContent":["'use client'\n\n// React components\nexport { \n NewsletterForm, \n createNewsletterForm,\n PreferencesForm,\n createPreferencesForm,\n MagicLinkVerify,\n createMagicLinkVerify,\n} from '../components'\n\n// Hooks\nexport { useNewsletterAuth } from '../hooks/useNewsletterAuth'\n\n// Types for client-side use\nexport type {\n SignupFormProps,\n PreferencesFormProps,\n Subscriber,\n} from '../types'\n\nexport type {\n MagicLinkVerifyProps,\n} from '../components'\n\nexport type {\n UseNewsletterAuthOptions,\n UseNewsletterAuthReturn,\n} from '../hooks/useNewsletterAuth'","'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/client.d.cts CHANGED
@@ -35,18 +35,19 @@ declare const MagicLinkVerify: React.FC<MagicLinkVerifyProps>;
35
35
  declare function createMagicLinkVerify(defaultProps: Partial<MagicLinkVerifyProps>): React.FC<MagicLinkVerifyProps>;
36
36
 
37
37
  interface UseNewsletterAuthOptions {
38
- sessionTokenKey?: string;
39
- apiEndpoint?: string;
40
38
  }
41
39
  interface UseNewsletterAuthReturn {
42
40
  subscriber: Subscriber | null;
41
+ isAuthenticated: boolean;
42
+ isLoading: boolean;
43
43
  loading: boolean;
44
44
  error: Error | null;
45
- isAuthenticated: boolean;
46
- login: (token: string) => Promise<void>;
47
- logout: () => void;
45
+ signOut: () => Promise<void>;
46
+ logout: () => Promise<void>;
47
+ refreshAuth: () => Promise<void>;
48
48
  refreshSubscriber: () => Promise<void>;
49
+ login: (token: string) => Promise<void>;
49
50
  }
50
- declare function useNewsletterAuth(options?: UseNewsletterAuthOptions): UseNewsletterAuthReturn;
51
+ declare function useNewsletterAuth(_options?: UseNewsletterAuthOptions): UseNewsletterAuthReturn;
51
52
 
52
53
  export { MagicLinkVerify, type MagicLinkVerifyProps, NewsletterForm, PreferencesForm, PreferencesFormProps, SignupFormProps, Subscriber, type UseNewsletterAuthOptions, type UseNewsletterAuthReturn, createMagicLinkVerify, createNewsletterForm, createPreferencesForm, useNewsletterAuth };
package/dist/client.d.ts CHANGED
@@ -35,18 +35,19 @@ declare const MagicLinkVerify: React.FC<MagicLinkVerifyProps>;
35
35
  declare function createMagicLinkVerify(defaultProps: Partial<MagicLinkVerifyProps>): React.FC<MagicLinkVerifyProps>;
36
36
 
37
37
  interface UseNewsletterAuthOptions {
38
- sessionTokenKey?: string;
39
- apiEndpoint?: string;
40
38
  }
41
39
  interface UseNewsletterAuthReturn {
42
40
  subscriber: Subscriber | null;
41
+ isAuthenticated: boolean;
42
+ isLoading: boolean;
43
43
  loading: boolean;
44
44
  error: Error | null;
45
- isAuthenticated: boolean;
46
- login: (token: string) => Promise<void>;
47
- logout: () => void;
45
+ signOut: () => Promise<void>;
46
+ logout: () => Promise<void>;
47
+ refreshAuth: () => Promise<void>;
48
48
  refreshSubscriber: () => Promise<void>;
49
+ login: (token: string) => Promise<void>;
49
50
  }
50
- declare function useNewsletterAuth(options?: UseNewsletterAuthOptions): UseNewsletterAuthReturn;
51
+ declare function useNewsletterAuth(_options?: UseNewsletterAuthOptions): UseNewsletterAuthReturn;
51
52
 
52
53
  export { MagicLinkVerify, type MagicLinkVerifyProps, NewsletterForm, PreferencesForm, PreferencesFormProps, SignupFormProps, Subscriber, type UseNewsletterAuthOptions, type UseNewsletterAuthReturn, createMagicLinkVerify, createNewsletterForm, createPreferencesForm, useNewsletterAuth };