diff --git a/packages/request-handler/src/stock-price.ts b/packages/request-handler/src/stock-price.ts index 420d26a6e..0df74abfb 100644 --- a/packages/request-handler/src/stock-price.ts +++ b/packages/request-handler/src/stock-price.ts @@ -24,12 +24,16 @@ export const fetchStockPriceHandler = createCachedWidgetRequestHandler({ if (!firstResult) { throw new Error("Received invalid data"); } + + const priceHistory = + firstResult.indicators.quote[0]?.close.filter( + // Filter out null values from price arrays (Yahoo Finance returns null for missing data points) + (value) => value !== null && value !== undefined, + ) ?? []; + return { - priceHistory: - firstResult.indicators.quote[0]?.close.filter( - // Filter out null values from price arrays (Yahoo Finance returns null for missing data points) - (value) => value !== null && value !== undefined, - ) ?? [], + priceHistory, + previousClose: firstResult.meta.previousClose ?? priceHistory[0] ?? 1, symbol: firstResult.meta.symbol, shortName: firstResult.meta.shortName, }; @@ -58,6 +62,7 @@ const dataSchema = z meta: z.object({ symbol: z.string(), shortName: z.string(), + previousClose: z.number().optional(), }), }), ), diff --git a/packages/widgets/src/stocks/component.tsx b/packages/widgets/src/stocks/component.tsx index 777cfa0b3..8cfc58b07 100644 --- a/packages/widgets/src/stocks/component.tsx +++ b/packages/widgets/src/stocks/component.tsx @@ -13,12 +13,12 @@ function round(value: number) { return Math.round(value * 100) / 100; } -function calculateChange(valueA: number, valueB: number) { - return valueA - valueB; +function calculateChange(currentPrice: number, previousClose: number) { + return currentPrice - previousClose; } -function calculateChangePercentage(valueA: number, valueB: number) { - return 100 * ((valueA - valueB) / valueA); +function calculateChangePercentage(currentPrice: number, previousClose: number) { + return 100 * ((currentPrice - previousClose) / previousClose); } export default function StockPriceWidget({ options, width, height }: WidgetComponentProps<"stockPrice">) { @@ -26,9 +26,9 @@ export default function StockPriceWidget({ options, width, height }: WidgetCompo const theme = useMantineTheme(); const [{ data }] = clientApi.widget.stockPrice.getPriceHistory.useSuspenseQuery(options); - const stockValuesChange = round(calculateChange(data.priceHistory.at(-1) ?? 0, data.priceHistory[0] ?? 0)); + const stockValuesChange = round(calculateChange(data.priceHistory.at(-1) ?? 0, data.previousClose)); const stockValuesChangePercentage = round( - calculateChangePercentage(data.priceHistory.at(-1) ?? 0, data.priceHistory[0] ?? 0), + calculateChangePercentage(data.priceHistory.at(-1) ?? 0, data.previousClose), ); const stockValuesMin = Math.min(...data.priceHistory);