@codaijs/keel 0.2.2 → 0.2.4

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 (80) hide show
  1. package/dist/__tests__/sail-installer.test.js +25 -25
  2. package/dist/sail-installer.js +174 -174
  3. package/dist/scaffold.js +68 -68
  4. package/package.json +58 -58
  5. package/sails/_template/addon.json +20 -20
  6. package/sails/_template/install.ts +402 -402
  7. package/sails/admin-dashboard/README.md +117 -117
  8. package/sails/admin-dashboard/addon.json +28 -28
  9. package/sails/admin-dashboard/files/backend/middleware/admin.ts +34 -34
  10. package/sails/admin-dashboard/files/backend/routes/admin.ts +243 -243
  11. package/sails/admin-dashboard/files/frontend/components/admin/StatsCard.tsx +40 -40
  12. package/sails/admin-dashboard/files/frontend/components/admin/UsersTable.tsx +240 -240
  13. package/sails/admin-dashboard/files/frontend/hooks/useAdmin.ts +149 -149
  14. package/sails/admin-dashboard/files/frontend/pages/admin/Dashboard.tsx +173 -173
  15. package/sails/admin-dashboard/files/frontend/pages/admin/UserDetail.tsx +203 -203
  16. package/sails/admin-dashboard/install.ts +305 -305
  17. package/sails/analytics/README.md +178 -178
  18. package/sails/analytics/addon.json +27 -27
  19. package/sails/analytics/files/frontend/components/AnalyticsProvider.tsx +58 -58
  20. package/sails/analytics/files/frontend/hooks/useAnalytics.ts +64 -64
  21. package/sails/analytics/files/frontend/lib/analytics.ts +103 -103
  22. package/sails/analytics/install.ts +297 -297
  23. package/sails/file-uploads/addon.json +30 -30
  24. package/sails/file-uploads/files/backend/routes/files.ts +198 -198
  25. package/sails/file-uploads/files/backend/schema/files.ts +36 -36
  26. package/sails/file-uploads/files/backend/services/file-storage.ts +128 -128
  27. package/sails/file-uploads/files/frontend/components/FileList.tsx +248 -248
  28. package/sails/file-uploads/files/frontend/components/FileUploadButton.tsx +147 -147
  29. package/sails/file-uploads/files/frontend/hooks/useFileUpload.ts +106 -106
  30. package/sails/file-uploads/files/frontend/hooks/useFiles.ts +118 -118
  31. package/sails/file-uploads/files/frontend/pages/Files.tsx +37 -37
  32. package/sails/file-uploads/install.ts +466 -466
  33. package/sails/gdpr/README.md +174 -174
  34. package/sails/gdpr/addon.json +27 -27
  35. package/sails/gdpr/files/backend/routes/gdpr.ts +140 -140
  36. package/sails/gdpr/files/backend/services/gdpr.ts +293 -293
  37. package/sails/gdpr/files/frontend/components/auth/ConsentCheckboxes.tsx +97 -97
  38. package/sails/gdpr/files/frontend/components/gdpr/AccountDeletionRequest.tsx +192 -192
  39. package/sails/gdpr/files/frontend/components/gdpr/DataExportButton.tsx +75 -75
  40. package/sails/gdpr/files/frontend/pages/PrivacyPolicy.tsx +186 -186
  41. package/sails/gdpr/install.ts +756 -756
  42. package/sails/google-oauth/README.md +121 -121
  43. package/sails/google-oauth/addon.json +22 -22
  44. package/sails/google-oauth/files/GoogleButton.tsx +50 -50
  45. package/sails/google-oauth/install.ts +252 -252
  46. package/sails/i18n/README.md +193 -193
  47. package/sails/i18n/addon.json +30 -30
  48. package/sails/i18n/files/frontend/components/LanguageSwitcher.tsx +108 -108
  49. package/sails/i18n/files/frontend/hooks/useLanguage.ts +31 -31
  50. package/sails/i18n/files/frontend/lib/i18n.ts +32 -32
  51. package/sails/i18n/files/frontend/locales/de/common.json +44 -44
  52. package/sails/i18n/files/frontend/locales/en/common.json +44 -44
  53. package/sails/i18n/install.ts +407 -407
  54. package/sails/push-notifications/README.md +163 -163
  55. package/sails/push-notifications/addon.json +31 -31
  56. package/sails/push-notifications/files/backend/routes/notifications.ts +153 -153
  57. package/sails/push-notifications/files/backend/schema/notifications.ts +31 -31
  58. package/sails/push-notifications/files/backend/services/notifications.ts +117 -117
  59. package/sails/push-notifications/files/frontend/components/PushNotificationInit.tsx +12 -12
  60. package/sails/push-notifications/files/frontend/hooks/usePushNotifications.ts +154 -154
  61. package/sails/push-notifications/install.ts +384 -384
  62. package/sails/r2-storage/addon.json +29 -29
  63. package/sails/r2-storage/files/backend/services/storage.ts +71 -71
  64. package/sails/r2-storage/files/frontend/components/ProfilePictureUpload.tsx +167 -167
  65. package/sails/r2-storage/install.ts +412 -412
  66. package/sails/rate-limiting/addon.json +20 -20
  67. package/sails/rate-limiting/files/backend/middleware/rate-limit-store.ts +104 -104
  68. package/sails/rate-limiting/files/backend/middleware/rate-limit.ts +137 -137
  69. package/sails/rate-limiting/install.ts +300 -300
  70. package/sails/registry.json +107 -107
  71. package/sails/stripe/README.md +214 -214
  72. package/sails/stripe/addon.json +24 -24
  73. package/sails/stripe/files/backend/routes/stripe.ts +154 -154
  74. package/sails/stripe/files/backend/schema/stripe.ts +74 -74
  75. package/sails/stripe/files/backend/services/stripe.ts +224 -224
  76. package/sails/stripe/files/frontend/components/SubscriptionStatus.tsx +135 -135
  77. package/sails/stripe/files/frontend/hooks/useSubscription.ts +86 -86
  78. package/sails/stripe/files/frontend/pages/Checkout.tsx +116 -116
  79. package/sails/stripe/files/frontend/pages/Pricing.tsx +226 -226
  80. package/sails/stripe/install.ts +378 -378
