{"version":3,"file":"home.19a51d71.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/charts-lib.ts","webpack://@finviz/website/./js/app/home/market_sentiment.tsx","webpack://@finviz/website/./js/app/shared/documentVisibility.ts","webpack://@finviz/website/./js/app/home/refresh.ts","webpack://@finviz/website/./js/app/home/indices-data.ts","webpack://@finviz/website/./js/app/home/index.tsx","webpack://@finviz/website/./js/app/maps/types.ts","webpack://@finviz/website/./js/app/shared/chartLayoutConfig.ts","webpack://@finviz/website/./js/app/shared/parseJSONFromScript.ts","webpack://@finviz/website/./js/app/shared/ready.ts","webpack://@finviz/website/../node_modules/flux/index.js","webpack://@finviz/website/../node_modules/flux/lib/Dispatcher.js","webpack://@finviz/website/../node_modules/flux/lib/invariant.js","webpack://@finviz/website/../node_modules/keymirror/index.js"],"sourcesContent":["import React from 'react'\r\nimport { type To } from 'react-router-dom'\r\n\r\nimport { DateRangeBaseOption } from '../main/components/timeframe-bar/daterange-select'\r\nimport { TimeframeBaseOption } from '../main/components/timeframe-bar/timeframe-select'\r\nimport { TIMEFRAME } from '../main/constants'\r\nimport { SpecificChartFunctionality } from './shared/chartLayoutConfig'\r\n\r\nexport enum SettingsTab {\r\n Chart = 'chart',\r\n Colors = 'colors',\r\n}\r\n\r\nexport type ChartLayoutProps = {\r\n config: object\r\n onRegisterChartLayoutModel?: (chartLayout: any) => void\r\n shouldResize?: boolean\r\n parentElement?: HTMLElement\r\n}\r\n\r\nexport type ChartLayoutHeaderProps = {\r\n model: any\r\n onSettingsOpen: () => void\r\n hasPublish: boolean\r\n}\r\n\r\ninterface ChartsLib {\r\n FREE_DATE_RANGES: string[]\r\n ChartLayout: React.FC\r\n ChartLayoutHeader: React.FC\r\n ChartLayoutWithGlobalState: React.FC\r\n\r\n ChartSettings: React.FC<{\r\n onClose: () => void\r\n onActiveSettingsTabChange?: (settingsComponent: SettingsTab) => void\r\n activeSettingsTab?: SettingsTab\r\n }>\r\n\r\n PreventClosingUnsavedChanges: React.FC<{\r\n onHide: () => void\r\n children: (props: { checkForUnsavedChangesAndClose: () => void }) => React.ReactElement\r\n }>\r\n\r\n useChartLayoutGlobalModel: () => {\r\n chartLayoutModel: any | null\r\n chartLayoutModelConfigSnapshot: Record | null\r\n lastGlobalRerender: number\r\n setChartLayoutModel: (chartLayoutModel: any) => void\r\n getChartLayoutModelConfig: (props: { fallback: Record }) => Record\r\n forceGlobalRerender: () => void\r\n generateNewLayoutModelConfigSnapshot: () => void\r\n }\r\n\r\n StockDetailTimeframeBar: React.FC<{\r\n className?: string\r\n isDateRangeAvailable: boolean\r\n isPremium: boolean\r\n isLoadingOverride?: boolean\r\n isScrollIntoViewEnabled?: boolean\r\n onTimeframeSelect?: (timeframe: TimeframeBaseOption) => void\r\n onDateRangeSelect?: (timeframe: DateRangeBaseOption) => void\r\n }>\r\n\r\n Quote: {\r\n create(quote: any): any\r\n select: (query: (quote: any) => boolean) => any\r\n deleteAll: () => void\r\n findByAttribute: (attribute: string, value: any) => any\r\n getAll: (tickersAndTimeframes: any) => any\r\n all: () => any[]\r\n }\r\n\r\n Settings: {\r\n MarketSentiment: any\r\n Indicator: any\r\n Chart: any\r\n Thumb: any\r\n Element: any\r\n Colors: string[]\r\n updateColors: (type: string, name: string, theme: 'light' | 'dark', value: string) => void\r\n }\r\n\r\n Utils: {\r\n dateFromUnixTimestamp: (date: string) => Date\r\n }\r\n\r\n convertTa: {\r\n getPanes: (taConfig: any) => any\r\n }\r\n\r\n getTimeFrameGroups: (isPremium?: boolean) => Array<{ label: string; timeframes: TimeframeBaseOption[] }>\r\n getDateRangeGroups: (isPremium?: boolean) => Array<{ label: string; dateRanges: DateRangeBaseOption[] }>\r\n\r\n useModelState: (\r\n model: Model | null,\r\n options: { watchProperties?: Array; listenOnEvents?: string[] }\r\n ) => Model | null\r\n\r\n useFavoriteTimeframes: (isPremium?: boolean) => {\r\n favoriteTimeframes: string[]\r\n toggleFavoriteTimeframe: (timeframe: TIMEFRAME) => void\r\n }\r\n\r\n generateTimeframeGroups: (\r\n isPremium: boolean,\r\n generatePath: (timeframe: TimeframeBaseOption) => To\r\n ) => Array<{ label: string; timeframes: TimeframeBaseOption[] }>\r\n\r\n generateDateRangeGroups: (\r\n isPremium: boolean,\r\n generatePath: (timeframe: DateRangeBaseOption) => To\r\n ) => Array<{ label: string; dateRanges: DateRangeBaseOption[] }>\r\n\r\n generatePathForTimeframeDateRange: (props: {\r\n isPremium: boolean\r\n pathname: string\r\n timeframe: TIMEFRAME\r\n dateRange: string | null | undefined\r\n specificChartFunctionality: SpecificChartFunctionality\r\n freeTimeframes?: string[]\r\n }) => To\r\n}\r\n\r\n// @ts-ignore\r\nconst chartsLib = (window.FLibs.Charts as ChartsLib) ?? {}\r\n\r\nexport const FREE_DATE_RANGES = chartsLib.FREE_DATE_RANGES\r\nexport const ChartLayout = chartsLib.ChartLayout\r\nexport const ChartLayoutWithGlobalState = chartsLib.ChartLayoutWithGlobalState\r\nexport const ChartLayoutHeader = chartsLib.ChartLayoutHeader\r\nexport const ChartSettings = chartsLib.ChartSettings\r\nexport const PreventClosingUnsavedChanges = chartsLib.PreventClosingUnsavedChanges\r\nexport const useChartLayoutGlobalModel = chartsLib.useChartLayoutGlobalModel\r\nexport const StockDetailTimeframeBar = chartsLib.StockDetailTimeframeBar\r\nexport const Quote = chartsLib.Quote\r\nexport const Settings = chartsLib.Settings\r\nexport const Utils = chartsLib.Utils\r\nexport const convertTa = chartsLib.convertTa\r\nexport const getTimeFrameGroups = chartsLib.getTimeFrameGroups\r\nexport const getDateRangeGroups = chartsLib.getDateRangeGroups\r\nexport const useModelState = chartsLib.useModelState\r\nexport const useFavoriteTimeframes = chartsLib.useFavoriteTimeframes\r\nexport const generateTimeframeGroups = chartsLib.generateTimeframeGroups\r\nexport const generateDateRangeGroups = chartsLib.generateDateRangeGroups\r\nexport const generatePathForTimeframeDateRange = chartsLib.generatePathForTimeframeDateRange\r\n","import { Component, MouseEvent } from 'react'\r\nimport ReactDOM from 'react-dom'\r\n\r\nimport { CancelablePromise, apiRequest } from '../../main/services/api'\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\n\r\nconst ticker = 'market_sentiment'\r\n\r\ninterface MarketSentimentProps {}\r\ninterface MarketSentimentState {\r\n loading: boolean\r\n enabled: boolean\r\n chartConfig: { layout: string } | null\r\n}\r\n\r\nconst MARKET_SENTIMENT_WIDTH_PX = 160\r\nconst MARKET_SENTIMENT_HEIGHT_PX = 40\r\nconst marketSentimentChartConfig = {\r\n layout: '1h1v',\r\n theme: document.documentElement.classList.contains('dark') ? 'dark' : 'light',\r\n width: MARKET_SENTIMENT_WIDTH_PX,\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n charts: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n timeframe: 'i3',\r\n scale: 'linear',\r\n ticker: ticker,\r\n instrument: 'market_sentiment',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height: MARKET_SENTIMENT_HEIGHT_PX,\r\n elements: [\r\n {\r\n type: 'charts/market_sentiment',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n}\r\n\r\nclass MarketSentiment extends Component {\r\n state: MarketSentimentState = {\r\n loading: true,\r\n enabled: false,\r\n chartConfig: null,\r\n }\r\n\r\n _timer: number | null = null\r\n _lastRequest: CancelablePromise | null = null\r\n\r\n componentDidMount() {\r\n this._fetchData('', () => {\r\n this.setState({ chartConfig: marketSentimentChartConfig })\r\n })\r\n }\r\n\r\n componentWillUnmount() {\r\n if (this._timer !== null) {\r\n this._lastRequest?.cancel?.()\r\n clearTimeout(this._timer)\r\n }\r\n }\r\n\r\n render() {\r\n const { loading, enabled, chartConfig } = this.state\r\n return (\r\n \r\n \r\n \r\n Click BULL for positive market sentiment
Click BEAR for negative market sentiment] offsetx=[-200] offsety=[20] delay=[100]\">\r\n {chartConfig && (\r\n
\r\n \r\n
\r\n )}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n\r\n _vote(e: MouseEvent, sentiment: string) {\r\n e.preventDefault()\r\n this.setState({ enabled: false })\r\n this._fetchData('?b=' + sentiment, undefined, false)\r\n }\r\n\r\n _fetchData = async (urlQuery = '', callback?: Function, setTimer = true) => {\r\n if (setTimer && this._timer !== null) clearTimeout(this._timer)\r\n\r\n if (document.hidden) {\r\n // console.log(`${+new Date()} Document is hidden, canceling refresh`)\r\n if (setTimer) this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), 1000)\r\n return\r\n }\r\n\r\n // console.log(`${+new Date()} Document is visible, refreshing`)\r\n\r\n this._lastRequest = apiRequest(`/api/market_sentiment.ashx${urlQuery}`)\r\n const json = await this._lastRequest\r\n if (json) {\r\n const quoteData = getData(json)\r\n const quote = Quote.findByAttribute('ticker', ticker)\r\n if (quote) {\r\n Quote.findByAttribute('ticker', ticker).updateAttributes(getData(json))\r\n } else {\r\n Quote.create(quoteData).save()\r\n }\r\n callback?.()\r\n\r\n this.setState({\r\n loading: false,\r\n enabled: json.enabled,\r\n })\r\n }\r\n\r\n if (setTimer) {\r\n this._timer = window.setTimeout(() => this._fetchData(urlQuery, callback), (json?.refresh ?? 30) * 1000)\r\n }\r\n }\r\n}\r\n\r\ninterface QuoteData {\r\n refresh: number\r\n enabled: boolean\r\n sum: number[]\r\n weight: number[]\r\n time: string\r\n visibleMinutes: number\r\n}\r\n\r\nfunction getData(data: QuoteData) {\r\n return {\r\n close: data.sum,\r\n volume: data.weight,\r\n date: Array.from('1'.repeat(data.sum.length)).map((x) => parseInt(x, 10)),\r\n ticker: ticker,\r\n timeframe: 'i3',\r\n instrument: 'market_sentiment',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: data.visibleMinutes,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nfunction mount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.render(, el)\r\n }\r\n}\r\n\r\nfunction unmount() {\r\n const el = document.getElementById('js-market-sentiment')\r\n if (el) {\r\n ReactDOM.unmountComponentAtNode(el)\r\n }\r\n}\r\n\r\nmount()\r\n\r\nexport { mount, unmount }\r\n","function getCurrentDateInMs() {\r\n return new Date().valueOf()\r\n}\r\n\r\nfunction getIsDocumentVisible() {\r\n return document.visibilityState === 'visible' || document.hidden === false\r\n}\r\n\r\n/**\r\n * Calls callback based on interval and document visibility. Returns unsubscribe function.\r\n * How it works:\r\n * - document is hidden: interval cleared\r\n * - document visible: interval set-up with remaining time from last interval. Call immediately if interval elapsed\r\n */\r\nexport function intervalCallbackOnWindowVisible(interval: number, callback: () => unknown) {\r\n let nextRefresh = getCurrentDateInMs() + interval\r\n let refreshTimeout: NodeJS.Timeout | null = null\r\n\r\n function refresh() {\r\n nextRefresh = getCurrentDateInMs() + interval\r\n // Queue next refresh\r\n refreshTimeout = setTimeout(refresh, interval)\r\n // Call callback asynchronously\r\n setTimeout(callback, 0)\r\n }\r\n\r\n /**\r\n * Handle the visibility change event, compute callback remaining time or call immediately\r\n */\r\n function handleVisibilityChange() {\r\n if (refreshTimeout) clearTimeout(refreshTimeout)\r\n\r\n if (getIsDocumentVisible()) {\r\n const currentDateMs = getCurrentDateInMs()\r\n // Refresh if the document is stale, otherwise set a timeout to refresh later\r\n if (nextRefresh <= currentDateMs) {\r\n refresh()\r\n } else {\r\n refreshTimeout = setTimeout(refresh, nextRefresh - currentDateMs)\r\n }\r\n }\r\n }\r\n\r\n if (getIsDocumentVisible()) {\r\n refreshTimeout = setTimeout(refresh, interval)\r\n }\r\n\r\n document.addEventListener('visibilitychange', handleVisibilityChange)\r\n\r\n return () => {\r\n document.removeEventListener('visibilitychange', handleVisibilityChange)\r\n }\r\n}\r\n","import { ContentType, apiRequest } from '../../main/services/api'\r\nimport mapActionCreators from '../maps/store/action-creators'\r\nimport { PerfData } from '../maps/types'\r\nimport { intervalCallbackOnWindowVisible } from '../shared/documentVisibility'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { Indices, updateIndices } from './indices-data'\r\n\r\ninterface RefreshInfo {\r\n userId: string\r\n version: number\r\n interval: number\r\n}\r\n\r\nconst refreshInfo = parseJSONFromScript('refresh-init')\r\n\r\nfunction refreshPage(result: string) {\r\n const newDocument = new DOMParser().parseFromString(result, 'text/html')\r\n const newRefreshInfo = parseJSONFromScript('refresh-init', newDocument)\r\n\r\n if (!refreshInfo || !newRefreshInfo || refreshInfo.userId !== newRefreshInfo.userId) return\r\n\r\n if (refreshInfo.version !== newRefreshInfo.version) {\r\n window.location.reload()\r\n }\r\n\r\n // Replace left signals table\r\n const oldSignalsLeft = document.getElementById('js-signals_1')\r\n const newSignalsLeft = newDocument.getElementById('js-signals_1')\r\n if (oldSignalsLeft && newSignalsLeft) {\r\n oldSignalsLeft.innerHTML = newSignalsLeft.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldSignalsRight = document.getElementById('js-signals_2')\r\n const newSignalsRight = newDocument.getElementById('js-signals_2')\r\n if (oldSignalsRight && newSignalsRight) {\r\n oldSignalsRight.innerHTML = newSignalsRight.innerHTML\r\n }\r\n\r\n // Replace right signals table\r\n const oldHomepageBottom = document.getElementById('js-homepage_bottom')\r\n const newHomepageBottom = newDocument.getElementById('js-homepage_bottom')\r\n if (oldHomepageBottom && newHomepageBottom) {\r\n oldHomepageBottom.innerHTML = newHomepageBottom.innerHTML\r\n }\r\n\r\n // Update indices\r\n try {\r\n const newIndicesData = parseJSONFromScript('js-indices', newDocument)\r\n if (newIndicesData) {\r\n updateIndices(newIndicesData)\r\n }\r\n } catch (error) {\r\n Sentry.withScope((scope: any) => {\r\n scope.setContext('Body', { size: result.length })\r\n Sentry.captureException(error)\r\n })\r\n }\r\n\r\n try {\r\n // Render maps\r\n const mapData = parseJSONFromScript<{ perfDataSec: PerfData; perfDataGeo: PerfData }>('map-data', newDocument)\r\n mapActionCreators.updatePerfData(window.FinvizIndexSecMap, mapData?.perfDataSec)\r\n mapActionCreators.updatePerfData(window.FinvizIndexGeoMap, mapData?.perfDataGeo)\r\n } catch {}\r\n\r\n /**\r\n * Re-render recent quotes. The script (recent_quotes.js) is only included for premium users\r\n * so we need to check if it's defined\r\n */\r\n if (typeof window['RenderRecentQuotes'] === 'function') {\r\n RenderRecentQuotes()\r\n }\r\n\r\n // Send refresh event to google analytics\r\n window.gtag?.('event', 'refresh', { event_category: 'page' })\r\n // Refresh any ads that might be on the page\r\n if (window.finvizBannersLoaded === true) {\r\n window.initFinvizBanners?.()\r\n } else if (typeof window.refreshAds === 'function') {\r\n window.refreshAds('#js-homepage_bottom [id*=IC_D_]')\r\n }\r\n}\r\n\r\nfunction initRefresh(interval: number) {\r\n intervalCallbackOnWindowVisible(interval, async function handleRefresh() {\r\n const data = await apiRequest(window.location.pathname, {\r\n headers: { 'Content-Type': ContentType.Html },\r\n })\r\n\r\n if (data) {\r\n refreshPage(data)\r\n }\r\n })\r\n}\r\n\r\nif (refreshInfo?.interval) {\r\n initRefresh(refreshInfo.interval * 1000)\r\n}\r\n","import { Quote } from '../charts-lib'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\ninterface Index {\r\n ticker: string\r\n timeframe: string\r\n volume: number[]\r\n date: number[]\r\n open: number[]\r\n high: number[]\r\n low: number[]\r\n close: number[]\r\n lastOpen: null\r\n lastHigh: null\r\n lastLow: null\r\n lastClose: number\r\n lastVolume: null\r\n lastDate: number\r\n prevClose: number\r\n afterClose: null\r\n afterChange: null\r\n relativeVolume: number\r\n}\r\n\r\nexport type Indices = Record\r\n\r\nexport function getData(index: string, ticker: string, indices: Indices) {\r\n return {\r\n ...indices[index],\r\n ticker: ticker, // use text?\r\n timeframe: 'i10',\r\n instrument: 'stock',\r\n premarket: false,\r\n aftermarket: false,\r\n afterChange: null,\r\n afterClose: null,\r\n drawMinutesPerDay: 390,\r\n marketStartMinutes: 570,\r\n premarketLengthMinutes: 0,\r\n aftermarketLengthMinutes: 0,\r\n }\r\n}\r\n\r\nexport function updateIndices(indices: Indices) {\r\n const dowQ = Quote.findByAttribute('ticker', 'DOW')\r\n if (dowQ) dowQ.updateAttributes(getData('^DJI', 'DOW', indices))\r\n\r\n const nasdaqQ = Quote.findByAttribute('ticker', 'NASDAQ')\r\n if (nasdaqQ) nasdaqQ.updateAttributes(getData('^IXIC', 'NASDAQ', indices))\r\n\r\n const sap500Q = Quote.findByAttribute('ticker', 'S&P 500')\r\n if (sap500Q) sap500Q.updateAttributes(getData('^GSPC', 'S&P 500', indices))\r\n\r\n if (!dowQ || !nasdaqQ || !sap500Q) {\r\n // Temporary code below\r\n // additional info gaining for https://finvizcom.sentry.io/issues/3963831382/?project=33153&referrer=issue-stream&statsPeriod=14d&stream_index=0\r\n window.Sentry?.captureMessage('indices-data.ts updateIndices', {\r\n extra: {\r\n allAvailableTickers: Quote.all()\r\n .reduce((acc: string[], cur: { ticker: string }) => {\r\n acc.push(cur.ticker)\r\n return acc\r\n }, [])\r\n .join(','),\r\n },\r\n })\r\n }\r\n}\r\n","import ReactDOM from 'react-dom'\r\n\r\nimport { ChartLayout, Quote } from '../charts-lib'\r\nimport { SpecificChartFunctionality, getCustomColorsFromCookies } from '../shared/chartLayoutConfig'\r\nimport { parseJSONFromScript } from '../shared/parseJSONFromScript'\r\nimport { ready } from '../shared/ready'\r\nimport { getData } from './indices-data'\r\nimport type { Indices } from './indices-data'\r\nimport './market_sentiment'\r\nimport './refresh'\r\n\r\nfunction getChartConfig(ticker: string) {\r\n return {\r\n layout: '1h1v',\r\n width: 320,\r\n height: 190,\r\n barWidth: 3,\r\n barMargin: 1,\r\n scrollable: false,\r\n editable: false,\r\n cross: false,\r\n colors: getCustomColorsFromCookies(),\r\n specificChartFunctionality: SpecificChartFunctionality.smallIndex,\r\n theme: document.documentElement.classList.contains('dark') ? 'dark' : 'light',\r\n charts: [\r\n {\r\n height: 190,\r\n timeframe: 'i10',\r\n scale: 'linear',\r\n ticker: ticker,\r\n // leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n // stretch: true,\r\n panes: [\r\n {\r\n height: 190,\r\n elements: [\r\n {\r\n type: 'charts/candle_stick',\r\n overlays: [],\r\n },\r\n ],\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nfunction renderChart({ ticker, element }: { ticker: string; element: HTMLElement | null }) {\r\n if (element) {\r\n ReactDOM.render(\r\n
\r\n \r\n
,\r\n element\r\n )\r\n }\r\n}\r\n\r\nready(function () {\r\n const indices = parseJSONFromScript('js-indices')!\r\n\r\n Quote.create(getData('^DJI', 'DOW', indices)).save()\r\n Quote.create(getData('^IXIC', 'NASDAQ', indices)).save()\r\n Quote.create(getData('^GSPC', 'S&P 500', indices)).save()\r\n\r\n renderChart({ ticker: 'DOW', element: document.getElementById('dow') })\r\n renderChart({ ticker: 'NASDAQ', element: document.getElementById('nasdaq') })\r\n renderChart({ ticker: 'S&P 500', element: document.getElementById('sp500') })\r\n})\r\n","import { ReactNode } from 'react'\r\n\r\nexport enum MapTypeId {\r\n Sector = 'sec',\r\n World = 'geo',\r\n SectorFull = 'sec_all',\r\n ETF = 'etf',\r\n Screener = 'screener',\r\n Portfolio = 'portfolio',\r\n}\r\n\r\nexport enum MapSubtypeId {\r\n DayPerf = 'd1',\r\n WeekPerf = 'w1',\r\n MonthPerf = 'w4',\r\n ThreeMonthPerf = 'w13',\r\n SixMonthPerf = 'w26',\r\n YearPerf = 'w52',\r\n YearToDatePerf = 'ytd',\r\n RelativeVolume = 'relvol',\r\n PriceToEarnings = 'pe',\r\n ForwardPriceToEearnings = 'fpe',\r\n PriceEarningsToGrowth = 'peg',\r\n PriceToSellsRatio = 'ps',\r\n PriceToBookRatio = 'pb',\r\n DividendYield = 'div',\r\n EPSGrowth5y = 'eps5y',\r\n FloatShort = 'short',\r\n AnalystRecommendation = 'rec',\r\n EarningsPerf = 'earnperf',\r\n EarningsDate = 'earndate',\r\n // Portfolio\r\n PortfolioGainPct = 'portfolioGainPct',\r\n PortfolioGainUsd = 'portfolioGainUsd',\r\n PortfolioChangePct = 'portfolioChangePct',\r\n PortfolioChangeUsd = 'portfolioChangeUsd',\r\n}\r\n\r\nexport enum ScaleId {\r\n DayPerf = 'default',\r\n WeekPerf = '_5',\r\n MonthPerf = '_10',\r\n ThreeMonthPerf = '_15',\r\n SixMonthPerf = '_20',\r\n YearPerf = '_25',\r\n RelativeVolume = '_relvol',\r\n PriceToEarnings = '_pe',\r\n ForwardPriceToEearnings = '_fpe',\r\n PriceEarningsToGrowth = '_peg',\r\n PriceToSellsRatio = '_ps',\r\n PriceToBookRatio = '_pb',\r\n DividendYield = '_div',\r\n EPSGrowth5y = '_eps5y',\r\n FloatShort = '_short',\r\n AnalystRecommendation = '_rec',\r\n EarningsDate = '_earndate',\r\n // Portfolio\r\n PortfolioPct = '_portfolioPct',\r\n PortfolioUsd = '_portfolioUsd',\r\n}\r\n\r\nexport const enum NodeDepth {\r\n Root,\r\n Sector,\r\n Industry,\r\n Node,\r\n}\r\n\r\nexport interface MapDataRow {\r\n name: string\r\n perf?: number\r\n x: number\r\n y: number\r\n dx: number\r\n dy: number\r\n data: any\r\n depth: NodeDepth\r\n}\r\n\r\nexport interface MapDataRoot {\r\n name: 'Root'\r\n children: MapDataSector[]\r\n duplicateTickers: number\r\n}\r\n\r\nexport interface MapDataSector extends MapDataRow {\r\n children: MapDataIndustry[]\r\n parent: MapDataRoot\r\n}\r\n\r\nexport interface MapDataIndustry extends MapDataRow {\r\n children: MapDataNode[]\r\n parent: MapDataSector\r\n}\r\n\r\nexport interface MapDataNode extends MapDataRow {\r\n parent: MapDataIndustry\r\n additional?: string\r\n description: string\r\n perfText: string\r\n value: number\r\n}\r\n\r\nexport interface MapData {\r\n sectors: MapDataSector[]\r\n industries: MapDataIndustry[]\r\n nodes: MapDataNode[]\r\n}\r\n\r\nexport type PerfData = {\r\n nodes: Record | Array\r\n additional: Record\r\n version?: number\r\n}\r\n\r\nexport interface MapSubtype {\r\n id: MapSubtypeId\r\n name: string\r\n scaleId: ScaleId\r\n tooltip: string\r\n countIndustryPerf: boolean\r\n countSectorPerf: boolean\r\n}\r\n\r\nexport interface MapType {\r\n name: string\r\n pageTitle: string\r\n nameShort?: string\r\n description: string\r\n type: MapTypeId\r\n subtypes: MapSubtype[]\r\n}\r\n\r\nexport interface Scale {\r\n name: string\r\n tooltip: ReactNode\r\n id: ScaleId\r\n}\r\n","import { getParsedCookies } from './cookie'\r\n\r\ninterface PaneElementProps {\r\n type: string\r\n label?: string\r\n fromDate?: string\r\n toDate?: string\r\n min?: number\r\n tickers: string[]\r\n overlays: string[]\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n chartPage = 'chartPage',\r\n smallIndex = 'smallIndex',\r\n offScreen = 'offScreen',\r\n forexPage = 'forexPage',\r\n futuresPage = 'futuresPage',\r\n cryptoPage = 'cryptoPage',\r\n}\r\n\r\ninterface StaticChartConfigProps {\r\n width?: number\r\n height?: number\r\n ticker: string\r\n timeframe: string\r\n paneElements: PaneElementProps[]\r\n specificChartFunctionality?: SpecificChartFunctionality\r\n colorsOverride?: Array\r\n theme?: 'dark' | 'light'\r\n colors?: ReturnType\r\n}\r\n\r\nexport function getStaticChartConfig({\r\n width = 800,\r\n height = 400,\r\n ticker,\r\n timeframe,\r\n paneElements,\r\n specificChartFunctionality = SpecificChartFunctionality.default,\r\n colorsOverride,\r\n theme,\r\n colors = getCustomColorsFromCookies(),\r\n}: StaticChartConfigProps) {\r\n return {\r\n layout: '1h1v',\r\n width,\r\n height,\r\n barWidth: 1,\r\n barMargin: 0,\r\n scrollable: false,\r\n editable: false,\r\n specificChartFunctionality,\r\n colorsOverride,\r\n theme,\r\n colors,\r\n charts: [\r\n {\r\n height,\r\n timeframe,\r\n scale: 'linear',\r\n ticker: ticker,\r\n leftOffset: 0,\r\n instrument: 'stock',\r\n refreshData: false,\r\n stretch: true,\r\n panes: [\r\n {\r\n height,\r\n elements: paneElements,\r\n },\r\n ],\r\n },\r\n ],\r\n }\r\n}\r\n\r\nexport function getCustomColorsFromCookies() {\r\n try {\r\n return JSON.parse(getParsedCookies('customColors') as string)\r\n } catch {\r\n return undefined\r\n }\r\n}\r\n","export function parseJSONFromScript(id: string, doc: Document = document): T | null {\r\n const el = doc.getElementById(id)\r\n const isValidElement = el && el.tagName === 'SCRIPT' && el.getAttribute('type') === 'application/json'\r\n\r\n if (!isValidElement) return null\r\n\r\n try {\r\n return JSON.parse(el.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return null\r\n }\r\n}\r\n","export function ready(fn: (ev?: Event) => any) {\r\n if (document.readyState !== 'loading') {\r\n fn()\r\n return\r\n }\r\n\r\n document.addEventListener('DOMContentLoaded', fn)\r\n}\r\n","/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n","/*\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n * 1) Callbacks are not subscribed to particular events. Every payload is\n * dispatched to every registered callback.\n * 2) Callbacks can be deferred in whole or part until other callbacks have\n * been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n * var flightDispatcher = new Dispatcher();\n *\n * // Keeps track of which country is selected\n * var CountryStore = {country: null};\n *\n * // Keeps track of which city is selected\n * var CityStore = {city: null};\n *\n * // Keeps track of the base flight price of the selected city\n * var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'city-update',\n * selectedCity: 'paris'\n * });\n *\n * This payload is digested by `CityStore`:\n *\n * flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'city-update') {\n * CityStore.city = payload.selectedCity;\n * }\n * });\n *\n * When the user selects a country, we dispatch the payload:\n *\n * flightDispatcher.dispatch({\n * actionType: 'country-update',\n * selectedCountry: 'australia'\n * });\n *\n * This payload is digested by both stores:\n *\n * CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * CountryStore.country = payload.selectedCountry;\n * }\n * });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n * CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n * if (payload.actionType === 'country-update') {\n * // `CountryStore.country` may not be updated.\n * flightDispatcher.waitFor([CountryStore.dispatchToken]);\n * // `CountryStore.country` is now guaranteed to be updated.\n *\n * // Select the default city for the new country\n * CityStore.city = getDefaultCityForCountry(CountryStore.country);\n * }\n * });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n * FlightPriceStore.dispatchToken =\n * flightDispatcher.register(function(payload) {\n * switch (payload.actionType) {\n * case 'country-update':\n * flightDispatcher.waitFor([CityStore.dispatchToken]);\n * FlightPriceStore.price =\n * getFlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n *\n * case 'city-update':\n * FlightPriceStore.price =\n * FlightPriceStore(CountryStore.country, CityStore.city);\n * break;\n * }\n * });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n function Dispatcher() {\n this.$Dispatcher_callbacks = {};\n this.$Dispatcher_isPending = {};\n this.$Dispatcher_isHandled = {};\n this.$Dispatcher_isDispatching = false;\n this.$Dispatcher_pendingPayload = null;\n }\n\n /**\n * Registers a callback to be invoked with every dispatched payload. Returns\n * a token that can be used with `waitFor()`.\n *\n * @param {function} callback\n * @return {string}\n */\n Dispatcher.prototype.register=function(callback) {\n var id = _prefix + _lastID++;\n this.$Dispatcher_callbacks[id] = callback;\n return id;\n };\n\n /**\n * Removes a callback based on its token.\n *\n * @param {string} id\n */\n Dispatcher.prototype.unregister=function(id) {\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n id\n );\n delete this.$Dispatcher_callbacks[id];\n };\n\n /**\n * Waits for the callbacks specified to be invoked before continuing execution\n * of the current callback. This method should only be used by a callback in\n * response to a dispatched payload.\n *\n * @param {array} ids\n */\n Dispatcher.prototype.waitFor=function(ids) {\n invariant(\n this.$Dispatcher_isDispatching,\n 'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n );\n for (var ii = 0; ii < ids.length; ii++) {\n var id = ids[ii];\n if (this.$Dispatcher_isPending[id]) {\n invariant(\n this.$Dispatcher_isHandled[id],\n 'Dispatcher.waitFor(...): Circular dependency detected while ' +\n 'waiting for `%s`.',\n id\n );\n continue;\n }\n invariant(\n this.$Dispatcher_callbacks[id],\n 'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n id\n );\n this.$Dispatcher_invokeCallback(id);\n }\n };\n\n /**\n * Dispatches a payload to all registered callbacks.\n *\n * @param {object} payload\n */\n Dispatcher.prototype.dispatch=function(payload) {\n invariant(\n !this.$Dispatcher_isDispatching,\n 'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n );\n this.$Dispatcher_startDispatching(payload);\n try {\n for (var id in this.$Dispatcher_callbacks) {\n if (this.$Dispatcher_isPending[id]) {\n continue;\n }\n this.$Dispatcher_invokeCallback(id);\n }\n } finally {\n this.$Dispatcher_stopDispatching();\n }\n };\n\n /**\n * Is this Dispatcher currently dispatching.\n *\n * @return {boolean}\n */\n Dispatcher.prototype.isDispatching=function() {\n return this.$Dispatcher_isDispatching;\n };\n\n /**\n * Call the callback stored with the given id. Also do some internal\n * bookkeeping.\n *\n * @param {string} id\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_invokeCallback=function(id) {\n this.$Dispatcher_isPending[id] = true;\n this.$Dispatcher_callbacks[id](this.$Dispatcher_pendingPayload);\n this.$Dispatcher_isHandled[id] = true;\n };\n\n /**\n * Set up bookkeeping needed when dispatching.\n *\n * @param {object} payload\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_startDispatching=function(payload) {\n for (var id in this.$Dispatcher_callbacks) {\n this.$Dispatcher_isPending[id] = false;\n this.$Dispatcher_isHandled[id] = false;\n }\n this.$Dispatcher_pendingPayload = payload;\n this.$Dispatcher_isDispatching = true;\n };\n\n /**\n * Clear bookkeeping used for dispatching.\n *\n * @internal\n */\n Dispatcher.prototype.$Dispatcher_stopDispatching=function() {\n this.$Dispatcher_pendingPayload = null;\n this.$Dispatcher_isDispatching = false;\n };\n\n\nmodule.exports = Dispatcher;\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (false) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n 'Invariant Violation: ' +\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright 2013-2014 Facebook, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n\"use strict\";\n\n/**\n * Constructs an enumeration with keys equal to their value.\n *\n * For example:\n *\n * var COLORS = keyMirror({blue: null, red: null});\n * var myColor = COLORS.blue;\n * var isColorValid = !!COLORS[myColor];\n *\n * The last line could not be performed if the values of the generated enum were\n * not equal to their keys.\n *\n * Input: {key1: val1, key2: val2}\n * Output: {key1: key1, key2: key2}\n *\n * @param {object} obj\n * @return {object}\n */\nvar keyMirror = function(obj) {\n var ret = {};\n var key;\n if (!(obj instanceof Object && !Array.isArray(obj))) {\n throw new Error('keyMirror(...): Argument must be an object.');\n }\n for (key in obj) {\n if (!obj.hasOwnProperty(key)) {\n continue;\n }\n ret[key] = key;\n }\n return ret;\n};\n\nmodule.exports = keyMirror;\n"],"names":["SettingsTab","chartsLib","_ref","window","FLibs","Charts","FREE_DATE_RANGES","ChartLayout","ChartLayoutWithGlobalState","ChartLayoutHeader","ChartSettings","PreventClosingUnsavedChanges","useChartLayoutGlobalModel","StockDetailTimeframeBar","Quote","Utils","Settings","convertTa","useModelState","getTimeFrameGroups","getDateRangeGroups","useFavoriteTimeframes","generateTimeframeGroups","generatePathForTimeframeDateRange","generateDateRangeGroups","ticker","marketSentimentChartConfig","layout","theme","document","documentElement","classList","contains","width","height","scrollable","editable","cross","charts","timeframe","scale","instrument","refreshData","stretch","panes","elements","type","overlays","MarketSentiment","Component","constructor","_this","arguments","this","_defineProperty","loading","enabled","chartConfig","async","urlQuery","length","undefined","callback","setTimer","_timer","clearTimeout","hidden","setTimeout","_fetchData","_lastRequest","apiRequest","concat","json","quoteData","getData","updateAttributes","save","setState","_json$refresh","refresh","componentDidMount","componentWillUnmount","_this$_lastRequest","_this$_lastRequest$ca","cancel","call","render","state","_jsx","cellPadding","cellSpacing","border","style","visibility","children","_jsxs","id","config","valign","disabled","onClick","e","_vote","src","alt","display","sentiment","preventDefault","data","close","sum","volume","weight","date","Array","from","repeat","map","x","parseInt","premarket","aftermarket","afterChange","afterClose","drawMinutesPerDay","visibleMinutes","marketStartMinutes","premarketLengthMinutes","aftermarketLengthMinutes","el","getElementById","ReactDOM","mount","getCurrentDateInMs","Date","valueOf","getIsDocumentVisible","visibilityState","refreshInfo","parseJSONFromScript","refreshPage","result","_window$gtag","_window","newDocument","DOMParser","parseFromString","newRefreshInfo","userId","version","location","reload","oldSignalsLeft","newSignalsLeft","innerHTML","oldSignalsRight","newSignalsRight","oldHomepageBottom","newHomepageBottom","newIndicesData","indices","dowQ","nasdaqQ","sap500Q","_window$Sentry","Sentry","captureMessage","extra","allAvailableTickers","reduce","acc","cur","push","join","updateIndices","error","withScope","scope","setContext","size","captureException","mapData","mapActionCreators","FinvizIndexSecMap","perfDataSec","FinvizIndexGeoMap","perfDataGeo","_window$initFinvizBan","_window2","RenderRecentQuotes","gtag","event_category","finvizBannersLoaded","initFinvizBanners","refreshAds","index","getChartConfig","barWidth","barMargin","colors","getCustomColorsFromCookies","specificChartFunctionality","SpecificChartFunctionality","renderChart","element","className","interval","nextRefresh","refreshTimeout","handleVisibilityChange","currentDateMs","addEventListener","intervalCallbackOnWindowVisible","pathname","headers","ContentType","ready","MapTypeId","MapSubtypeId","ScaleId","NodeDepth","getStaticChartConfig","paneElements","default","colorsOverride","leftOffset","JSON","parse","getParsedCookies","doc","isValidElement","tagName","getAttribute","textContent","fn","readyState","module","exports","Dispatcher","invariant","_lastID","$Dispatcher_callbacks","$Dispatcher_isPending","$Dispatcher_isHandled","$Dispatcher_isDispatching","$Dispatcher_pendingPayload","prototype","register","unregister","waitFor","ids","ii","$Dispatcher_invokeCallback","dispatch","payload","$Dispatcher_startDispatching","$Dispatcher_stopDispatching","isDispatching","condition","format","a","b","c","d","f","Error","args","argIndex","replace","framesToPop","obj","key","ret","Object","isArray","hasOwnProperty"],"sourceRoot":""}