diff --git a/apps/web/config/billing.config.ts b/apps/web/config/billing.config.ts index a43e45f91..e3954ccce 100644 --- a/apps/web/config/billing.config.ts +++ b/apps/web/config/billing.config.ts @@ -28,6 +28,22 @@ export default createBillingSchema({ cost: 9.99, type: 'base', }, + { + id: 'price_1NNwYHI1i3VnbZTqI2UzaHIe6', + name: 'Per Seat', + description: 'Add-on plan', + cost: 1.99, + type: 'per-seat', + }, + { + id: 'price_1NNwYHI1i3VnbZTqI2UzaHIe7', + name: 'Metered', + description: 'Metered plan', + cost: 0.99, + type: 'metered', + unit: 'GB', + included: 10, + }, ], }, { diff --git a/packages/billing-gateway/src/components/plan-picker.tsx b/packages/billing-gateway/src/components/plan-picker.tsx index 8d1b4a250..29a57d298 100644 --- a/packages/billing-gateway/src/components/plan-picker.tsx +++ b/packages/billing-gateway/src/components/plan-picker.tsx @@ -302,7 +302,78 @@ export function PlanPicker(

-
+
+ Details + +
+ {selectedPlan?.lineItems.map((item) => { + switch (item.type) { + case 'base': + return ( +
+ {item.name} + + {formatCurrency( + selectedProduct?.currency.toLowerCase(), + item.cost, + )} + +
+ ); + + case 'per-seat': + return ( +
+ Per team member + + {formatCurrency( + selectedProduct?.currency.toLowerCase(), + item.cost, + )} + +
+ ); + + case 'metered': + return ( +
+ + Per {item.unit} + {item.included + ? ` (${item.included} included)` + : ''} + + + {formatCurrency( + selectedProduct?.currency.toLowerCase(), + item.cost, + )} + +
+ ); + } + })} +
+
+ +
+ Features + {selectedProduct?.features.map((item) => { return (
- -
diff --git a/packages/billing/src/create-billing-schema.ts b/packages/billing/src/create-billing-schema.ts index 1ac902466..748f0facf 100644 --- a/packages/billing/src/create-billing-schema.ts +++ b/packages/billing/src/create-billing-schema.ts @@ -40,10 +40,6 @@ export const PlanSchema = z message: 'Plans must have at least one line item', path: ['lineItems'], }) - .refine((data) => data.lineItems.some((item) => item.type === 'base'), { - message: 'Plans must include a base line item', - path: ['lineItems'], - }) .refine( (data) => data.paymentType !== 'one-time' || data.interval === undefined, {