From 8374da14bd0d7b855d4b1e8ead56d823221fd59d Mon Sep 17 00:00:00 2001 From: amianthus <49116958+SirTenzin@users.noreply.github.com> Date: Tue, 21 Apr 2026 11:46:19 +0100 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20frontend=20bugs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/internal/products/productV2Utils.ts | 1 + .../compareProductUtils.ts | 35 +++++++++++++++++++ shared/utils/productV2Utils/mapToProductV2.ts | 1 + vite/src/hooks/stores/useProductStore.ts | 3 +- .../plan/components/EditPlanSheet.tsx | 13 ++++++- 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/server/src/internal/products/productV2Utils.ts b/server/src/internal/products/productV2Utils.ts index b55276768..9854f25e1 100644 --- a/server/src/internal/products/productV2Utils.ts +++ b/server/src/internal/products/productV2Utils.ts @@ -97,6 +97,7 @@ export const mapToProductV2 = ({ items: items, stripe_id: product.processor?.id || null, archived: product.archived || false, + config: product.config ?? undefined, }; return productV2; diff --git a/shared/utils/productV2Utils/compareProductUtils/compareProductUtils.ts b/shared/utils/productV2Utils/compareProductUtils/compareProductUtils.ts index de823507a..f81d1b6e2 100644 --- a/shared/utils/productV2Utils/compareProductUtils/compareProductUtils.ts +++ b/shared/utils/productV2Utils/compareProductUtils/compareProductUtils.ts @@ -94,6 +94,34 @@ export const compareDetails = ({ return detailsSame; }; +export const compareConfig = ({ + newConfig, + curConfig, +}: { + newConfig?: ProductV2["config"]; + curConfig?: ProductV2["config"]; +}) => { + const checks = { + ignore_past_due: { + condition: newConfig?.ignore_past_due === curConfig?.ignore_past_due, + message: `Ignore past due different: ${newConfig?.ignore_past_due} !== ${curConfig?.ignore_past_due}`, + }, + }; + + const detailsSame = Object.values(checks).every((d) => d.condition); + + // if (!detailsSame) { + // console.log( + // "Product details different:", + // Object.values(checks) + // .filter((d) => !d.condition) + // .map((d) => d.message), + // ); + // } + + return detailsSame; +}; + export const prodOptionsAreSame = ({ curProduct, newProduct, @@ -150,6 +178,7 @@ export const productsAreSame = ({ let itemsSame = true; let pricesChanged = false; let detailsSame = true; + let configSame = true; const newItems: ProductItem[] = []; const removedItems: ProductItem[] = []; @@ -158,6 +187,11 @@ export const productsAreSame = ({ curProductV2, }); + configSame = compareConfig({ + newConfig: newProductV2?.config, + curConfig: curProductV2?.config, + }); + if (items1.length !== items2.length) { itemsSame = false; } @@ -250,5 +284,6 @@ export const productsAreSame = ({ removedItems, detailsSame, optionsSame, + configSame, }; }; diff --git a/shared/utils/productV2Utils/mapToProductV2.ts b/shared/utils/productV2Utils/mapToProductV2.ts index cf245b87f..11923ed82 100644 --- a/shared/utils/productV2Utils/mapToProductV2.ts +++ b/shared/utils/productV2Utils/mapToProductV2.ts @@ -93,6 +93,7 @@ export const mapToProductV2 = ({ items: items, stripe_id: product.processor?.id || null, archived: product.archived || false, + config: product.config ?? undefined, }; return productV2; diff --git a/vite/src/hooks/stores/useProductStore.ts b/vite/src/hooks/stores/useProductStore.ts index 6f32e8864..3fcd2b694 100644 --- a/vite/src/hooks/stores/useProductStore.ts +++ b/vite/src/hooks/stores/useProductStore.ts @@ -81,7 +81,8 @@ export const useHasChanges = () => { return ( !comparison.itemsSame || !comparison.detailsSame || - !comparison.freeTrialsSame + !comparison.freeTrialsSame || + !comparison.configSame ); }, [product, baseProduct, features]); }; diff --git a/vite/src/views/products/plan/components/EditPlanSheet.tsx b/vite/src/views/products/plan/components/EditPlanSheet.tsx index 4f227d93a..dc756e972 100644 --- a/vite/src/views/products/plan/components/EditPlanSheet.tsx +++ b/vite/src/views/products/plan/components/EditPlanSheet.tsx @@ -43,7 +43,7 @@ export function EditPlanSheet({ isOnboarding }: { isOnboarding?: boolean }) { {!showAdvanced && ( -
+
)} + + setProduct({ + ...product, + config: { ...product.config, ignore_past_due: checked }, + }) + } + />