From f3133560965576f36cbff34c6985a81334f7b070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl-Gerhard=20Lindesva=CC=88rd?= Date: Sun, 23 Mar 2025 22:13:10 +0100 Subject: [PATCH] fix(funnel): fallback to 0 if nan for funnel --- packages/common/src/math.ts | 5 +++++ packages/db/src/services/funnel.service.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/common/src/math.ts b/packages/common/src/math.ts index 56d3781b..096ff2c7 100644 --- a/packages/common/src/math.ts +++ b/packages/common/src/math.ts @@ -27,3 +27,8 @@ export const max = (arr: (number | null | undefined)[]): number => Math.max(...arr.filter(isNumber)); export const isFloat = (n: number) => n % 1 !== 0; + +export const ifNaN = ( + n: number | null | undefined, + defaultValue: T, +): T => (Number.isNaN(n) ? defaultValue : (n as T)); diff --git a/packages/db/src/services/funnel.service.ts b/packages/db/src/services/funnel.service.ts index 5067929b..101463f0 100644 --- a/packages/db/src/services/funnel.service.ts +++ b/packages/db/src/services/funnel.service.ts @@ -1,3 +1,4 @@ +import { ifNaN } from '@openpanel/common'; import type { IChartEvent, IChartInput } from '@openpanel/validation'; import { last, reverse } from 'ramda'; import { escape } from 'sqlstring'; @@ -222,9 +223,10 @@ export class FunnelService { }[], ) .map((step, index, list) => { - const next = list[index + 1]; return { ...step, + percent: ifNaN(step.percent, 0), + dropoffPercent: ifNaN(step.dropoffPercent, 0), isHighestDropoff: (() => { // Skip if current step has no dropoff if (!step?.dropoffCount) return false;