strapi-plugin-magic-link-v5 5.5.8 → 6.0.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +740 -0
  2. package/README.md +662 -928
  3. package/dist/admin/LicenseGuard-BgLA9go3.mjs +495 -0
  4. package/dist/admin/LicenseGuard-ewCjpc17.js +513 -0
  5. package/dist/admin/de-B1FNErPH.mjs +673 -0
  6. package/dist/admin/de-e75OECdq.js +673 -0
  7. package/dist/admin/en-CABKGbxH.js +673 -0
  8. package/dist/admin/en-HqDOFBCc.mjs +673 -0
  9. package/dist/admin/es-DpWl0Fax.js +673 -0
  10. package/dist/admin/es-jb94jqPR.mjs +673 -0
  11. package/dist/admin/fr-BQhLPvYw.js +673 -0
  12. package/dist/admin/fr-BseH1wrr.mjs +673 -0
  13. package/dist/admin/index-6ot9j1cN.js +5268 -0
  14. package/dist/admin/index-B390rccl.js +622 -0
  15. package/dist/admin/index-BPGKtruf.mjs +5266 -0
  16. package/dist/admin/index-BaTIQtnA.js +3869 -0
  17. package/dist/admin/index-CmG-93yx.js +141 -0
  18. package/dist/admin/index-DXe_ge4v.mjs +620 -0
  19. package/dist/admin/index-Dv5PVT1E.mjs +3867 -0
  20. package/dist/admin/index-k240ls6p.mjs +142 -0
  21. package/dist/admin/index.js +3 -3
  22. package/dist/admin/index.mjs +1 -2
  23. package/dist/admin/pt-CPkaveti.js +673 -0
  24. package/dist/admin/pt-DhlSCJn2.mjs +673 -0
  25. package/dist/admin/useUnsavedChangesGuard-BVZ4Mg4E.js +225 -0
  26. package/dist/admin/useUnsavedChangesGuard-QnkiZTLP.mjs +224 -0
  27. package/dist/server/i18n/de.json +32 -1
  28. package/dist/server/i18n/en.json +32 -1
  29. package/dist/server/i18n/es.json +32 -1
  30. package/dist/server/i18n/fr.json +32 -1
  31. package/dist/server/i18n/pt.json +32 -1
  32. package/dist/server/index.js +7092 -5979
  33. package/dist/server/index.mjs +7114 -5979
  34. package/package.json +42 -41
  35. package/strapi-admin.js +3 -1
  36. package/strapi-server.js +3 -2
  37. package/dist/_chunks/LicenseGuard-CiyjFnrw.js +0 -54
  38. package/dist/_chunks/LicenseGuard-DJ5fq2UZ.mjs +0 -55
  39. package/dist/_chunks/de-BSOk5suQ.js +0 -454
  40. package/dist/_chunks/de-CwhYs3O3.mjs +0 -454
  41. package/dist/_chunks/en-DnvSpXvu.js +0 -454
  42. package/dist/_chunks/en-gXXgGDV1.mjs +0 -454
  43. package/dist/_chunks/es-B-tnwByt.js +0 -407
  44. package/dist/_chunks/es-DG5gW3RZ.mjs +0 -407
  45. package/dist/_chunks/fr-BKo8t7Fx.js +0 -407
  46. package/dist/_chunks/fr-BQn1OHOR.mjs +0 -407
  47. package/dist/_chunks/index-01GHNxSr.js +0 -307
  48. package/dist/_chunks/index-B9Ch8Jpe.mjs +0 -5066
  49. package/dist/_chunks/index-Bj-erY7g.mjs +0 -143
  50. package/dist/_chunks/index-CGxbhJfg.js +0 -142
  51. package/dist/_chunks/index-DF3Edydl.mjs +0 -330
  52. package/dist/_chunks/index-Dufv-daf.mjs +0 -305
  53. package/dist/_chunks/index-I72rBTkL.js +0 -332
  54. package/dist/_chunks/index-SCxv154G.mjs +0 -2904
  55. package/dist/_chunks/index-XYWLmmEs.js +0 -5068
  56. package/dist/_chunks/index-zzoovbM0.js +0 -2906
  57. package/dist/_chunks/pt-CjEkXBAz.js +0 -407
  58. package/dist/_chunks/pt-trziAOzT.mjs +0 -407
