@djangocfg/ext-newsletter 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/hooks.js DELETED
@@ -1,370 +0,0 @@
1
- import { createNewsletterBulkCreate, getNewsletterCampaignsList, createNewsletterCampaignsCreate, getNewsletterCampaignsRetrieve, updateNewsletterCampaignsUpdate, deleteNewsletterCampaignsDestroy, createNewsletterCampaignsSendCreate, getNewsletterLogsList, getNewsletterNewslettersList, getNewsletterNewslettersRetrieve, createNewsletterSubscribeCreate, getNewsletterSubscriptionsList, createNewsletterUnsubscribeCreate, createNewsletterTestCreate, partialUpdateNewsletterCampaignsPartialUpdate, updateNewsletterUnsubscribeUpdate, partialUpdateNewsletterUnsubscribePartialUpdate, apiNewsletter } from './chunk-LQLPNWHR.js';
2
- export { API, APIClient, APIError, APILogger, BulkEmailRequestSchema, BulkEmailResponseSchema, CookieStorageAdapter, DEFAULT_RETRY_CONFIG, EmailLogSchema, enums_exports as Enums, ErrorResponseSchema, models_exports as ExtNewsletterBulkEmailTypes, models_exports2 as ExtNewsletterCampaignsTypes, models_exports3 as ExtNewsletterLogsTypes, models_exports7 as ExtNewsletterNewsletterTypes, models_exports4 as ExtNewsletterNewslettersTypes, models_exports5 as ExtNewsletterSubscriptionsTypes, models_exports6 as ExtNewsletterTestingTypes, FetchAdapter, fetchers_exports as Fetchers, LocalStorageAdapter, MemoryStorageAdapter, NetworkError, NewsletterCampaignRequestSchema, NewsletterCampaignSchema, NewsletterSchema, NewsletterSubscriptionSchema, PaginatedEmailLogListSchema, PaginatedNewsletterCampaignListSchema, PaginatedNewsletterListSchema, PaginatedNewsletterSubscriptionListSchema, PatchedNewsletterCampaignRequestSchema, PatchedUnsubscribeRequestSchema, REFRESH_TOKEN_KEY, schemas_exports as Schemas, SendCampaignRequestSchema, SendCampaignResponseSchema, SubscribeRequestSchema, SubscribeResponseSchema, SuccessResponseSchema, TOKEN_KEY, TestEmailRequestSchema, UnsubscribeRequestSchema, UnsubscribeSchema, apiNewsletter, clearAPITokens, configureAPI, createNewsletterBulkCreate, createNewsletterCampaignsCreate, createNewsletterCampaignsSendCreate, createNewsletterSubscribeCreate, createNewsletterTestCreate, createNewsletterUnsubscribeCreate, deleteNewsletterCampaignsDestroy, dispatchValidationError, formatZodError, getAPIInstance, getNewsletterCampaignsList, getNewsletterCampaignsRetrieve, getNewsletterLogsList, getNewsletterNewslettersList, getNewsletterNewslettersRetrieve, getNewsletterSubscriptionsList, isAPIConfigured, onValidationError, partialUpdateNewsletterCampaignsPartialUpdate, partialUpdateNewsletterUnsubscribePartialUpdate, reconfigureAPI, resetAPI, shouldRetry, updateNewsletterCampaignsUpdate, updateNewsletterUnsubscribeUpdate, withRetry } from './chunk-LQLPNWHR.js';
3
- import useSWR, { useSWRConfig } from 'swr';
4
- import { createContext, useContext, useState } from 'react';
5
- import { ExtensionProvider } from '@djangocfg/ext-base/hooks';
6
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
- import { Button, Input } from '@djangocfg/ui-nextjs';
8
- import { Mail, Loader2, CheckCircle2, AlertCircle } from 'lucide-react';
9
- import { createConsola } from 'consola';
10
-
11
- function useCreateNewsletterBulkCreate() {
12
- const { mutate } = useSWRConfig();
13
- return async (data, client) => {
14
- const result = await createNewsletterBulkCreate(data, client);
15
- mutate("cfg-newsletter-bulk");
16
- return result;
17
- };
18
- }
19
- function useNewsletterCampaignsList(params, client) {
20
- return useSWR(
21
- params ? ["cfg-newsletter-campaigns", params] : "cfg-newsletter-campaigns",
22
- () => getNewsletterCampaignsList(params, client)
23
- );
24
- }
25
- function useCreateNewsletterCampaignsCreate() {
26
- const { mutate } = useSWRConfig();
27
- return async (data, client) => {
28
- const result = await createNewsletterCampaignsCreate(data, client);
29
- mutate("cfg-newsletter-campaigns");
30
- return result;
31
- };
32
- }
33
- function useNewsletterCampaignsRetrieve(id, client) {
34
- return useSWR(
35
- ["cfg-newsletter-campaign", id],
36
- () => getNewsletterCampaignsRetrieve(id, client)
37
- );
38
- }
39
- function useUpdateNewsletterCampaignsUpdate() {
40
- const { mutate } = useSWRConfig();
41
- return async (id, data, client) => {
42
- const result = await updateNewsletterCampaignsUpdate(id, data, client);
43
- mutate("cfg-newsletter-campaigns");
44
- mutate("cfg-newsletter-campaign");
45
- return result;
46
- };
47
- }
48
- function useDeleteNewsletterCampaignsDestroy() {
49
- const { mutate } = useSWRConfig();
50
- return async (id, client) => {
51
- const result = await deleteNewsletterCampaignsDestroy(id, client);
52
- mutate("cfg-newsletter-campaigns");
53
- mutate("cfg-newsletter-campaign");
54
- return result;
55
- };
56
- }
57
- function useCreateNewsletterCampaignsSendCreate() {
58
- const { mutate } = useSWRConfig();
59
- return async (data, client) => {
60
- const result = await createNewsletterCampaignsSendCreate(data, client);
61
- mutate("cfg-newsletter-campaigns-send");
62
- return result;
63
- };
64
- }
65
- function useNewsletterLogsList(params, client) {
66
- return useSWR(
67
- params ? ["cfg-newsletter-logs", params] : "cfg-newsletter-logs",
68
- () => getNewsletterLogsList(params, client)
69
- );
70
- }
71
- function useNewsletterNewslettersList(params, client) {
72
- return useSWR(
73
- params ? ["cfg-newsletter-newsletters", params] : "cfg-newsletter-newsletters",
74
- () => getNewsletterNewslettersList(params, client)
75
- );
76
- }
77
- function useNewsletterNewslettersRetrieve(id, client) {
78
- return useSWR(
79
- ["cfg-newsletter-newsletter", id],
80
- () => getNewsletterNewslettersRetrieve(id, client)
81
- );
82
- }
83
- function useCreateNewsletterSubscribeCreate() {
84
- const { mutate } = useSWRConfig();
85
- return async (data, client) => {
86
- const result = await createNewsletterSubscribeCreate(data, client);
87
- mutate("cfg-newsletter-subscribe");
88
- return result;
89
- };
90
- }
91
- function useNewsletterSubscriptionsList(params, client) {
92
- return useSWR(
93
- params ? ["cfg-newsletter-subscriptions", params] : "cfg-newsletter-subscriptions",
94
- () => getNewsletterSubscriptionsList(params, client)
95
- );
96
- }
97
- function useCreateNewsletterUnsubscribeCreate() {
98
- const { mutate } = useSWRConfig();
99
- return async (data, client) => {
100
- const result = await createNewsletterUnsubscribeCreate(data, client);
101
- mutate("cfg-newsletter-unsubscribe");
102
- return result;
103
- };
104
- }
105
- function useCreateNewsletterTestCreate() {
106
- const { mutate } = useSWRConfig();
107
- return async (data, client) => {
108
- const result = await createNewsletterTestCreate(data, client);
109
- mutate("cfg-newsletter-test");
110
- return result;
111
- };
112
- }
113
- function usePartialUpdateNewsletterCampaignsPartialUpdate() {
114
- const { mutate } = useSWRConfig();
115
- return async (id, data, client) => {
116
- const result = await partialUpdateNewsletterCampaignsPartialUpdate(id, data, client);
117
- mutate("cfg-newsletter-campaigns-partial");
118
- return result;
119
- };
120
- }
121
- function useUpdateNewsletterUnsubscribeUpdate() {
122
- const { mutate } = useSWRConfig();
123
- return async (data, client) => {
124
- const result = await updateNewsletterUnsubscribeUpdate(data, client);
125
- mutate("cfg-newsletter-unsubscribe");
126
- return result;
127
- };
128
- }
129
- function usePartialUpdateNewsletterUnsubscribePartialUpdate() {
130
- const { mutate } = useSWRConfig();
131
- return async (data, client) => {
132
- const result = await partialUpdateNewsletterUnsubscribePartialUpdate(data, client);
133
- mutate("cfg-newsletter-unsubscribe-partial");
134
- return result;
135
- };
136
- }
137
-
138
- // src/config.ts
139
- var extensionConfig = {
140
- name: "newsletter",
141
- version: "1.0.0",
142
- author: "DjangoCFG",
143
- displayName: "Newsletter",
144
- description: "Newsletter subscription and campaign management",
145
- icon: "\u{1F4E7}",
146
- license: "MIT",
147
- githubUrl: "https://github.com/markolofsen/django-cfg",
148
- homepage: "https://djangocfg.com",
149
- keywords: ["newsletter", "email", "subscription", "campaign", "marketing"],
150
- dependencies: [],
151
- minVersion: "2.0.0"
152
- };
153
- var NewsletterContext = createContext(void 0);
154
- function NewsletterProvider({
155
- children,
156
- page = 1,
157
- pageSize = 100
158
- }) {
159
- const { mutate } = useSWRConfig();
160
- const swrConfig = {
161
- revalidateOnFocus: false,
162
- revalidateOnReconnect: false,
163
- revalidateIfStale: false
164
- };
165
- const listParams = { page, page_size: pageSize };
166
- const {
167
- data: campaignsData,
168
- error: campaignsError,
169
- isLoading: isLoadingCampaigns
170
- } = useNewsletterCampaignsList(listParams, apiNewsletter);
171
- const {
172
- data: subscriptionsData,
173
- error: subscriptionsError,
174
- isLoading: isLoadingSubscriptions
175
- } = useNewsletterSubscriptionsList(listParams, apiNewsletter);
176
- const createCampaignMutation = useCreateNewsletterCampaignsCreate();
177
- const updateCampaignMutation = useUpdateNewsletterCampaignsUpdate();
178
- usePartialUpdateNewsletterCampaignsPartialUpdate();
179
- const deleteCampaignMutation = useDeleteNewsletterCampaignsDestroy();
180
- const sendCampaignMutation = useCreateNewsletterCampaignsSendCreate();
181
- const subscribeMutation = useCreateNewsletterSubscribeCreate();
182
- const unsubscribeMutation = useCreateNewsletterUnsubscribeCreate();
183
- const campaigns = campaignsData?.results || [];
184
- const subscriptions = subscriptionsData?.results || [];
185
- const getCampaign = (id) => {
186
- const { data, error, isLoading } = useNewsletterCampaignsRetrieve(id, apiNewsletter);
187
- return { data, error, isLoading };
188
- };
189
- const createCampaign = async (data) => {
190
- const result = await createCampaignMutation(data, apiNewsletter);
191
- await mutate(["cfg-newsletter-campaigns-list", listParams]);
192
- return result;
193
- };
194
- const updateCampaign = async (id, data) => {
195
- const result = await updateCampaignMutation(id, data, apiNewsletter);
196
- await mutate(["cfg-newsletter-campaigns-list", listParams]);
197
- await mutate(["cfg-newsletter-campaigns-retrieve", id]);
198
- return result;
199
- };
200
- const partialUpdateCampaign = async (id, data) => {
201
- const result = await updateCampaignMutation(id, data);
202
- await mutate(["cfg-newsletter-campaigns-list", listParams]);
203
- await mutate(["cfg-newsletter-campaigns-retrieve", id]);
204
- return result;
205
- };
206
- const deleteCampaign = async (id) => {
207
- await deleteCampaignMutation(id, apiNewsletter);
208
- await mutate(["cfg-newsletter-campaigns-list", listParams]);
209
- };
210
- const sendCampaign = async (campaignId) => {
211
- const result = await sendCampaignMutation({ campaign_id: campaignId }, apiNewsletter);
212
- await mutate(["cfg-newsletter-campaigns-list", listParams]);
213
- await mutate(["cfg-newsletter-campaigns-retrieve", campaignId]);
214
- return result;
215
- };
216
- const subscribe = async (data) => {
217
- const result = await subscribeMutation(data, apiNewsletter);
218
- await mutate(["cfg-newsletter-subscriptions-list", listParams]);
219
- return result;
220
- };
221
- const unsubscribe = async (data) => {
222
- const result = await unsubscribeMutation(data, apiNewsletter);
223
- await mutate(["cfg-newsletter-subscriptions-list", listParams]);
224
- return result;
225
- };
226
- const value = {
227
- campaigns,
228
- isLoadingCampaigns,
229
- campaignsError,
230
- pagination: campaignsData ? {
231
- count: campaignsData.count,
232
- next: campaignsData.next_page ?? null,
233
- previous: campaignsData.previous_page ?? null
234
- } : void 0,
235
- getCampaign,
236
- createCampaign,
237
- updateCampaign,
238
- partialUpdateCampaign,
239
- deleteCampaign,
240
- sendCampaign,
241
- subscriptions,
242
- isLoadingSubscriptions,
243
- subscriptionsError,
244
- subscribe,
245
- unsubscribe
246
- };
247
- return /* @__PURE__ */ jsx(ExtensionProvider, { metadata: extensionConfig, options: swrConfig, children: /* @__PURE__ */ jsx(NewsletterContext.Provider, { value, children }) });
248
- }
249
- function useNewsletterContext() {
250
- const context = useContext(NewsletterContext);
251
- if (!context) {
252
- throw new Error("useNewsletterContext must be used within NewsletterProvider");
253
- }
254
- return context;
255
- }
256
- var isDevelopment = process.env.NODE_ENV === "development";
257
- var logger = createConsola({
258
- level: isDevelopment ? 4 : 1
259
- }).withTag("ext-newsletter");
260
- var newsletterLogger = logger;
261
- function Hero({
262
- title,
263
- description,
264
- primaryAction,
265
- secondaryAction,
266
- showNewsletter = true,
267
- newsletterPlaceholder = "Enter your email",
268
- newsletterButtonText = "Subscribe",
269
- onNewsletterSubmit,
270
- className = ""
271
- }) {
272
- const [email, setEmail] = useState("");
273
- const [isLoading, setIsLoading] = useState(false);
274
- const [status, setStatus] = useState("idle");
275
- const [message, setMessage] = useState("");
276
- const handleSubmit = async (e) => {
277
- e.preventDefault();
278
- if (!email || !onNewsletterSubmit) return;
279
- setIsLoading(true);
280
- setStatus("idle");
281
- setMessage("");
282
- try {
283
- const result = await onNewsletterSubmit(email);
284
- setStatus("success");
285
- setMessage((result && "message" in result ? result.message : void 0) || "Successfully subscribed!");
286
- setEmail("");
287
- newsletterLogger.success("Newsletter subscription successful:", email);
288
- } catch (error) {
289
- setStatus("error");
290
- setMessage(error instanceof Error ? error.message : "Subscription failed. Please try again.");
291
- newsletterLogger.error("Newsletter subscription failed:", error);
292
- } finally {
293
- setIsLoading(false);
294
- setTimeout(() => {
295
- setStatus("idle");
296
- setMessage("");
297
- }, 5e3);
298
- }
299
- };
300
- return /* @__PURE__ */ jsx("section", { className: `relative py-16 sm:py-20 md:py-24 lg:py-32 ${className}`, children: /* @__PURE__ */ jsx("div", { className: "container max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxs("div", { className: "max-w-3xl mx-auto text-center", children: [
301
- /* @__PURE__ */ jsx("h1", { className: "text-4xl sm:text-5xl md:text-6xl font-bold tracking-tight text-foreground mb-6", children: title }),
302
- description && /* @__PURE__ */ jsx("p", { className: "text-lg sm:text-xl text-muted-foreground mb-8 max-w-2xl mx-auto", children: description }),
303
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-4 justify-center items-center mb-12", children: [
304
- primaryAction && /* @__PURE__ */ jsx(
305
- Button,
306
- {
307
- size: "lg",
308
- onClick: primaryAction.onClick,
309
- className: "w-full sm:w-auto",
310
- children: primaryAction.label
311
- }
312
- ),
313
- secondaryAction && /* @__PURE__ */ jsx(
314
- Button,
315
- {
316
- size: "lg",
317
- variant: "outline",
318
- onClick: secondaryAction.onClick,
319
- className: "w-full sm:w-auto",
320
- children: secondaryAction.label
321
- }
322
- )
323
- ] }),
324
- showNewsletter && onNewsletterSubmit && /* @__PURE__ */ jsxs("div", { className: "max-w-md mx-auto", children: [
325
- /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-3", children: [
326
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col sm:flex-row gap-2", children: [
327
- /* @__PURE__ */ jsxs("div", { className: "relative flex-1", children: [
328
- /* @__PURE__ */ jsx(Mail, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-5 w-5 text-muted-foreground" }),
329
- /* @__PURE__ */ jsx(
330
- Input,
331
- {
332
- type: "email",
333
- placeholder: newsletterPlaceholder,
334
- value: email,
335
- onChange: (e) => setEmail(e.target.value),
336
- disabled: isLoading,
337
- required: true,
338
- className: "pl-10"
339
- }
340
- )
341
- ] }),
342
- /* @__PURE__ */ jsx(
343
- Button,
344
- {
345
- type: "submit",
346
- disabled: isLoading || !email,
347
- className: "w-full sm:w-auto",
348
- children: isLoading ? /* @__PURE__ */ jsxs(Fragment, { children: [
349
- /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }),
350
- "Subscribing..."
351
- ] }) : newsletterButtonText
352
- }
353
- )
354
- ] }),
355
- status === "success" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-green-600 dark:text-green-400", children: [
356
- /* @__PURE__ */ jsx(CheckCircle2, { className: "h-4 w-4" }),
357
- /* @__PURE__ */ jsx("span", { children: message })
358
- ] }),
359
- status === "error" && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-red-600 dark:text-red-400", children: [
360
- /* @__PURE__ */ jsx(AlertCircle, { className: "h-4 w-4" }),
361
- /* @__PURE__ */ jsx("span", { children: message })
362
- ] })
363
- ] }),
364
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground mt-3", children: "By subscribing, you agree to our Privacy Policy and consent to receive updates." })
365
- ] })
366
- ] }) }) });
367
- }
368
- var Hero_default = Hero;
369
-
370
- export { Hero, Hero_default as NewsletterHero, NewsletterProvider, useCreateNewsletterBulkCreate, useCreateNewsletterCampaignsCreate, useCreateNewsletterCampaignsSendCreate, useCreateNewsletterSubscribeCreate, useCreateNewsletterTestCreate, useCreateNewsletterUnsubscribeCreate, useDeleteNewsletterCampaignsDestroy, useNewsletterCampaignsList, useNewsletterCampaignsRetrieve, useNewsletterContext, useNewsletterLogsList, useNewsletterNewslettersList, useNewsletterNewslettersRetrieve, useNewsletterSubscriptionsList, usePartialUpdateNewsletterCampaignsPartialUpdate, usePartialUpdateNewsletterUnsubscribePartialUpdate, useUpdateNewsletterCampaignsUpdate, useUpdateNewsletterUnsubscribeUpdate };