-
{
- const value = e.target.value.trim();
-
- if (value === "") {
- setItem({ ...item, included_usage: null });
- } else {
- const numValue = value;
- if (!Number.isNaN(numValue)) {
- setItem({ ...item, included_usage: Number(numValue) });
+ {isAiCreditSystem(feature?.type) ? (
+
+ $
+
+ value={getInputValue()}
+ onChange={(e) => {
+ const value = e.target.value.trim();
+
+ if (value === "") {
+ setItem({ ...item, included_usage: null });
+ } else {
+ const numValue = Number(value);
+ if (!Number.isNaN(numValue)) {
+ setItem({ ...item, included_usage: numValue });
+ }
+ }
+ }}
+ disabled={includedUsage === Infinite}
+ type="number"
+ />
+
+ ) : (
+
{
+ const value = e.target.value.trim();
+
+ if (value === "") {
+ setItem({ ...item, included_usage: null });
+ } else {
+ const numValue = Number(value);
+ if (!Number.isNaN(numValue)) {
+ setItem({ ...item, included_usage: numValue });
+ }
+ }
+ }}
+ disabled={includedUsage === Infinite}
+ type="number"
+ />
+ )}
}
diff --git a/vite/src/views/products/plan/components/new-feature/NewFeatureBehaviour.tsx b/vite/src/views/products/plan/components/new-feature/NewFeatureBehaviour.tsx
index a3cba3ac6..64292d89e 100644
--- a/vite/src/views/products/plan/components/new-feature/NewFeatureBehaviour.tsx
+++ b/vite/src/views/products/plan/components/new-feature/NewFeatureBehaviour.tsx
@@ -2,11 +2,56 @@ import {
type CreateFeature,
FeatureType,
FeatureUsageType,
+ isAiCreditSystem,
+ isAnyCreditSystem,
} from "@autumn/shared";
import { AreaRadioGroupItem } from "@/components/v2/radio-groups/AreaRadioGroupItem";
import { RadioGroup } from "@/components/v2/radio-groups/RadioGroup";
import { SheetSection } from "@/components/v2/sheets/InlineSheet";
import { CreditSystemSchema } from "@/views/products/features/credit-systems/components/CreditSystemSchema";
+import { useCreditSystemForm } from "@/views/products/features/credit-systems/hooks/useCreditSystemForm";
+
+function NewFeatureCreditSchema({
+ feature,
+ setFeature,
+}: {
+ feature: CreateFeature;
+ setFeature: (feature: CreateFeature) => void;
+}) {
+ const form = useCreditSystemForm({
+ feature: {
+ internal_id: "",
+ org_id: "",
+ created_at: 0,
+ env: "sandbox" as any,
+ id: feature.id ?? "",
+ name: feature.name ?? "",
+ type: feature.type,
+ config: feature.config ?? {},
+ archived: false,
+ event_names: feature.event_names ?? [],
+ model_markups: feature.model_markups ?? null,
+ },
+ onChange: (values) => {
+ const isAi = isAiCreditSystem(values.type);
+
+ setFeature({
+ ...feature,
+ type: values.type,
+ config: isAi
+ ? {
+ ...values.config,
+ default_markup: values.defaultMarkup,
+ provider_markups: values.provider_markups,
+ }
+ : values.config,
+ model_markups: values.model_markups,
+ });
+ },
+ });
+
+ return
;
+}
export function NewFeatureBehaviour({
feature,
@@ -15,10 +60,8 @@ export function NewFeatureBehaviour({
feature: CreateFeature;
setFeature: (feature: CreateFeature) => void;
}) {
- if (feature.type === FeatureType.CreditSystem) {
- return (
-
- );
+ if (isAnyCreditSystem(feature.type)) {
+ return
;
}
if (feature.type === FeatureType.Metered) {
diff --git a/vite/src/views/products/plan/components/new-feature/NewFeatureType.tsx b/vite/src/views/products/plan/components/new-feature/NewFeatureType.tsx
index 3e06d28c3..f046fe991 100644
--- a/vite/src/views/products/plan/components/new-feature/NewFeatureType.tsx
+++ b/vite/src/views/products/plan/components/new-feature/NewFeatureType.tsx
@@ -2,6 +2,7 @@ import {
FeatureType as APIFeatureType,
type CreateFeature,
FeatureUsageType,
+ isAnyCreditSystem,
} from "@autumn/shared";
import { BarcodeIcon, CoinsIcon } from "@phosphor-icons/react";
import { PanelButton } from "@/components/v2/buttons/PanelButton";
@@ -57,7 +58,7 @@ export function NewFeatureType({
{
setFeature({
...feature,
diff --git a/vite/src/views/products/plan/components/plan-card/DummyPlanFeatureRow.tsx b/vite/src/views/products/plan/components/plan-card/DummyPlanFeatureRow.tsx
index 13a045e96..78e184def 100644
--- a/vite/src/views/products/plan/components/plan-card/DummyPlanFeatureRow.tsx
+++ b/vite/src/views/products/plan/components/plan-card/DummyPlanFeatureRow.tsx
@@ -1,4 +1,4 @@
-import { FeatureType, FeatureUsageType } from "@autumn/shared";
+import { FeatureType, FeatureUsageType, isAiCreditSystem } from "@autumn/shared";
import { BoxArrowDownIcon } from "@phosphor-icons/react";
import { useFeatureStore } from "@/hooks/stores/useFeatureStore";
import { cn } from "@/lib/utils";
@@ -48,6 +48,10 @@ export const DummyPlanFeatureRow = () => {
const getDisplayText = () => {
const name = hasName ? featureName : getPlaceholderName();
+ if (isAiCreditSystem(feature.type)) {
+ return { primary: `$10.00 of ${name}`, secondary: "" };
+ }
+
if (featureType === FeatureType.CreditSystem) {
return { primary: `100 ${name}`, secondary: "" };
}
diff --git a/vite/src/views/products/plan/components/plan-card/PlanFeatureRow.tsx b/vite/src/views/products/plan/components/plan-card/PlanFeatureRow.tsx
index f718e1ea7..a61e44c65 100644
--- a/vite/src/views/products/plan/components/plan-card/PlanFeatureRow.tsx
+++ b/vite/src/views/products/plan/components/plan-card/PlanFeatureRow.tsx
@@ -1,6 +1,6 @@
/** biome-ignore-all lint/a11y/noStaticElementInteractions: needed */
/** biome-ignore-all lint/a11y/useSemanticElements: needed */
-import type { ProductItem } from "@autumn/shared";
+import { type ProductItem, isAiCreditSystem } from "@autumn/shared";
import { getProductItemDisplay } from "@autumn/shared";
import { TrashIcon } from "@phosphor-icons/react";
import { useEffect, useRef, useState } from "react";
@@ -68,6 +68,7 @@ export const PlanFeatureRow = ({
const feature = features.find((f) => f.id === item.feature_id);
const hasFeatureName = feature?.name && feature.name.trim() !== "";
+
const displayText = hasFeatureName
? display.primary_text
: "Name your feature";
@@ -206,7 +207,9 @@ export const PlanFeatureRow = ({
{displayText}
- {display.secondary_text}
+ {!isAiCreditSystem(feature?.type) && display.secondary_text && (
+ {display.secondary_text}
+ )}