feat: integrate Stripe for self-hosted license purchasing and update pricing component

This commit is contained in:
Mauricio Siu
2025-03-20 01:19:39 -06:00
parent e433edd7b7
commit 3d622c7a53
7 changed files with 278 additions and 32 deletions

File diff suppressed because one or more lines are too long

View File

@@ -36,7 +36,7 @@ const NumberInput = React.forwardRef<HTMLInputElement, InputProps>(
return ( return (
<Input <Input
type="text" type="text"
className={cn("text-left", className)} className={cn("text-center", className)}
ref={ref} ref={ref}
{...props} {...props}
value={props.value === undefined ? undefined : String(props.value)} value={props.value === undefined ? undefined : String(props.value)}
@@ -45,7 +45,9 @@ const NumberInput = React.forwardRef<HTMLInputElement, InputProps>(
if (value === "") { if (value === "") {
props.onChange?.(e); props.onChange?.(e);
} else { } else {
const number = Number.parseInt(value, 10); // Remove currency symbol and convert to number
const numericValue = value.replace(/[^0-9.]/g, "");
const number = Number.parseFloat(numericValue);
if (!Number.isNaN(number)) { if (!Number.isNaN(number)) {
const syntheticEvent = { const syntheticEvent = {
...e, ...e,

View File

@@ -181,6 +181,7 @@
"selfHosted": { "selfHosted": {
"title": "Self-Hosted License", "title": "Self-Hosted License",
"description": "Deploy and manage Dokploy on your own infrastructure with enterprise-grade features and support", "description": "Deploy and manage Dokploy on your own infrastructure with enterprise-grade features and support",
"servers": "{serverQuantity} Servers",
"basic": { "basic": {
"title": "Basic License", "title": "Basic License",
"description": "Perfect for small teams and startups", "description": "Perfect for small teams and startups",

View File

@@ -176,6 +176,20 @@
"f7": "Nouvelles mises à jour" "f7": "Nouvelles mises à jour"
}, },
"go": "S'abonner" "go": "S'abonner"
},
"selfHosted": {
"title": "Licence Auto-hébergée",
"description": "Déployez et gérez Dokploy sur votre propre infrastructure avec des fonctionnalités et un support de niveau entreprise",
"servers": "{serverQuantity} Serveurs",
"features": {
"f1": "Complete Flexibility: Install Dokploy UI on your own infrastructure",
"f2": "Infrastructure Auto-Hébergée",
"f3": "Support de la communauté",
"f4": "Accès à toutes les fonctionnalités",
"f5": "Accès à toutes les mises à jour",
"f9": "Serveurs Illimitées"
},
"go": "Installation"
} }
}, },
"faq": { "faq": {

View File

@@ -122,6 +122,11 @@
}, },
"footer": { "footer": {
"copyright": "版权属于 © {year} Dokploy 保留所有权利" "copyright": "版权属于 © {year} Dokploy 保留所有权利"
},
"selfHosted": {
"title": "自托管许可证",
"description": "在您自己的基础设施上部署和管理 Dokploy享受企业级功能和支持",
"servers": "{serverQuantity} 台服务器"
} }
}, },
"404": { "404": {

View File

@@ -12,9 +12,9 @@
}, },
"browserslist": "defaults, not ie <= 11", "browserslist": "defaults, not ie <= 11",
"dependencies": { "dependencies": {
"hast-util-to-jsx-runtime": "2.3.5",
"@headlessui/react": "^2.2.0", "@headlessui/react": "^2.2.0",
"@headlessui/tailwindcss": "^0.2.0", "@headlessui/tailwindcss": "^0.2.0",
"@prettier/plugin-xml": "^3.4.1",
"@radix-ui/react-accordion": "^1.2.1", "@radix-ui/react-accordion": "^1.2.1",
"@radix-ui/react-avatar": "^1.1.1", "@radix-ui/react-avatar": "^1.1.1",
"@radix-ui/react-scroll-area": "^1.2.0", "@radix-ui/react-scroll-area": "^1.2.0",
@@ -23,6 +23,7 @@
"@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-switch": "^1.0.3",
"@radix-ui/react-tabs": "1.1.1", "@radix-ui/react-tabs": "1.1.1",
"@radix-ui/react-tooltip": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.3",
"@stripe/stripe-js": "^6.1.0",
"@tabler/icons-react": "3.21.0", "@tabler/icons-react": "3.21.0",
"@tryghost/content-api": "^1.11.21", "@tryghost/content-api": "^1.11.21",
"@types/node": "20.4.6", "@types/node": "20.4.6",
@@ -32,9 +33,11 @@
"class-variance-authority": "^0.7.0", "class-variance-authority": "^0.7.0",
"clsx": "^2.1.0", "clsx": "^2.1.0",
"framer-motion": "^11.3.19", "framer-motion": "^11.3.19",
"hast-util-to-jsx-runtime": "2.3.5",
"lucide-react": "0.364.0", "lucide-react": "0.364.0",
"next": "15.2.0", "next": "15.2.0",
"next-intl": "^3.26.5", "next-intl": "^3.26.5",
"prettier": "^3.3.3",
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"react-ga4": "^2.1.0", "react-ga4": "^2.1.0",
@@ -52,9 +55,7 @@
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"turndown": "^7.2.0", "turndown": "^7.2.0",
"turndown-plugin-gfm": "^1.0.2", "turndown-plugin-gfm": "^1.0.2",
"typescript": "5.1.6", "typescript": "5.1.6"
"prettier": "^3.3.3",
"@prettier/plugin-xml": "^3.4.1"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.26.9", "@babel/core": "^7.26.9",

9
pnpm-lock.yaml generated
View File

@@ -124,6 +124,9 @@ importers:
'@radix-ui/react-tooltip': '@radix-ui/react-tooltip':
specifier: ^1.1.3 specifier: ^1.1.3
version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) version: 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@stripe/stripe-js':
specifier: ^6.1.0
version: 6.1.0
'@tabler/icons-react': '@tabler/icons-react':
specifier: 3.21.0 specifier: 3.21.0
version: 3.21.0(react@18.2.0) version: 3.21.0(react@18.2.0)
@@ -1649,6 +1652,10 @@ packages:
engines: {node: '>= 8.0.0'} engines: {node: '>= 8.0.0'}
hasBin: true hasBin: true
'@stripe/stripe-js@6.1.0':
resolution: {integrity: sha512-/5zxRol+MU4I7fjZXPxP2M6E1nuHOxAzoc0tOEC/TLnC31Gzc+5EE93mIjoAnu28O1Sqpl7/BkceDHwnGmn75A==}
engines: {node: '>=12.16'}
'@swc/counter@0.1.3': '@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@@ -5388,6 +5395,8 @@ snapshots:
fflate: 0.7.4 fflate: 0.7.4
string.prototype.codepointat: 0.2.1 string.prototype.codepointat: 0.2.1
'@stripe/stripe-js@6.1.0': {}
'@swc/counter@0.1.3': {} '@swc/counter@0.1.3': {}
'@swc/helpers@0.5.13': '@swc/helpers@0.5.13':