@@ -1,307 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("react");
5
- const designSystem = require("@strapi/design-system");
6
- const admin = require("@strapi/strapi/admin");
7
- const icons = require("@strapi/icons");
8
- const styled = require("styled-components");
9
- const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
10
- const styled__default = /* @__PURE__ */ _interopDefault(styled);
11
- const theme = {
12
- colors: {
13
- neutral: { 200: "#E5E7EB" }
14
- },
15
- shadows: { sm: "0 1px 3px rgba(0,0,0,0.1)" },
16
- borderRadius: { lg: "12px" }
17
- };
18
- const fadeIn = styled.keyframes`
19
- from { opacity: 0; transform: translateY(10px); }
20
- to { opacity: 1; transform: translateY(0); }
21
- `;
22
- const shimmer = styled.keyframes`
23
- 0% { background-position: -200% 0; }
24
- 100% { background-position: 200% 0; }
25
- `;
26
- const Container = styled__default.default(designSystem.Box)`
27
- animation: ${fadeIn} 0.5s;
28
- max-width: 1400px;
29
- margin: 0 auto;
30
- `;
31
- const StickySaveBar = styled__default.default(designSystem.Box)`
32
- position: sticky;
33
- top: 0;
34
- z-index: 10;
35
- background: white;
36
- border-bottom: 1px solid ${theme.colors.neutral[200]};
37
- box-shadow: ${theme.shadows.sm};
38
- `;
39
- const LicenseKeyBanner = styled__default.default(designSystem.Box)`
40
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
41
- border-radius: ${theme.borderRadius.lg};
42
- padding: 28px 32px;
43
- color: white;
44
- position: relative;
45
- overflow: hidden;
46
- box-shadow: 0 4px 20px rgba(102, 126, 234, 0.25);
47
- margin-bottom: 24px;
48
-
49
- &::after {
50
- content: '';
51
- position: absolute;
52
- top: -50%;
53
- right: -50%;
54
- width: 200%;
55
- height: 200%;
56
- background: linear-gradient(
57
- 45deg,
58
- transparent,
59
- rgba(255, 255, 255, 0.08),
60
- transparent
61
- );
62
- animation: ${shimmer} 3s infinite;
63
- pointer-events: none;
64
- z-index: 0;
65
- }
66
-
67
- & > * {
68
- position: relative;
69
- z-index: 1;
70
- }
71
- `;
72
- styled__default.default(designSystem.Flex)`
73
- padding: 16px 0;
74
- border-bottom: 1px solid ${theme.colors.neutral[200]};
75
-
76
- &:last-child {
77
- border-bottom: none;
78
- }
79
- `;
80
- const LoaderContainer = styled__default.default(designSystem.Flex)`
81
- min-height: 400px;
82
- align-items: center;
83
- justify-content: center;
84
- flex-direction: column;
85
- gap: 16px;
86
- `;
87
- const LicensePage = () => {
88
- const { get } = admin.useFetchClient();
89
- const { toggleNotification } = admin.useNotification();
90
- const [loading, setLoading] = react.useState(true);
91
- const [licenseData, setLicenseData] = react.useState(null);
92
- const [error, setError] = react.useState(null);
93
- const fetchLicenseStatus = async () => {
94
- setLoading(true);
95
- setError(null);
96
- try {
97
- const response = await get("/magic-link/license/status");
98
- setLicenseData(response.data);
99
- } catch (err) {
100
- console.error("Error fetching license:", err);
101
- setError("Failed to load license information");
102
- } finally {
103
- setLoading(false);
104
- }
105
- };
106
- const handleCopyLicenseKey = async () => {
107
- try {
108
- await navigator.clipboard.writeText(licenseData?.data?.licenseKey || "");
109
- toggleNotification({
110
- type: "success",
111
- message: "License key copied to clipboard!",
112
- title: "Copied"
113
- });
114
- } catch (err) {
115
- toggleNotification({
116
- type: "danger",
117
- message: "Failed to copy license key",
118
- title: "Error"
119
- });
120
- }
121
- };
122
- const handleDownloadLicenseKey = () => {
123
- try {
124
- const data2 = licenseData?.data || {};
125
- const licenseKey = data2.licenseKey || "";
126
- const email = data2.email || "N/A";
127
- const firstName = data2.firstName || "";
128
- const lastName = data2.lastName || "";
129
- const fullName = `${firstName} ${lastName}`.trim() || "N/A";
130
- const content = `Magic Link Plugin License Key
131
- ═══════════════════════════════════════
132
-
133
- License Key: ${licenseKey}
134
-
135
- License Holder Information:
136
- ──────────────────────────────────────
137
- Name: ${fullName}
138
- Email: ${email}
139
-
140
- License Status:
141
- ──────────────────────────────────────
142
- Status: ${data2.isActive ? "ACTIVE" : "INACTIVE"}
143
- Expires: ${data2.expiresAt ? new Date(data2.expiresAt).toLocaleDateString() : "Never"}
144
-
145
- ═══════════════════════════════════════
146
- Generated: ${(/* @__PURE__ */ new Date()).toLocaleString()}
147
- `;
148
- const blob = new Blob([content], { type: "text/plain" });
149
- const url = window.URL.createObjectURL(blob);
150
- const link = document.createElement("a");
151
- link.href = url;
152
- link.download = `magic-link-license-${licenseKey.substring(0, 8)}.txt`;
153
- document.body.appendChild(link);
154
- link.click();
155
- document.body.removeChild(link);
156
- window.URL.revokeObjectURL(url);
157
- toggleNotification({
158
- type: "success",
159
- message: "License key downloaded successfully!",
160
- title: "Downloaded"
161
- });
162
- } catch (err) {
163
- toggleNotification({
164
- type: "danger",
165
- message: "Failed to download license key",
166
- title: "Error"
167
- });
168
- }
169
- };
170
- react.useEffect(() => {
171
- fetchLicenseStatus();
172
- }, []);
173
- if (loading) {
174
- return /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsx(LoaderContainer, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Loader, { children: "Loading license information..." }) }) });
175
- }
176
- if (error) {
177
- return /* @__PURE__ */ jsxRuntime.jsx(Container, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 8, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { variant: "danger", title: "Error", children: error }) }) });
178
- }
179
- const isValid = licenseData?.valid !== false;
180
- const hasKey = !!licenseData?.hasKey;
181
- const data = licenseData?.data || {};
182
- return /* @__PURE__ */ jsxRuntime.jsxs(Container, { children: [
183
- /* @__PURE__ */ jsxRuntime.jsx(StickySaveBar, { paddingTop: 5, paddingBottom: 5, paddingLeft: 6, paddingRight: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "center", children: [
184
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 1, children: [
185
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", fontWeight: "bold", children: "License Management" }),
186
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "epsilon", textColor: "neutral600", children: "View your Magic Link plugin license" })
187
- ] }),
188
- /* @__PURE__ */ jsxRuntime.jsx(
189
- designSystem.Button,
190
- {
191
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowClockwise, {}),
192
- onClick: fetchLicenseStatus,
193
- size: "L",
194
- style: {
195
- background: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
196
- color: "white",
197
- fontWeight: "600",
198
- border: "none"
199
- },
200
- children: "Refresh Status"
201
- }
202
- )
203
- ] }) }),
204
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { paddingTop: 6, paddingLeft: 6, paddingRight: 6, paddingBottom: 10, children: [
205
- hasKey && isValid ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { variant: "success", title: "License Active", children: "License key registered. Thanks for supporting the plugin!" }) : hasKey && !isValid ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { variant: "warning", title: "License Verification", children: "We couldn't reach the license server right now. The plugin keeps working — try Refresh Status later." }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Alert, { variant: "default", title: "No license key registered", children: 'All Magic Link features are available without activation. If you want to register a license key, use the form below or run "Auto-Activate" to generate one for your admin email.' }),
206
- data.licenseKey && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 6, children: /* @__PURE__ */ jsxRuntime.jsx(LicenseKeyBanner, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", alignItems: "flex-start", children: [
207
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: 1 }, children: [
208
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", style: { color: "rgba(255,255,255,0.8)", marginBottom: "12px", textTransform: "uppercase", fontSize: "11px", letterSpacing: "0.5px", display: "block" }, children: "License Key" }),
209
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { style: { color: "white", fontFamily: "monospace", fontSize: "28px", fontWeight: "bold", wordBreak: "break-all", marginBottom: "16px" }, children: data.licenseKey }),
210
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
211
- /* @__PURE__ */ jsxRuntime.jsx(
212
- designSystem.Button,
213
- {
214
- onClick: handleCopyLicenseKey,
215
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Duplicate, {}),
216
- size: "S",
217
- variant: "secondary",
218
- style: {
219
- backgroundColor: "rgba(255,255,255,0.2)",
220
- color: "white",
221
- border: "1px solid rgba(255,255,255,0.3)",
222
- fontWeight: "600"
223
- },
224
- children: "Copy Key"
225
- }
226
- ),
227
- /* @__PURE__ */ jsxRuntime.jsx(
228
- designSystem.Button,
229
- {
230
- onClick: handleDownloadLicenseKey,
231
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
232
- size: "S",
233
- variant: "secondary",
234
- style: {
235
- backgroundColor: "rgba(255,255,255,0.2)",
236
- color: "white",
237
- border: "1px solid rgba(255,255,255,0.3)",
238
- fontWeight: "600"
239
- },
240
- children: "Download as TXT"
241
- }
242
- )
243
- ] })
244
- ] }),
245
- /* @__PURE__ */ jsxRuntime.jsx(
246
- designSystem.Badge,
247
- {
248
- backgroundColor: data.isActive ? "success100" : "danger100",
249
- textColor: data.isActive ? "success700" : "danger700",
250
- style: { fontSize: "11px", fontWeight: "700", padding: "6px 12px", marginLeft: "16px", flexShrink: 0 },
251
- children: data.isActive ? "ACTIVE" : "INACTIVE"
252
- }
253
- )
254
- ] }) }) }),
255
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Root, { defaultValue: ["account", "details", "features", "status"], children: [
256
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: "account", children: [
257
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { icon: icons.User, children: "Account Information" }) }),
258
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, wrap: "wrap", children: [
259
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "200px" }, children: [
260
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "Email Address" }),
261
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: data.email || "Not provided" })
262
- ] }),
263
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "200px" }, children: [
264
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "License Holder" }),
265
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: data.firstName && data.lastName ? `${data.firstName} ${data.lastName}` : "Not specified" })
266
- ] })
267
- ] }) }) })
268
- ] }),
269
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: "details", children: [
270
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { icon: icons.Shield, children: "License Details" }) }),
271
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, wrap: "wrap", children: [
272
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "180px" }, children: [
273
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: data.isExpired ? "Expired On" : "Expires On" }),
274
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: data.expiresAt ? new Date(data.expiresAt).toLocaleDateString("en-US", {
275
- year: "numeric",
276
- month: "long",
277
- day: "numeric"
278
- }) : "Never" })
279
- ] }),
280
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "180px" }, children: [
281
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "Device Name" }),
282
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: data.deviceName || "Unknown" })
283
- ] }),
284
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "180px" }, children: [
285
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "IP Address" }),
286
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: data.ipAddress || "Not detected" })
287
- ] })
288
- ] }) }) })
289
- ] }),
290
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: "status", children: [
291
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { icon: icons.ChartBubble, children: "System Status" }) }),
292
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 6, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, wrap: "wrap", children: [
293
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "150px" }, children: [
294
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "License Status" }),
295
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: hasKey ? data.isActive ? "Active" : "Inactive" : "No key registered" })
296
- ] }),
297
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: { flex: "1", minWidth: "150px" }, children: [
298
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", textColor: "neutral600", textTransform: "uppercase", style: { marginBottom: "8px", display: "block" }, children: "Plugin Mode" }),
299
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "omega", fontWeight: "semiBold", children: "Fully unlocked" })
300
- ] })
301
- ] }) }) })
302
- ] })
303
- ] }) })
304
- ] })
305
- ] });
306
- };
307
- exports.default = LicensePage;