@@ -1,116 +1,116 @@
1
- import { useEffect } from "react";
2
- import { Link, useSearchParams } from "react-router-dom";
3
-
4
- interface CheckoutPageProps {
5
- status: "success" | "cancel";
6
- }
7
-
8
- /**
9
- * Post-checkout page shown after Stripe redirects back to the app.
10
- *
11
- * Rendered for both success and cancellation outcomes.
12
- */
13
- export function CheckoutPage({ status }: CheckoutPageProps) {
14
- const [searchParams] = useSearchParams();
15
- const sessionId = searchParams.get("session_id");
16
-
17
- useEffect(() => {
18
- if (status === "success" && sessionId) {
19
- // Optionally verify the session on the server or trigger analytics
20
- console.log("Checkout completed:", sessionId);
21
- }
22
- }, [status, sessionId]);
23
-
24
- if (status === "success") {
25
- return (
26
- <div className="flex min-h-[60vh] items-center justify-center px-4">
27
- <div className="max-w-md text-center">
28
- <div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30">
29
- <svg
30
- className="h-8 w-8 text-green-600 dark:text-green-400"
31
- fill="none"
32
- viewBox="0 0 24 24"
33
- stroke="currentColor"
34
- strokeWidth={2}
35
- >
36
- <path
37
- strokeLinecap="round"
38
- strokeLinejoin="round"
39
- d="M5 13l4 4L19 7"
40
- />
41
- </svg>
42
- </div>
43
-
44
- <h1 className="text-2xl font-bold text-gray-900 dark:text-white">
45
- Payment successful!
46
- </h1>
47
- <p className="mt-3 text-gray-500 dark:text-gray-400">
48
- Thank you for subscribing. Your account has been upgraded and all
49
- premium features are now available.
50
- </p>
51
-
52
- <div className="mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center">
53
- <Link
54
- to="/dashboard"
55
- className="inline-flex items-center justify-center rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-semibold text-white hover:bg-blue-700"
56
- >
57
- Go to Dashboard
58
- </Link>
59
- <Link
60
- to="/settings"
61
- className="inline-flex items-center justify-center rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-semibold text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800"
62
- >
63
- Manage Subscription
64
- </Link>
65
- </div>
66
- </div>
67
- </div>
68
- );
69
- }
70
-
71
- // Cancellation
72
- return (
73
- <div className="flex min-h-[60vh] items-center justify-center px-4">
74
- <div className="max-w-md text-center">
75
- <div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-yellow-100 dark:bg-yellow-900/30">
76
- <svg
77
- className="h-8 w-8 text-yellow-600 dark:text-yellow-400"
78
- fill="none"
79
- viewBox="0 0 24 24"
80
- stroke="currentColor"
81
- strokeWidth={2}
82
- >
83
- <path
84
- strokeLinecap="round"
85
- strokeLinejoin="round"
86
- d="M6 18L18 6M6 6l12 12"
87
- />
88
- </svg>
89
- </div>
90
-
91
- <h1 className="text-2xl font-bold text-gray-900 dark:text-white">
92
- Checkout cancelled
93
- </h1>
94
- <p className="mt-3 text-gray-500 dark:text-gray-400">
95
- No worries! Your account has not been charged. You can subscribe
96
- anytime from the pricing page.
97
- </p>
98
-
99
- <div className="mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center">
100
- <Link
101
- to="/pricing"
102
- className="inline-flex items-center justify-center rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-semibold text-white hover:bg-blue-700"
103
- >
104
- Back to Pricing
105
- </Link>
106
- <Link
107
- to="/dashboard"
108
- className="inline-flex items-center justify-center rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-semibold text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800"
109
- >
110
- Go to Dashboard
111
- </Link>
112
- </div>
113
- </div>
114
- </div>
115
- );
116
- }
1
+ import { useEffect } from "react";
2
+ import { Link, useSearchParams } from "react-router-dom";
3
+
4
+ interface CheckoutPageProps {
5
+ status: "success" | "cancel";
6
+ }
7
+
8
+ /**
9
+ * Post-checkout page shown after Stripe redirects back to the app.
10
+ *
11
+ * Rendered for both success and cancellation outcomes.
12
+ */
13
+ export function CheckoutPage({ status }: CheckoutPageProps) {
14
+ const [searchParams] = useSearchParams();
15
+ const sessionId = searchParams.get("session_id");
16
+
17
+ useEffect(() => {
18
+ if (status === "success" && sessionId) {
19
+ // Optionally verify the session on the server or trigger analytics
20
+ console.log("Checkout completed:", sessionId);
21
+ }
22
+ }, [status, sessionId]);
23
+
24
+ if (status === "success") {
25
+ return (
26
+ <div className="flex min-h-[60vh] items-center justify-center px-4">
27
+ <div className="max-w-md text-center">
28
+ <div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-green-100 dark:bg-green-900/30">
29
+ <svg
30
+ className="h-8 w-8 text-green-600 dark:text-green-400"
31
+ fill="none"
32
+ viewBox="0 0 24 24"
33
+ stroke="currentColor"
34
+ strokeWidth={2}
35
+ >
36
+ <path
37
+ strokeLinecap="round"
38
+ strokeLinejoin="round"
39
+ d="M5 13l4 4L19 7"
40
+ />
41
+ </svg>
42
+ </div>
43
+
44
+ <h1 className="text-2xl font-bold text-gray-900 dark:text-white">
45
+ Payment successful!
46
+ </h1>
47
+ <p className="mt-3 text-gray-500 dark:text-gray-400">
48
+ Thank you for subscribing. Your account has been upgraded and all
49
+ premium features are now available.
50
+ </p>
51
+
52
+ <div className="mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center">
53
+ <Link
54
+ to="/dashboard"
55
+ className="inline-flex items-center justify-center rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-semibold text-white hover:bg-blue-700"
56
+ >
57
+ Go to Dashboard
58
+ </Link>
59
+ <Link
60
+ to="/settings"
61
+ className="inline-flex items-center justify-center rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-semibold text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800"
62
+ >
63
+ Manage Subscription
64
+ </Link>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ );
69
+ }
70
+
71
+ // Cancellation
72
+ return (
73
+ <div className="flex min-h-[60vh] items-center justify-center px-4">
74
+ <div className="max-w-md text-center">
75
+ <div className="mx-auto mb-6 flex h-16 w-16 items-center justify-center rounded-full bg-yellow-100 dark:bg-yellow-900/30">
76
+ <svg
77
+ className="h-8 w-8 text-yellow-600 dark:text-yellow-400"
78
+ fill="none"
79
+ viewBox="0 0 24 24"
80
+ stroke="currentColor"
81
+ strokeWidth={2}
82
+ >
83
+ <path
84
+ strokeLinecap="round"
85
+ strokeLinejoin="round"
86
+ d="M6 18L18 6M6 6l12 12"
87
+ />
88
+ </svg>
89
+ </div>
90
+
91
+ <h1 className="text-2xl font-bold text-gray-900 dark:text-white">
92
+ Checkout cancelled
93
+ </h1>
94
+ <p className="mt-3 text-gray-500 dark:text-gray-400">
95
+ No worries! Your account has not been charged. You can subscribe
96
+ anytime from the pricing page.
97
+ </p>
98
+
99
+ <div className="mt-8 flex flex-col gap-3 sm:flex-row sm:justify-center">
100
+ <Link
101
+ to="/pricing"
102
+ className="inline-flex items-center justify-center rounded-lg bg-blue-600 px-5 py-2.5 text-sm font-semibold text-white hover:bg-blue-700"
103
+ >
104
+ Back to Pricing
105
+ </Link>
106
+ <Link
107
+ to="/dashboard"
108
+ className="inline-flex items-center justify-center rounded-lg border border-gray-300 px-5 py-2.5 text-sm font-semibold text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800"
109
+ >
110
+ Go to Dashboard
111
+ </Link>
112
+ </div>
113
+ </div>
114
+ </div>
115
+ );
116
+ }