diff --git a/src/lib/components/Feedback.svelte b/src/lib/components/Feedback.svelte index 04a70c31..b931d574 100644 --- a/src/lib/components/Feedback.svelte +++ b/src/lib/components/Feedback.svelte @@ -163,7 +163,8 @@
{/if} diff --git a/src/lib/components/Sidecard.svelte b/src/lib/components/Sidecard.svelte index c16ed504..85dbf09b 100644 --- a/src/lib/components/Sidecard.svelte +++ b/src/lib/components/Sidecard.svelte @@ -58,23 +58,23 @@ website = info?.website; snippet = description?.slice(0, 450) + "..."; - numOfAnalyst = data?.getAnalystRating?.numOfAnalyst; - buyCount = ((data?.getAnalystRating?.Buy / numOfAnalyst) * 100)?.toFixed( + numOfAnalyst = data?.getAnalystSummary?.numOfAnalyst; + buyCount = ((data?.getAnalystSummary?.Buy / numOfAnalyst) * 100)?.toFixed( 2, ); holdCount = ( - (data?.getAnalystRating?.Hold / numOfAnalyst) * + (data?.getAnalystSummary?.Hold / numOfAnalyst) * 100 )?.toFixed(2); sellCount = ( - (data?.getAnalystRating?.Sell / numOfAnalyst) * + (data?.getAnalystSummary?.Sell / numOfAnalyst) * 100 )?.toFixed(2); priceTarget = - data?.getAnalystRating?.medianPriceTarget !== ("n/a" && 0) - ? data?.getAnalystRating?.medianPriceTarget + data?.getAnalystSummary?.medianPriceTarget !== ("n/a" && 0) + ? data?.getAnalystSummary?.medianPriceTarget : "n/a"; - consensusRating = data?.getAnalystRating?.consensusRating; + consensusRating = data?.getAnalystSummary?.consensusRating; try { changesPercentage = @@ -165,9 +165,9 @@ -{#if Object?.keys(data?.getAnalystRating ?? {})?.length !== 0} +{#if Object?.keys(data?.getAnalystSummary ?? {})?.length !== 0}
{/if} { try { const [ getStockDeck, - getAnalystRating, + getAnalystSummary, getStockQuote, getPrePostQuote, getWhyPriceMoved, @@ -118,7 +118,7 @@ export const load = async ({ params, locals }) => { return { getStockDeck, - getAnalystRating, + getAnalystSummary, getStockQuote, getPrePostQuote, getWhyPriceMoved, diff --git a/src/routes/stocks/[tickerID]/+layout.svelte b/src/routes/stocks/[tickerID]/+layout.svelte index e3753613..762976e6 100644 --- a/src/routes/stocks/[tickerID]/+layout.svelte +++ b/src/routes/stocks/[tickerID]/+layout.svelte @@ -941,7 +941,7 @@ >Metrics - {#if Object?.keys(data?.getAnalystRating ?? {})?.length > 0} + {#if Object?.keys(data?.getAnalystSummary ?? {})?.length > 0} changeSection("forecast")} diff --git a/src/routes/stocks/[tickerID]/+page.svelte b/src/routes/stocks/[tickerID]/+page.svelte index a9aa4a4f..8308f52a 100644 --- a/src/routes/stocks/[tickerID]/+page.svelte +++ b/src/routes/stocks/[tickerID]/+page.svelte @@ -1031,11 +1031,11 @@ >Analyst {data?.getAnalystRating?.consensusRating !== null && - data?.getAnalystRating?.consensusRating !== "n/a" && - data?.getAnalystRating?.consensusRating !== undefined - ? data?.getAnalystRating?.consensusRating + >{data?.getAnalystSummary?.consensusRating !== null && + data?.getAnalystSummary?.consensusRating !== "n/a" && + data?.getAnalystSummary?.consensusRating !== undefined + ? data?.getAnalystSummary?.consensusRating : "n/a"} diff --git a/src/routes/stocks/[tickerID]/financials/+page.svelte b/src/routes/stocks/[tickerID]/financials/+page.svelte index f9363e79..a6e1e5a7 100644 --- a/src/routes/stocks/[tickerID]/financials/+page.svelte +++ b/src/routes/stocks/[tickerID]/financials/+page.svelte @@ -491,7 +491,7 @@ > {/if} - - {/if} - - {/if} {/if} { return output; }; + + const getTopAnalystSummary = async () => { + const response = await fetch(apiURL + "/top-analyst-summary-rating", { + method: "POST", + headers: { + "Content-Type": "application/json", + "X-API-KEY": apiKey, + }, + body: JSON.stringify(postData), + }); + + const output = await response.json(); + return output; + }; + // Make sure to return a promise return { getAnalystEstimate: await getAnalystEstimate(), getAnalystInsight: await getAnalystInsight(), getAnalystTickerHistory: await getAnalystTickerHistory(), + getTopAnalystSummary: await getTopAnalystSummary(), }; }; diff --git a/src/routes/stocks/[tickerID]/forecast/+page.server.ts b/src/routes/stocks/[tickerID]/forecast/+page.server.ts index a57e90ee..a18487b9 100644 --- a/src/routes/stocks/[tickerID]/forecast/+page.server.ts +++ b/src/routes/stocks/[tickerID]/forecast/+page.server.ts @@ -2,6 +2,10 @@ import { error, fail, redirect } from "@sveltejs/kit"; import { validateData } from "$lib/utils"; import { loginUserSchema, registerUserSchema } from "$lib/schemas"; + + + + export const actions = { login: async ({ url, request, locals }) => { diff --git a/src/routes/stocks/[tickerID]/forecast/+page.svelte b/src/routes/stocks/[tickerID]/forecast/+page.svelte index d2deaf9c..5be1f577 100644 --- a/src/routes/stocks/[tickerID]/forecast/+page.svelte +++ b/src/routes/stocks/[tickerID]/forecast/+page.svelte @@ -16,6 +16,8 @@ import { LineChart, BarChart, GaugeChart } from "echarts/charts"; import { GridComponent, TooltipComponent } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; + import { goto } from "$app/navigation"; + import SEO from "$lib/components/SEO.svelte"; export let data; @@ -37,21 +39,75 @@ const calculatePriceChange = (targetPrice) => targetPrice && price ? ((targetPrice / price - 1) * 100)?.toFixed(2) : 0; - const numOfAnalyst = data?.getAnalystRating?.numOfAnalyst || 0; - const avgPriceTarget = data?.getAnalystRating?.avgPriceTarget || 0; - const medianPriceTarget = data?.getAnalystRating?.medianPriceTarget || 0; - const lowPriceTarget = data?.getAnalystRating?.lowPriceTarget || 0; - const highPriceTarget = data?.getAnalystRating?.highPriceTarget || 0; - const consensusRating = data?.getAnalystRating?.consensusRating; - const lowChange = calculatePriceChange(lowPriceTarget); - const medianChange = calculatePriceChange(medianPriceTarget); - const avgChange = calculatePriceChange(avgPriceTarget); - const highChange = calculatePriceChange(highPriceTarget); - const rawAnalystList = data?.getAnalystRating?.recommendationList || []; - const recommendationList = + let numOfAnalyst = data?.getAnalystSummary?.numOfAnalyst || 0; + let avgPriceTarget = data?.getAnalystSummary?.avgPriceTarget || 0; + let medianPriceTarget = data?.getAnalystSummary?.medianPriceTarget || 0; + let lowPriceTarget = data?.getAnalystSummary?.lowPriceTarget || 0; + let highPriceTarget = data?.getAnalystSummary?.highPriceTarget || 0; + let consensusRating = data?.getAnalystSummary?.consensusRating; + + let lowChange = calculatePriceChange(lowPriceTarget); + let medianChange = calculatePriceChange(medianPriceTarget); + let avgChange = calculatePriceChange(avgPriceTarget); + let highChange = calculatePriceChange(highPriceTarget); + let rawAnalystList = data?.getAnalystSummary?.recommendationList || []; + let recommendationList = rawAnalystList?.length > 5 ? rawAnalystList?.slice(-6) : rawAnalystList; - const categories = ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"]; + let categories = ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"]; + + const tabs = [ + { + title: "All Analysts", + }, + { + title: "Top Analysts", + }, + ]; + let activeIdx = 0; + + function changeTab(index) { + activeIdx = index; + if (activeIdx === 0) { + numOfAnalyst = data?.getAnalystSummary?.numOfAnalyst || 0; + avgPriceTarget = data?.getAnalystSummary?.avgPriceTarget || 0; + medianPriceTarget = data?.getAnalystSummary?.medianPriceTarget || 0; + lowPriceTarget = data?.getAnalystSummary?.lowPriceTarget || 0; + highPriceTarget = data?.getAnalystSummary?.highPriceTarget || 0; + consensusRating = data?.getAnalystSummary?.consensusRating; + + lowChange = calculatePriceChange(lowPriceTarget); + medianChange = calculatePriceChange(medianPriceTarget); + avgChange = calculatePriceChange(avgPriceTarget); + highChange = calculatePriceChange(highPriceTarget); + rawAnalystList = data?.getAnalystSummary?.recommendationList || []; + recommendationList = + rawAnalystList?.length > 5 ? rawAnalystList?.slice(-6) : rawAnalystList; + categories = ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"]; + } else { + numOfAnalyst = data?.getTopAnalystSummary?.numOfAnalyst || 0; + avgPriceTarget = data?.getTopAnalystSummary?.avgPriceTarget || 0; + medianPriceTarget = data?.getTopAnalystSummary?.medianPriceTarget || 0; + lowPriceTarget = data?.getTopAnalystSummary?.lowPriceTarget || 0; + highPriceTarget = data?.getTopAnalystSummary?.highPriceTarget || 0; + consensusRating = data?.getTopAnalystSummary?.consensusRating; + + lowChange = calculatePriceChange(lowPriceTarget); + medianChange = calculatePriceChange(medianPriceTarget); + avgChange = calculatePriceChange(avgPriceTarget); + highChange = calculatePriceChange(highPriceTarget); + rawAnalystList = data?.getTopAnalystSummary?.recommendationList || []; + recommendationList = + rawAnalystList?.length > 5 ? rawAnalystList?.slice(-6) : rawAnalystList; + categories = ["Strong Buy", "Buy", "Hold", "Sell", "Strong Sell"]; + + console.log(recommendationList); + } + + optionsData = getPlotOptions() || null; + optionsPieChart = getPieChart() || null; + optionsPriceForecast = getPriceForecastChart() || null; + } function findIndex(data) { let year = new Date().getFullYear() - 1; @@ -78,8 +134,8 @@ return -1; // Return -1 if no matching index is found } - function getTotalForDate(index) { - return categories.reduce( + function getTotalForDate(index, recommendationList) { + return categories?.reduce( (sum, cat) => sum + recommendationList[index][cat], 0, ); @@ -291,7 +347,7 @@ } function getPriceForecastChart() { - const historicalData = data?.getAnalystRating?.pastPriceList || []; + const historicalData = data?.getAnalystSummary?.pastPriceList || []; const forecastTargets = { low: lowPriceTarget, avg: avgPriceTarget, @@ -472,28 +528,52 @@ {removeCompanyStrings($displayCompanyName)} Forecast -
- - +
+ {#each tabs as item, i} + {#if data?.user?.tier !== "Pro" && i > 0} + + {:else} + + {/if} + {/each} +
@@ -714,7 +794,7 @@ - {getTotalForDate(i)} + {getTotalForDate(i, recommendationList)} {/each} diff --git a/src/routes/stocks/[tickerID]/forecast/ai/+page.svelte b/src/routes/stocks/[tickerID]/forecast/ai/+page.svelte index 4ed21579..8e6e2d9e 100644 --- a/src/routes/stocks/[tickerID]/forecast/ai/+page.svelte +++ b/src/routes/stocks/[tickerID]/forecast/ai/+page.svelte @@ -134,7 +134,7 @@ } function getPriceForecastChart() { - const historicalData = data?.getAnalystRating?.pastPriceList || []; + const historicalData = data?.getAnalystSummary?.pastPriceList || []; const forecastTargets = { low: lowPriceTarget, avg: avgPriceTarget, diff --git a/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte b/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte index a127a256..8654b16c 100644 --- a/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte +++ b/src/routes/stocks/[tickerID]/forecast/analyst/+page.svelte @@ -13,7 +13,7 @@ import SEO from "$lib/components/SEO.svelte"; export let data; - let analystRating = data?.getAnalystRating ?? {}; + let analystRating = data?.getAnalystSummary ?? {}; let rawData = data?.getAnalystTickerHistory ?? []; let historyList = []; @@ -126,8 +126,8 @@ }; const totalRatingScore = recentData - .map((item) => ratingScores[item.rating_current] || 0) - .reduce((sum, score) => sum + score, 0); + ?.map((item) => ratingScores[item.rating_current] || 0) + ?.reduce((sum, score) => sum + score, 0); const averageRatingScore = filteredAnalystCount ? totalRatingScore / filteredAnalystCount @@ -262,7 +262,7 @@ > {/if} {/if} {/if}