@codaijs/keel 0.2.3 → 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.
- package/dist/__tests__/sail-installer.test.js +25 -25
- package/dist/sail-installer.js +174 -174
- package/dist/scaffold.js +68 -68
- package/package.json +58 -58
- package/sails/_template/addon.json +20 -20
- package/sails/_template/install.ts +402 -402
- package/sails/admin-dashboard/README.md +117 -117
- package/sails/admin-dashboard/addon.json +28 -28
- package/sails/admin-dashboard/files/backend/middleware/admin.ts +34 -34
- package/sails/admin-dashboard/files/backend/routes/admin.ts +243 -243
- package/sails/admin-dashboard/files/frontend/components/admin/StatsCard.tsx +40 -40
- package/sails/admin-dashboard/files/frontend/components/admin/UsersTable.tsx +240 -240
- package/sails/admin-dashboard/files/frontend/hooks/useAdmin.ts +149 -149
- package/sails/admin-dashboard/files/frontend/pages/admin/Dashboard.tsx +173 -173
- package/sails/admin-dashboard/files/frontend/pages/admin/UserDetail.tsx +203 -203
- package/sails/admin-dashboard/install.ts +305 -305
- package/sails/analytics/README.md +178 -178
- package/sails/analytics/addon.json +27 -27
- package/sails/analytics/files/frontend/components/AnalyticsProvider.tsx +58 -58
- package/sails/analytics/files/frontend/hooks/useAnalytics.ts +64 -64
- package/sails/analytics/files/frontend/lib/analytics.ts +103 -103
- package/sails/analytics/install.ts +297 -297
- package/sails/file-uploads/addon.json +30 -30
- package/sails/file-uploads/files/backend/routes/files.ts +198 -198
- package/sails/file-uploads/files/backend/schema/files.ts +36 -36
- package/sails/file-uploads/files/backend/services/file-storage.ts +128 -128
- package/sails/file-uploads/files/frontend/components/FileList.tsx +248 -248
- package/sails/file-uploads/files/frontend/components/FileUploadButton.tsx +147 -147
- package/sails/file-uploads/files/frontend/hooks/useFileUpload.ts +106 -106
- package/sails/file-uploads/files/frontend/hooks/useFiles.ts +118 -118
- package/sails/file-uploads/files/frontend/pages/Files.tsx +37 -37
- package/sails/file-uploads/install.ts +466 -466
- package/sails/gdpr/README.md +174 -174
- package/sails/gdpr/addon.json +27 -27
- package/sails/gdpr/files/backend/routes/gdpr.ts +140 -140
- package/sails/gdpr/files/backend/services/gdpr.ts +293 -293
- package/sails/gdpr/files/frontend/components/auth/ConsentCheckboxes.tsx +97 -97
- package/sails/gdpr/files/frontend/components/gdpr/AccountDeletionRequest.tsx +192 -192
- package/sails/gdpr/files/frontend/components/gdpr/DataExportButton.tsx +75 -75
- package/sails/gdpr/files/frontend/pages/PrivacyPolicy.tsx +186 -186
- package/sails/gdpr/install.ts +756 -756
- package/sails/google-oauth/README.md +121 -121
- package/sails/google-oauth/addon.json +22 -22
- package/sails/google-oauth/files/GoogleButton.tsx +50 -50
- package/sails/google-oauth/install.ts +252 -252
- package/sails/i18n/README.md +193 -193
- package/sails/i18n/addon.json +30 -30
- package/sails/i18n/files/frontend/components/LanguageSwitcher.tsx +108 -108
- package/sails/i18n/files/frontend/hooks/useLanguage.ts +31 -31
- package/sails/i18n/files/frontend/lib/i18n.ts +32 -32
- package/sails/i18n/files/frontend/locales/de/common.json +44 -44
- package/sails/i18n/files/frontend/locales/en/common.json +44 -44
- package/sails/i18n/install.ts +407 -407
- package/sails/push-notifications/README.md +163 -163
- package/sails/push-notifications/addon.json +31 -31
- package/sails/push-notifications/files/backend/routes/notifications.ts +153 -153
- package/sails/push-notifications/files/backend/schema/notifications.ts +31 -31
- package/sails/push-notifications/files/backend/services/notifications.ts +117 -117
- package/sails/push-notifications/files/frontend/components/PushNotificationInit.tsx +12 -12
- package/sails/push-notifications/files/frontend/hooks/usePushNotifications.ts +154 -154
- package/sails/push-notifications/install.ts +384 -384
- package/sails/r2-storage/addon.json +29 -29
- package/sails/r2-storage/files/backend/services/storage.ts +71 -71
- package/sails/r2-storage/files/frontend/components/ProfilePictureUpload.tsx +167 -167
- package/sails/r2-storage/install.ts +412 -412
- package/sails/rate-limiting/addon.json +20 -20
- package/sails/rate-limiting/files/backend/middleware/rate-limit-store.ts +104 -104
- package/sails/rate-limiting/files/backend/middleware/rate-limit.ts +137 -137
- package/sails/rate-limiting/install.ts +300 -300
- package/sails/registry.json +107 -107
- package/sails/stripe/README.md +214 -214
- package/sails/stripe/addon.json +24 -24
- package/sails/stripe/files/backend/routes/stripe.ts +154 -154
- package/sails/stripe/files/backend/schema/stripe.ts +74 -74
- package/sails/stripe/files/backend/services/stripe.ts +224 -224
- package/sails/stripe/files/frontend/components/SubscriptionStatus.tsx +135 -135
- package/sails/stripe/files/frontend/hooks/useSubscription.ts +86 -86
- package/sails/stripe/files/frontend/pages/Checkout.tsx +116 -116
- package/sails/stripe/files/frontend/pages/Pricing.tsx +226 -226
- 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
|
+
}
|