From e619d743a4264d88527c364ebebb1a8cd50a71cc Mon Sep 17 00:00:00 2001 From: John Yeo Date: Sat, 7 Jun 2025 09:06:42 +0100 Subject: [PATCH] fix: ui rewards bug & version default product --- .../api/products/handleVersionProduct.ts | 10 ++++++++ vite/src/utils/product/priceUtils.ts | 23 ++++++++----------- .../views/products/rewards/RewardConfig.tsx | 15 ++++++++---- .../views/products/rewards/RewardsTable.tsx | 2 -- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/server/src/internal/api/products/handleVersionProduct.ts b/server/src/internal/api/products/handleVersionProduct.ts index 99237e043..87774b02e 100644 --- a/server/src/internal/api/products/handleVersionProduct.ts +++ b/server/src/internal/api/products/handleVersionProduct.ts @@ -62,6 +62,16 @@ export const handleVersionProductV2 = async ({ env, }); + if (latestProduct.is_default) { + await ProductService.updateByInternalId({ + db, + internalId: latestProduct.internal_id, + update: { + is_default: false, + }, + }); + } + await ProductService.insert({ db, product: newProduct }); await handleNewProductItems({ diff --git a/vite/src/utils/product/priceUtils.ts b/vite/src/utils/product/priceUtils.ts index d2d76fe51..26c3bec5e 100644 --- a/vite/src/utils/product/priceUtils.ts +++ b/vite/src/utils/product/priceUtils.ts @@ -5,6 +5,7 @@ import { EntitlementWithFeature, PriceType, ProductItem, + ProductItemInterval, } from "@autumn/shared"; import { FixedPriceConfig, Price, UsagePriceConfig } from "@autumn/shared"; @@ -13,7 +14,7 @@ import { isFeatureItem } from "./getItemType"; export const validBillingInterval = ( prices: Price[], - config: FixedPriceConfig | UsagePriceConfig + config: FixedPriceConfig | UsagePriceConfig, ) => { const interval1 = config.interval; if (!interval1 || interval1 == BillingInterval.OneOff) { @@ -37,7 +38,7 @@ export const validBillingInterval = ( export const getBillingUnits = ( config: UsagePriceConfig, - entitlements: EntitlementWithFeature[] + entitlements: EntitlementWithFeature[], ) => { if (!entitlements) return "(error)"; @@ -46,11 +47,11 @@ export const getBillingUnits = ( config.bill_when == BillWhen.StartOfPeriod || config.bill_when == BillWhen.InAdvance ) { - return `${config.billing_units} ` || "n"; + return `${config.billing_units} `; } const entitlement = entitlements?.find( - (e) => e.internal_feature_id == config?.internal_feature_id + (e) => e.internal_feature_id == config?.internal_feature_id, ); if (!entitlement) return "n"; @@ -89,9 +90,9 @@ export const getDefaultPriceConfig = (type: PriceType) => { export const pricesOnlyOneOff = ( items: ProductItem[], - isAddOn: boolean = false + isAddOn: boolean = false, ) => { - let prices = items.filter((item) => !isFeatureItem(item)); + const prices = items.filter((item) => !isFeatureItem(item)); if (prices.length == 0 && isAddOn) return true; if (prices.length == 0) return false; @@ -99,14 +100,8 @@ export const pricesOnlyOneOff = ( return prices.every((price) => { return intervalIsNone(price.interval); }); - // if (items.length == 0) return false; - // return items.every((item) => { - // return item.interval == ProductItemInterval.None; - // }); }; -export const isFreeProduct = (prices: Price[]) => { - return prices.every((price) => { - return price.config?.interval == BillingInterval.OneOff; - }); +export const isFreeProduct = (items: ProductItem[]) => { + return items.every((item) => isFeatureItem(item)); }; diff --git a/vite/src/views/products/rewards/RewardConfig.tsx b/vite/src/views/products/rewards/RewardConfig.tsx index 6ec6bd1e2..0c9d1de8f 100644 --- a/vite/src/views/products/rewards/RewardConfig.tsx +++ b/vite/src/views/products/rewards/RewardConfig.tsx @@ -5,7 +5,13 @@ import { useEffect, useState } from "react"; import { Select, SelectContent, SelectItem } from "@/components/ui/select"; import { SelectTrigger, SelectValue } from "@/components/ui/select"; import { keyToTitle, slugify } from "@/utils/formatUtils/formatTextUtils"; -import { Reward, RewardType, Product, FullProduct } from "@autumn/shared"; +import { + Reward, + RewardType, + Product, + FullProduct, + ProductV2, +} from "@autumn/shared"; import { useProductsContext } from "../ProductsContext"; import { DiscountConfig } from "./DiscountConfig"; import { notNullish } from "@/utils/genUtils"; @@ -20,6 +26,7 @@ export const RewardConfig = ({ setReward: (reward: Reward) => void; }) => { const { products } = useProductsContext(); + const [idChanged, setIdChanged] = useState(false); useEffect(() => { @@ -110,10 +117,8 @@ export const RewardConfig = ({ > {(() => { const freeAddOns = products - .filter((product: FullProduct) => product.is_add_on) - .filter((product: FullProduct) => - isFreeProduct(product.prices), - ); + .filter((product: ProductV2) => product.is_add_on) + .filter((product: ProductV2) => isFreeProduct(product.items)); const empty = freeAddOns.length === 0; return ( diff --git a/vite/src/views/products/rewards/RewardsTable.tsx b/vite/src/views/products/rewards/RewardsTable.tsx index ee06a9c72..da44e66a3 100644 --- a/vite/src/views/products/rewards/RewardsTable.tsx +++ b/vite/src/views/products/rewards/RewardsTable.tsx @@ -13,8 +13,6 @@ export const RewardsTable = () => { const [selectedReward, setSelectedReward] = useState(null); const [open, setOpen] = useState(false); - console.log("products: ", products); - return ( <>