{"version":3,"file":"options.bddee371.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/shared/tracking.ts","webpack://@finviz/website/./js/main/components/ChipSwitch.tsx","webpack://@finviz/website/./js/main/components/SubMenu/SubMenuTabs.tsx","webpack://@finviz/website/./js/main/hooks/use-sticky-shadow.ts","webpack://@finviz/website/./js/main/hooks/use-track-pageview.ts","webpack://@finviz/website/./js/main/modules/options/components/StickyShadow.tsx","webpack://@finviz/website/./js/main/modules/options/constants/columns.tsx","webpack://@finviz/website/./js/main/modules/options/constants/common.ts","webpack://@finviz/website/./js/main/modules/quote/components/QuoteOptionsTabMenu.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsViewSwitcher.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsQuery.ts","webpack://@finviz/website/./js/main/modules/options/components/PriceRow.tsx","webpack://@finviz/website/./js/main/modules/options/components/TableColumn.tsx","webpack://@finviz/website/./js/main/modules/options/components/ChainTable.tsx","webpack://@finviz/website/./js/main/modules/options/utils/options.ts","webpack://@finviz/website/./js/main/modules/options/components/FilterSelect.tsx","webpack://@finviz/website/./js/main/modules/options/components/DateFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/StrikeFilter.tsx","webpack://@finviz/website/./js/main/modules/options/components/ViewFooter.tsx","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortChange.ts","webpack://@finviz/website/./js/main/modules/options/hooks/useOptionsSortOrder.ts","webpack://@finviz/website/./js/main/modules/options/routes/ChainRoute.tsx","webpack://@finviz/website/./js/main/modules/options/components/OptionsTable.tsx","webpack://@finviz/website/./js/main/modules/options/routes/ListRoute.tsx","webpack://@finviz/website/./js/main/modules/options/routes/PlotRoute.tsx","webpack://@finviz/website/./js/main/modules/options/index.tsx","webpack://@finviz/website/./js/main/modules/options/types.tsx","webpack://@finviz/website/./js/main/modules/options/utils/query.ts","webpack://@finviz/website/./js/main/components/SubMenu/SubMenu.tsx","webpack://@finviz/website/./js/main/modules/quote/components/QuoteStickySubMenu.tsx","webpack://@finviz/website/../charts/app/constants/common.ts","webpack://@finviz/website/../charts/app/utils.ts","webpack://@finviz/website/../charts/app/utils/helpers.ts","webpack://@finviz/website/../node_modules/core-js/modules/es.array.find-last-index.js"],"sourcesContent":["export enum AdsProvider {\r\n None,\r\n InvestingChannel,\r\n Freestar,\r\n}\r\n\r\nexport function getAdsProvider() {\r\n if (FinvizSettings.hasUserPremium) return AdsProvider.None\r\n\r\n if (FinvizSettings.adsProvider === 2) {\r\n return AdsProvider.Freestar\r\n }\r\n\r\n return AdsProvider.InvestingChannel\r\n}\r\n\r\n/**\r\n * Tracks virtual page views to google analytics and freestar\r\n */\r\nexport function trackPageView(props: { pathname?: string; query?: string; freestarPageView?: boolean }) {\r\n const { pathname = window.location.pathname, query = window.location.search, freestarPageView = true } = props\r\n\r\n window.gtag?.('set', 'page_path', `${pathname}${query.length ? '?' : ''}${query.replace(/^\\?/, '')}`)\r\n window.gtag?.('event', 'page_view')\r\n\r\n if (freestarPageView && getAdsProvider() === AdsProvider.Freestar) {\r\n window.freestar?.queue.push(() => freestar.trackPageview())\r\n }\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button, ButtonComponentProps, ButtonProps } from './button'\r\nimport { Paragraph } from './typography'\r\n\r\ninterface Props {\r\n children: (React.ReactElement | null)[]\r\n label: string\r\n size?: ButtonProps['size']\r\n rounding?: ButtonProps['rounding']\r\n}\r\n\r\nexport function ChipSwitch({ children, label, size, rounding }: Props) {\r\n return (\r\n
\r\n {label && (\r\n \r\n {label}\r\n \r\n )}\r\n\r\n {React.Children.map(children, (child: React.ReactElement | null) => {\r\n if (React.isValidElement(child) && child.type === Button) {\r\n return React.cloneElement(child, {\r\n size,\r\n rounding,\r\n theme: child.props.theme ?? 'chipTransparent',\r\n className: classnames(child.props.className, {\r\n // @todo - these style should be applied globally onto all chipTransparent buttons\r\n '!text-gray-600 dark:!text-gray-400': !child.props.active,\r\n '!text-gray-800 dark:!text-white': child.props.active,\r\n }),\r\n })\r\n }\r\n\r\n return child\r\n })}\r\n
\r\n )\r\n}\r\n\r\nexport const ChipSwitchButton = Button\r\n","import { Link } from 'react-router-dom'\r\n\r\nimport { Button, ButtonSizeType } from '../button'\r\n\r\ninterface Props {\r\n items: Array<{ label: string; href: string; isActive: boolean; reloadDocument?: boolean }>\r\n size?: ButtonSizeType\r\n}\r\n\r\nexport function SubMenuTabs({ items, size = 'medium' }: Props) {\r\n return (\r\n
\r\n {items.map(({ label, href, isActive, reloadDocument }) => (\r\n \r\n {label}\r\n \r\n ))}\r\n
\r\n )\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function useStickyShadow() {\r\n const stickyRef = React.useRef(null)\r\n const [isSticky, setIsSticky] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n if (!stickyRef.current) return\r\n\r\n const onScroll = throttle(function () {\r\n const stickyElement = stickyRef.current\r\n if (!stickyElement) return\r\n\r\n const elementStickyTopOffset = parseFloat(getComputedStyle(stickyElement).top)\r\n const elementCurrentTopOffset = stickyElement.getBoundingClientRect().top\r\n\r\n setIsSticky(elementCurrentTopOffset === elementStickyTopOffset)\r\n }, 100)\r\n\r\n onScroll()\r\n document.addEventListener('scroll', onScroll)\r\n\r\n return () => {\r\n document.removeEventListener('scroll', onScroll)\r\n }\r\n }, [])\r\n\r\n return React.useMemo(\r\n () => ({\r\n stickyRef,\r\n isSticky,\r\n }),\r\n [isSticky]\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\n\r\nimport * as tracking from '../../app/shared/tracking'\r\n\r\nexport function useTrackPageView(props?: { trackInitial?: boolean; trackAutomatically?: boolean }) {\r\n const { trackInitial = false, trackAutomatically = true } = props ?? {}\r\n const initialRender = React.useRef(trackInitial)\r\n const location = useLocation()\r\n\r\n const handleTrackView = React.useCallback(() => {\r\n tracking.trackPageView({ pathname: location.pathname, query: location.search })\r\n }, [location.pathname, location.search])\r\n\r\n React.useEffect(() => {\r\n if (!trackAutomatically) return\r\n if (initialRender.current) handleTrackView()\r\n initialRender.current = true\r\n }, [trackAutomatically, handleTrackView, trackInitial])\r\n\r\n return handleTrackView\r\n}\r\n","import classNames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { useStickyShadow } from '../../../hooks/use-sticky-shadow'\r\n\r\nexport function StickyShadow(props: React.HTMLProps) {\r\n const { stickyRef, isSticky } = useStickyShadow()\r\n\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { RedGreenText } from '../../../components/RedGreenText'\r\nimport { TableAlign } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, RowKind, TableColumnDefinition } from '../types'\r\nimport { DATE_FORMAT_INT, DATE_FORMAT_VIEW, DATE_FORMAT_VIEW_LONG } from './common'\r\n\r\nconst NULL_VALUE = '-'\r\nconst FORMAT_SETTINGS = { defaultValue: NULL_VALUE }\r\nconst GREEK_SETTINGS = { defaultValue: NULL_VALUE, fractions: 4 }\r\n\r\nexport const columnMap: Record = Object.freeze({\r\n [ColumnId.LastClose]: {\r\n id: ColumnId.LastClose,\r\n align: TableAlign.Right,\r\n name: 'Last Close',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return args.row.lastClose === 0 ? NULL_VALUE : formatNumber(args.row.lastClose, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.ChangeUsd]: {\r\n id: ColumnId.ChangeUsd,\r\n align: TableAlign.Right,\r\n name: 'Change $',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return null\r\n return args.row.lastChange\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n\r\n return (\r\n \r\n {formatNumber(args.row.lastChange, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.ChangePct]: {\r\n id: ColumnId.ChangePct,\r\n align: TableAlign.Right,\r\n name: 'Change %',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return null\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n return (args.row.lastClose / prevClose - 1) * 100\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (typeof args.row.lastClose !== 'number' || args.row.lastClose === 0) return NULL_VALUE\r\n\r\n const prevClose = args.row.lastClose - args.row.lastChange\r\n const change = (args.row.lastClose / prevClose - 1) * 100\r\n\r\n return (\r\n \r\n {formatNumber(change, { ...FORMAT_SETTINGS, showPlusSign: true })}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.BidPrice]: {\r\n id: ColumnId.BidPrice,\r\n align: TableAlign.Right,\r\n name: 'Bid',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.bidPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.bidPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.AskPrice]: {\r\n id: ColumnId.AskPrice,\r\n align: TableAlign.Right,\r\n name: 'Ask',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.askPrice === 0) return NULL_VALUE\r\n return formatNumber(args.row.askPrice, FORMAT_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Volume]: {\r\n id: ColumnId.Volume,\r\n align: TableAlign.Right,\r\n name: 'Volume',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.lastVolume, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.OpenInterest]: {\r\n id: ColumnId.OpenInterest,\r\n align: TableAlign.Right,\r\n name: 'Open Int.',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return formatNumber(args.row.openInterest, { ...FORMAT_SETTINGS, fractions: 0 })\r\n },\r\n },\r\n [ColumnId.StrikePrice]: {\r\n id: ColumnId.StrikePrice,\r\n align: TableAlign.Right,\r\n name: 'Strike',\r\n className: 'w-28',\r\n renderColumn: (args) => formatNumber(args.row.strike, FORMAT_SETTINGS),\r\n },\r\n [ColumnId.ExpirationDate]: {\r\n id: ColumnId.ExpirationDate,\r\n align: TableAlign.Right,\r\n name: 'Expiry',\r\n className: 'w-28',\r\n renderColumn: (args) => formatDate(args.row.exDate, DATE_FORMAT_INT, DATE_FORMAT_VIEW),\r\n },\r\n [ColumnId.ContractName]: {\r\n id: ColumnId.ContractName,\r\n align: TableAlign.Left,\r\n name: 'Contract Name',\r\n className: 'w-44',\r\n getValueForSort: (args) => `${args.ticker}${args.row.exDate}${args.row.strike}`,\r\n renderColumn: (args) => {\r\n if (!args.row) return NULL_VALUE\r\n const strike = (args.row.strike * 1000).toString().padStart(8, '0')\r\n\r\n return (\r\n \r\n {args.ticker?.replace('-', '')}\r\n {args.row.exDate}\r\n {args.kind === RowKind.Call ? 'C' : 'P'}\r\n {strike}\r\n \r\n )\r\n },\r\n },\r\n [ColumnId.LastTrade]: {\r\n id: ColumnId.LastTrade,\r\n align: TableAlign.Right,\r\n name: 'Last Trade',\r\n className: 'w-44',\r\n getValueForSort: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n return new Date(args.row.lastTime)\r\n },\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (args.row.lastClose === 0) return NULL_VALUE\r\n return formatDate(new Date(args.row.lastTime), DATE_FORMAT_VIEW_LONG)\r\n },\r\n },\r\n [ColumnId.IV]: {\r\n id: ColumnId.IV,\r\n align: TableAlign.Right,\r\n name: 'IV',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.iv) return NULL_VALUE\r\n return formatNumber(args.row.iv * 100, FORMAT_SETTINGS) + '%'\r\n },\r\n },\r\n [ColumnId.Delta]: {\r\n id: ColumnId.Delta,\r\n align: TableAlign.Right,\r\n name: 'Delta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.delta) return NULL_VALUE\r\n return formatNumber(args.row.delta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Gamma]: {\r\n id: ColumnId.Gamma,\r\n align: TableAlign.Right,\r\n name: 'Gamma',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.gamma) return NULL_VALUE\r\n return formatNumber(args.row.gamma, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Theta]: {\r\n id: ColumnId.Theta,\r\n align: TableAlign.Right,\r\n name: 'Theta',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.theta) return NULL_VALUE\r\n return formatNumber(args.row.theta, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Vega]: {\r\n id: ColumnId.Vega,\r\n align: TableAlign.Right,\r\n name: 'Vega',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.vega) return NULL_VALUE\r\n return formatNumber(args.row.vega, GREEK_SETTINGS)\r\n },\r\n },\r\n [ColumnId.Rho]: {\r\n id: ColumnId.Rho,\r\n align: TableAlign.Right,\r\n name: 'Rho',\r\n renderColumn: (args) => {\r\n if (args.kind === RowKind.OptionRow) return null\r\n if (!args.row.rho) return NULL_VALUE\r\n return formatNumber(args.row.rho, GREEK_SETTINGS)\r\n },\r\n },\r\n})\r\n","export const DATE_FORMAT_DB = 'yyyy-MM-dd'\r\nexport const DATE_FORMAT_INT = 'yyMMdd'\r\nexport const DATE_FORMAT_VIEW = 'MM/dd/yyyy'\r\nexport const DATE_FORMAT_VIEW_LONG = 'MMM dd, yyyy, hh:mm a'\r\nexport const DATE_FORMAT_SCATTER_PLOT = '%m/%d/%Y'\r\nexport const LINK_COLUMN_NAME = 'link'\r\n","import { decodeQueryString, encodeQueryString } from '../../../../app/queryString'\r\nimport { SubMenuTabs } from '../../../components/SubMenu/SubMenuTabs'\r\nimport { OptionsSubpage, OptionsView } from '../../options/types'\r\nimport { QuoteSubview } from '../types'\r\n\r\nconst OPTIONS_SECTION_LABELS = {\r\n [QuoteSubview.OptionsChain]: 'Prices',\r\n [QuoteSubview.OptionsVolatility]: 'Volatility & Greeks',\r\n}\r\n\r\nconst OPTIONS_MENU_TABS: Array = [\r\n QuoteSubview.OptionsChain,\r\n QuoteSubview.OptionsVolatility,\r\n]\r\n\r\nfunction getProperOV(ty: string, ov: string): string {\r\n if (ty === OptionsSubpage.Volatility && ov === OptionsView.Plot) {\r\n return OptionsView.ChainByDate\r\n }\r\n return ov\r\n}\r\n\r\nfunction getOptionsMenuTabs() {\r\n const searchParams = decodeQueryString()\r\n\r\n return OPTIONS_MENU_TABS.map((value) => ({\r\n label: OPTIONS_SECTION_LABELS[value],\r\n href: `/quote.ashx?${encodeQueryString({\r\n ...searchParams,\r\n ty: value,\r\n ov: getProperOV(value, searchParams.ov),\r\n })}`,\r\n isActive: searchParams.ty === value,\r\n reloadDocument: true,\r\n }))\r\n}\r\n\r\nexport function QuoteOptionsTabMenu() {\r\n return \r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { ChipSwitch, ChipSwitchButton } from '../../../components/ChipSwitch'\r\nimport { OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nexport function OptionsViewSwitcher({ activeView, subpage }: { activeView: OptionsView; subpage: OptionsSubpage }) {\r\n const [searchParams] = useSearchParams()\r\n\r\n const chainLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ChainByStrike\r\n : OptionsView.ChainByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const listLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(\r\n OptionsQuery.View,\r\n [OptionsView.ChainByStrike, OptionsView.ListByStrike].includes(newParams.get(OptionsQuery.View) as OptionsView)\r\n ? OptionsView.ListByStrike\r\n : OptionsView.ListByDate\r\n )\r\n return newParams\r\n }, [searchParams])\r\n\r\n const plotLink = React.useMemo(() => {\r\n const newParams = new URLSearchParams(searchParams)\r\n newParams.set(OptionsQuery.View, OptionsView.Plot)\r\n newParams.delete(OptionsQuery.Strike)\r\n newParams.delete(OptionsQuery.Expiry)\r\n return newParams\r\n }, [searchParams])\r\n\r\n return (\r\n \r\n \r\n Chain\r\n \r\n \r\n List\r\n \r\n {subpage === OptionsSubpage.Prices ? (\r\n \r\n 3D\r\n \r\n ) : null}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsParsedQuery, parseOptionsQuery } from '../utils/query'\r\n\r\nexport function useOptionsQuery(params: URLSearchParams): OptionsParsedQuery {\r\n return React.useMemo(() => parseOptionsQuery(params), [params])\r\n}\r\n","import { getDate, getFormattedDateString } from '../../../../app/header/utils'\r\nimport { TableAlign, TableCell, TableRow } from '../../../components/Table'\r\nimport { formatNumber } from '../../../util'\r\n\r\ninterface PriceRowProps {\r\n /**\r\n * Price to show\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Date when the last price was valid to.\r\n *\r\n * @default current time\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Column span for the left column with date\r\n */\r\n leftSpan?: number\r\n\r\n /**\r\n * Column span for the right column, which is empty\r\n */\r\n rightSpan?: number\r\n\r\n priceAlign?: TableAlign\r\n\r\n /**\r\n * Show additional empty cells around lastClose cell\r\n */\r\n showAdditionalCells?: boolean\r\n}\r\n\r\nexport function PriceRow({\r\n lastClose,\r\n lastTime,\r\n leftSpan,\r\n rightSpan,\r\n priceAlign = TableAlign.Center,\r\n showAdditionalCells = true,\r\n}: PriceRowProps) {\r\n if (lastTime === null || lastClose === null) return null\r\n\r\n const date = getDate(lastTime * 1000)\r\n const formattedDate = getFormattedDateString(date, 'dateOnly')\r\n const formattedTime = getFormattedDateString(date, 'timeOnly')\r\n\r\n return (\r\n \r\n \r\n Price • {formattedDate}{' '}\r\n • {formattedTime} ET\r\n \r\n {showAdditionalCells && }\r\n \r\n {formatNumber(lastClose)}\r\n \r\n {showAdditionalCells && }\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\nimport { TableCell, TableCellProps } from '../../../components/Table'\r\n\r\nexport interface OptionsTableCellProps extends TableCellProps {\r\n isHighlighted?: boolean\r\n isBorderVisible?: boolean\r\n}\r\n\r\nexport function OptionsTableCell({\r\n isFirst,\r\n isLast,\r\n isHighlighted,\r\n isBorderVisible = true,\r\n ...props\r\n}: OptionsTableCellProps) {\r\n return (\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSort,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection, SortableValue } from '../../../types'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId, Option, OptionRow, OptionsSubpage, RowKind, TableColumnDefinition } from '../types'\r\nimport { mergeOptionsBy } from '../utils/options'\r\nimport { getViewLink } from '../utils/query'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell, OptionsTableCellProps } from './TableColumn'\r\n\r\nexport interface ChainTableColumn extends Omit {\r\n /**\r\n * The sort hook internally compares `id` key, and because we have the same\r\n * columns on each side, we need them to be unique, so we keep the original id\r\n */\r\n id: string\r\n originalId: ColumnId\r\n /**\r\n * Used in sorting to distinguish between calls and puts columns\r\n */\r\n rowKind: RowKind\r\n}\r\n\r\nconst CALL_OPTION_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_COLUMNS: ChainTableColumn[] = CALL_OPTION_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst CALL_OPTION_GREEK_COLUMNS: ChainTableColumn[] = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n].map((id) => ({\r\n ...columnMap[id],\r\n originalId: id,\r\n id: `call_${columnMap[id].id}`,\r\n rowKind: RowKind.Call,\r\n className: classnames({\r\n 'w-22 xl:w-auto': id === ColumnId.LastClose,\r\n 'w-20 xl:w-auto': [ColumnId.ChangeUsd, ColumnId.OpenInterest].includes(id),\r\n 'hidden xl:table-cell': id === ColumnId.ChangePct,\r\n }),\r\n}))\r\n\r\nconst PUT_OPTION_GREEK_COLUMNS: ChainTableColumn[] = CALL_OPTION_GREEK_COLUMNS.map((option) => ({\r\n ...option,\r\n id: `put_${option.originalId}`,\r\n originalId: option.originalId,\r\n rowKind: RowKind.Put,\r\n}))\r\n\r\nconst FULL_COLUMNS_BREAKPOINT = 1280\r\n\r\nfunction valueGetter(column: ChainTableColumn) {\r\n return (row: OptionRow) => {\r\n const customValueGetter = typeof column.getValueForSort === 'function' ? column.getValueForSort : undefined\r\n\r\n switch (column.rowKind) {\r\n case RowKind.OptionRow:\r\n if (customValueGetter) {\r\n return customValueGetter({ kind: RowKind.OptionRow, row })\r\n } else {\r\n return (row[column.originalId as keyof typeof row] as SortableValue) ?? null\r\n }\r\n case RowKind.Call:\r\n if (row.call && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Call, row: row.call })\r\n } else {\r\n return row.call?.[column.originalId as keyof Option] ?? null\r\n }\r\n case RowKind.Put:\r\n if (row.put && customValueGetter) {\r\n return customValueGetter({ kind: RowKind.Put, row: row.put })\r\n } else {\r\n return row.put?.[column.originalId as keyof Option] ?? null\r\n }\r\n default:\r\n return null\r\n }\r\n }\r\n}\r\n\r\ninterface ChainTableProps {\r\n className?: string\r\n\r\n /**\r\n * Type of table, display either prices or volatility & greeks\r\n */\r\n subpage: OptionsSubpage\r\n\r\n /**\r\n * Options rows which are displayed in the table.\r\n */\r\n data: Option[]\r\n\r\n /**\r\n * `id` of the column which is displayed as the middle column between\r\n * calls and puts.\r\n *\r\n * @default ColumnId.StrikePrice\r\n */\r\n middleColumn?: ColumnId.StrikePrice | ColumnId.ExpirationDate\r\n\r\n /**\r\n * When enabled, a row with current price will be added to the table at the\r\n * position of the price. The row will only be visible when ordering by the\r\n * middle column.\r\n *\r\n * @default middleColumn === ColumnId.StrikePrice\r\n */\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Last close for current ticker. Used to add highlight on calls/puts and as\r\n * a row in the middle of the table which displays the current price.\r\n */\r\n lastClose: number | null\r\n\r\n /**\r\n * Time when the `lastClose` was valid. Displayed in current price row.\r\n */\r\n lastTime: number | null\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n onSortChange?: (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: ChainTableColumn, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function ChainTable({\r\n className,\r\n data,\r\n lastClose,\r\n lastTime,\r\n middleColumn = ColumnId.StrikePrice,\r\n isPriceRowEnabled = middleColumn === ColumnId.StrikePrice,\r\n isHeaderSticky,\r\n headerClass,\r\n subpage,\r\n tableOrder,\r\n onSortChange,\r\n}: ChainTableProps) {\r\n const CALL_COLUMNS = subpage === OptionsSubpage.Volatility ? CALL_OPTION_GREEK_COLUMNS : CALL_OPTION_COLUMNS\r\n const PUT_COLUMNS = subpage === OptionsSubpage.Volatility ? PUT_OPTION_GREEK_COLUMNS : PUT_OPTION_COLUMNS\r\n const [columnsLength, setColumnsLength] = React.useState(CALL_COLUMNS.length)\r\n const [searchParams] = useSearchParams()\r\n const tickerLastClose = lastClose ?? 0\r\n\r\n React.useEffect(() => {\r\n const updateColumnsLength = () => {\r\n if (window.innerWidth >= FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length - 1) {\r\n setColumnsLength(CALL_COLUMNS.length)\r\n } else if (window.innerWidth < FULL_COLUMNS_BREAKPOINT && columnsLength === CALL_COLUMNS.length) {\r\n setColumnsLength(CALL_COLUMNS.length - 1)\r\n }\r\n }\r\n\r\n updateColumnsLength()\r\n window.addEventListener('resize', updateColumnsLength)\r\n\r\n return () => {\r\n window.removeEventListener('resize', updateColumnsLength)\r\n }\r\n })\r\n\r\n const middleColumnDefinition = React.useMemo(\r\n () => ({\r\n ...columnMap[middleColumn],\r\n originalId: middleColumn,\r\n rowKind: RowKind.OptionRow,\r\n }),\r\n [middleColumn]\r\n )\r\n\r\n const allColumns = React.useMemo(\r\n () => [...CALL_COLUMNS, middleColumnDefinition, ...PUT_COLUMNS],\r\n [CALL_COLUMNS, PUT_COLUMNS, middleColumnDefinition]\r\n )\r\n\r\n const mergedData = React.useMemo(() => mergeOptionsBy(data, middleColumn), [data, middleColumn])\r\n const {\r\n data: tableRows,\r\n sort,\r\n changeSort,\r\n } = useTableSort({\r\n data: mergedData,\r\n columns: allColumns,\r\n defaultSort: getDefaultSortFromUrl(allColumns, tableOrder),\r\n valueGetter,\r\n })\r\n\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === middleColumnDefinition.id\r\n\r\n if (!isVisible) return { isVisible, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? tableRows.findLastIndex((option) => option.strike < tickerLastClose)\r\n : tableRows.findLastIndex((option) => option.strike > tickerLastClose)\r\n\r\n return { isVisible, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, middleColumnDefinition.id, tableRows, tickerLastClose])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: tickerLastClose,\r\n lastTime,\r\n leftSpan: columnsLength,\r\n rightSpan: columnsLength,\r\n }),\r\n [tickerLastClose, lastTime, columnsLength]\r\n )\r\n\r\n return (\r\n \r\n \r\n {CALL_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n\r\n
\r\n {\r\n typeof onSortChange === 'function'\r\n ? onSortChange(middleColumnDefinition, sort, changeSort)\r\n : changeSort(middleColumnDefinition)\r\n }}\r\n className=\"w-28\"\r\n >\r\n {middleColumnDefinition.name}\r\n \r\n \r\n\r\n {PUT_COLUMNS.map((column) => (\r\n {\r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }}\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index < 0 && (\r\n \r\n \r\n \r\n )}\r\n\r\n \r\n {tableRows.map((option, index) => {\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === index\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < tableRows.length - 1\r\n const columnClass = classnames({ 'border-b': showPriceAfter })\r\n const middleLink = getViewLink(middleColumn, searchParams, option)\r\n\r\n const row = (\r\n \r\n {option.call ? (\r\n \r\n ) : (\r\n \r\n )}\r\n\r\n \r\n \r\n \r\n {middleColumnDefinition.renderColumn({ kind: RowKind.OptionRow, row: option })}\r\n \r\n \r\n \r\n\r\n {option.put ? (\r\n tickerLastClose}\r\n className={columnClass}\r\n />\r\n ) : (\r\n \r\n )}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n\r\n {currentPriceRow.isVisible && currentPriceRow.index === tableRows.length - 1 && (\r\n \r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\ninterface ChainOptionRowProps extends Omit {\r\n columns: ChainTableColumn[]\r\n kind: RowKind.Call | RowKind.Put\r\n option: Option\r\n isHighlighted?: boolean\r\n}\r\n\r\nfunction ChainOptionRow({ columns, kind, option, isHighlighted, className, ...props }: ChainOptionRowProps) {\r\n return (\r\n <>\r\n {columns.map((column, index) => {\r\n const isFirst = index === 0\r\n const isLast = index === columns.length - 1\r\n\r\n return (\r\n \r\n {column.renderColumn({ kind, row: option })}\r\n \r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import { ColumnId, Option, OptionRow, OptionType } from '../types'\r\n\r\nexport function mergeOptionsBy(options: Option[], mergeBy: ColumnId.StrikePrice | ColumnId.ExpirationDate) {\r\n const result: OptionRow[] = []\r\n const sorted = options.slice().sort((a, b) => a[mergeBy] - b[mergeBy])\r\n\r\n for (const option of sorted) {\r\n let last = result[result.length - 1]\r\n if (last?.[mergeBy] !== option[mergeBy]) {\r\n last = { strike: option.strike, exDate: option.exDate, call: null, put: null }\r\n result.push(last)\r\n }\r\n\r\n if (option.type === OptionType.Call) {\r\n last.call = option\r\n } else {\r\n last.put = option\r\n }\r\n }\r\n\r\n return result\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Select, SelectItem } from '../../../components'\r\nimport { columnMap } from '../constants/columns'\r\nimport { ColumnId } from '../types'\r\n\r\ninterface FilterSelectProps {\r\n filterColumn: ColumnId\r\n selected?: ValueType\r\n options: Array>\r\n onChange: (value: SelectItem) => void\r\n}\r\n\r\nexport function FilterSelect({\r\n filterColumn,\r\n selected,\r\n options,\r\n onChange,\r\n}: FilterSelectProps) {\r\n /**\r\n * `selected` comes from loader. We set the selection to state in order to have\r\n * immediate response to user action. We also need to set the selection in an effect\r\n * so that back/forward works correctly.\r\n */\r\n const [filterValue, setFilterValue] = React.useState(selected)\r\n React.useEffect(() => {\r\n setFilterValue(selected)\r\n }, [selected])\r\n\r\n return (\r\n {\r\n setFilterValue(item.value)\r\n onChange(item)\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_VIEW } from '../constants/common'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function DateFilter({ currentExpiry, expiries }: { currentExpiry: string; expiries: string[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => expiries.map((option) => ({ label: formatDate(option, DATE_FORMAT_DB, DATE_FORMAT_VIEW), value: option })),\r\n [expiries]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Expiry, option.value)\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { formatNumber } from '../../../util'\r\nimport { ColumnId, OptionsQuery } from '../types'\r\nimport { FilterSelect } from './FilterSelect'\r\n\r\nexport function StrikeFilter({ currentStrike, strikes }: { currentStrike: number; strikes: number[] }) {\r\n const [, setSearchParams] = useSearchParams()\r\n\r\n const filterOptions = React.useMemo(\r\n () => strikes.map((option) => ({ label: '$ ' + formatNumber(option), value: option })),\r\n [strikes]\r\n )\r\n\r\n return (\r\n {\r\n setSearchParams((prev) => {\r\n const newQuery = new URLSearchParams(prev)\r\n newQuery.set(OptionsQuery.Strike, option.value.toString())\r\n return newQuery\r\n })\r\n }}\r\n />\r\n )\r\n}\r\n","import classNames from 'classnames'\r\nimport React from 'react'\r\nimport { useSearchParams } from 'react-router-dom'\r\n\r\nimport { parseOptionsQuery } from '../utils/query'\r\n\r\nexport default function ViewFooter({ className }: { className?: string }) {\r\n const [searchParams] = useSearchParams()\r\n const { ticker, expiry, strike } = parseOptionsQuery(searchParams)\r\n\r\n const exportUrl = React.useMemo(\r\n () =>\r\n 'export/options?' +\r\n new URLSearchParams({\r\n t: ticker,\r\n e: expiry ?? '',\r\n s: strike ? strike.toString() : '',\r\n }),\r\n [ticker, expiry, strike]\r\n )\r\n\r\n return (\r\n
\r\n Options delayed 15 minutes\r\n {\r\n window.gtag && window.gtag('event', 'download', { event_category: 'export' })\r\n }}\r\n >\r\n export\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { useNavigate } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { LINK_COLUMN_NAME } from '../constants/common'\r\nimport { OptionsQuery, OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery, orderToString } from '../utils/query'\r\n\r\nexport function useOptionsSortChange(\r\n subpage: OptionsSubpage,\r\n query: OptionsParsedQuery\r\n) {\r\n const navigate = useNavigate()\r\n return React.useCallback(\r\n (\r\n column: SortColumnType,\r\n sort: SortByShape,\r\n changeSort: (newSort: SortColumnType, direction?: SortDirection) => void,\r\n prefix: string = '',\r\n isLinkColumn: boolean = false\r\n ) => {\r\n const newQuery = new URLSearchParams(query.params)\r\n const urlColumnId = isLinkColumn ? LINK_COLUMN_NAME : column.id\r\n const urlOrderValue =\r\n sort.column.id === column.id && sort.direction === SortDirection.Ascending\r\n ? `-${prefix}${urlColumnId}`\r\n : `${prefix}${urlColumnId}`\r\n\r\n const newOrder = { ...query.order, [subpage]: urlOrderValue }\r\n\r\n newQuery.set(OptionsQuery.Order, orderToString(newOrder))\r\n changeSort(column)\r\n navigate(`?${newQuery}`, { preventScrollReset: true })\r\n },\r\n [navigate, query.order, query.params, subpage]\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { OptionsSubpage } from '../types'\r\nimport { OptionsParsedQuery } from '../utils/query'\r\n\r\nexport function useOptionsSortOrder(subpage: OptionsSubpage, query: OptionsParsedQuery, defaultOrder: string) {\r\n return React.useMemo(() => {\r\n if (query.order[subpage]) {\r\n return query.order[subpage]\r\n }\r\n return defaultOrder\r\n }, [defaultOrder, query, subpage])\r\n}\r\n","import { useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { ChainTable, ChainTableColumn } from '../components/ChainTable'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport { ColumnId, OptionsByDateLoader, OptionsByStrikeLoader, OptionsView } from '../types'\r\nimport { evalLinkOrder } from '../utils/query'\r\n\r\nexport function ChainRoute({ options, lastClose, lastTime, ...props }: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const middleColumn = props.view === OptionsView.ChainByDate ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = props.view === OptionsView.ChainByDate ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n const tableOrder = useOptionsSortOrder(props.subpage, query, middleColumn)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, middleColumn)\r\n const optionsSortChange = useOptionsSortChange(props.subpage, query)\r\n\r\n const handleSortChange = (\r\n column: ChainTableColumn,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void\r\n ) => optionsSortChange(column, sort, changeSort, '', column.id === middleColumn)\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n

Calls

\r\n
{columnMap[filterColumn].name}
\r\n
\r\n
\r\n {props.view === OptionsView.ChainByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ChainByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n

Puts

\r\n
\r\n
\r\n
\r\n\r\n \r\n
\r\n handleSortChange(column, sort, changeSort)}\r\n />\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport {\r\n Table,\r\n TableAlign,\r\n TableBody,\r\n TableHead,\r\n TableHeaderSortable,\r\n TableRow,\r\n getDefaultSortFromUrl,\r\n useTableSortWithAutoupdate,\r\n} from '../../../components/Table'\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { CallKind, ColumnId, ColumnRendererProps, Option, RowKind, TableColumnDefinition } from '../types'\r\nimport { PriceRow } from './PriceRow'\r\nimport { OptionsTableCell } from './TableColumn'\r\n\r\nfunction defaultColumnRenderer(column: TableColumnDefinition, props: ColumnRendererProps) {\r\n return column.renderColumn(props)\r\n}\r\n\r\nfunction getColumnValueGetter(kind: RowKind, ticker?: string | null, lastClose?: number | null) {\r\n return (column: TableColumnDefinition) => (row: Option) => {\r\n if (typeof column.getValueForSort === 'function') {\r\n return column.getValueForSort({ kind, lastClose, row } as CallKind)\r\n }\r\n\r\n return row[column.id as keyof typeof row] ?? null\r\n }\r\n}\r\n\r\ninterface OptionsTableProps {\r\n kind?: RowKind\r\n ticker: string | null\r\n lastClose?: number | null\r\n lastTime?: number | null\r\n options: Option[]\r\n columns: TableColumnDefinition[]\r\n isPriceRowEnabled?: boolean\r\n\r\n /**\r\n * Sorting key (column id, with optional dash prefix for descending)\r\n */\r\n tableOrder: string\r\n\r\n /**\r\n * Whether headers should become sticky\r\n */\r\n isHeaderSticky?: boolean\r\n headerClass?: string\r\n\r\n renderColumn?: (column: TableColumnDefinition, props: ColumnRendererProps) => React.ReactNode\r\n\r\n onSortChange?: (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: TableColumnDefinition, direction?: SortDirection) => void\r\n ) => void\r\n}\r\n\r\nexport function OptionsTable({\r\n kind = RowKind.Call,\r\n ticker,\r\n lastClose,\r\n lastTime,\r\n columns,\r\n options,\r\n isPriceRowEnabled = true,\r\n tableOrder,\r\n isHeaderSticky,\r\n headerClass,\r\n renderColumn = defaultColumnRenderer,\r\n onSortChange,\r\n}: OptionsTableProps) {\r\n const { data, sort, changeSort } = useTableSortWithAutoupdate({\r\n data: options,\r\n columns,\r\n defaultSort: getDefaultSortFromUrl(columns, tableOrder),\r\n valueGetter: getColumnValueGetter(kind, ticker, lastClose),\r\n tableOrder,\r\n })\r\n /**\r\n * We display current price as a row between strike prices\r\n */\r\n const currentPriceRow = React.useMemo(() => {\r\n const isVisible = isPriceRowEnabled && sort.column.id === ColumnId.StrikePrice\r\n\r\n if (!isVisible || typeof lastClose !== 'number') return { isVisible: false, rowIndex: -1 }\r\n\r\n const rowIndex =\r\n sort.direction === SortDirection.Ascending\r\n ? data.findLastIndex((option) => option.strike < lastClose)\r\n : data.findLastIndex((option) => option.strike > lastClose)\r\n\r\n return { isVisible: true, index: rowIndex }\r\n }, [isPriceRowEnabled, sort.column.id, sort.direction, lastClose, data])\r\n\r\n const priceRowProps = React.useMemo(\r\n () => ({\r\n lastClose: lastClose ?? null,\r\n lastTime: lastTime ?? null,\r\n leftSpan: 2,\r\n rightSpan: 7,\r\n showAdditionalCells: false,\r\n priceAlign: TableAlign.Right,\r\n }),\r\n [lastClose, lastTime]\r\n )\r\n\r\n return (\r\n \r\n \r\n {columns.map((column) => (\r\n \r\n typeof onSortChange === 'function' ? onSortChange(column, sort, changeSort) : changeSort(column)\r\n }\r\n >\r\n {column.name}\r\n \r\n ))}\r\n \r\n\r\n \r\n {data.map((option, rowIndex) => {\r\n const key = `${option.askPrice}-${option.exDate}-${option.strike}-${rowIndex}`\r\n const isHighlighted =\r\n typeof lastClose === 'number' &&\r\n (kind === RowKind.Call ? option.strike < lastClose : option.strike > lastClose)\r\n const isCurrentPriceRow = currentPriceRow.isVisible && currentPriceRow.index === rowIndex\r\n const showPriceAfter = isCurrentPriceRow && currentPriceRow.index < data.length - 1\r\n\r\n const row = (\r\n \r\n {columns.map((column, index) => (\r\n \r\n {renderColumn(column, { kind: kind, ticker, lastClose, row: option } as ColumnRendererProps)}\r\n \r\n ))}\r\n \r\n )\r\n\r\n if (showPriceAfter) {\r\n return (\r\n \r\n {row}\r\n {showPriceAfter && }\r\n \r\n )\r\n }\r\n\r\n return row\r\n })}\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\nimport { Link, useSearchParams } from 'react-router-dom'\r\n\r\nimport { SortByShape } from '../../../hooks/use-sort-data'\r\nimport { SortDirection } from '../../../types'\r\nimport { DateFilter } from '../components/DateFilter'\r\nimport { OptionsTable } from '../components/OptionsTable'\r\nimport { StickyShadow } from '../components/StickyShadow'\r\nimport { StrikeFilter } from '../components/StrikeFilter'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { columnMap } from '../constants/columns'\r\nimport { useOptionsQuery } from '../hooks/useOptionsQuery'\r\nimport { useOptionsSortChange } from '../hooks/useOptionsSortChange'\r\nimport { useOptionsSortOrder } from '../hooks/useOptionsSortOrder'\r\nimport {\r\n ColumnId,\r\n ColumnRendererProps,\r\n OptionType,\r\n OptionsByDateLoader,\r\n OptionsByStrikeLoader,\r\n OptionsSubpage,\r\n OptionsView,\r\n RowKind,\r\n TableColumnDefinition,\r\n} from '../types'\r\nimport { evalLinkOrder, getViewLink } from '../utils/query'\r\n\r\nconst LEFT_COLUMNS = [ColumnId.ContractName, ColumnId.LastTrade]\r\nconst RIGHT_PRICES_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.BidPrice,\r\n ColumnId.AskPrice,\r\n ColumnId.ChangeUsd,\r\n ColumnId.ChangePct,\r\n ColumnId.Volume,\r\n ColumnId.OpenInterest,\r\n]\r\n\r\nconst RIGHT_GREEK_COLUMNS = [\r\n ColumnId.LastClose,\r\n ColumnId.IV,\r\n ColumnId.Delta,\r\n ColumnId.Gamma,\r\n ColumnId.Theta,\r\n ColumnId.Vega,\r\n ColumnId.Rho,\r\n]\r\n\r\nconst BY_DATE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\nconst BY_STRIKE_PRICES_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_PRICES_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nconst BY_DATE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.StrikePrice, ...RIGHT_GREEK_COLUMNS].map((id) => columnMap[id])\r\nconst BY_STRIKE_GREEK_COLUMNS = [...LEFT_COLUMNS, ColumnId.ExpirationDate, ...RIGHT_GREEK_COLUMNS].map(\r\n (id) => columnMap[id]\r\n)\r\n\r\nfunction getColumnRenderer(searchParams: URLSearchParams) {\r\n return (column: TableColumnDefinition, props: ColumnRendererProps) => {\r\n switch (column.id) {\r\n case ColumnId.StrikePrice:\r\n case ColumnId.ExpirationDate:\r\n const middleLink = getViewLink(column.id, searchParams, props.row)\r\n\r\n return (\r\n \r\n {column.renderColumn(props)}\r\n \r\n )\r\n default:\r\n return column.renderColumn(props)\r\n }\r\n }\r\n}\r\n\r\nfunction getColumns(subpage: OptionsSubpage, isByDateList: boolean): TableColumnDefinition[] {\r\n if (subpage === OptionsSubpage.Volatility) {\r\n return isByDateList ? BY_DATE_GREEK_COLUMNS : BY_STRIKE_GREEK_COLUMNS\r\n } else {\r\n return isByDateList ? BY_DATE_PRICES_COLUMNS : BY_STRIKE_PRICES_COLUMNS\r\n }\r\n}\r\n\r\nfunction removePrefix(sortOrder: string) {\r\n if (!sortOrder.includes('_')) return sortOrder\r\n const [prefix, rest] = sortOrder.split('_', 2)\r\n return prefix.startsWith('-') ? `-${rest}` : rest\r\n}\r\n\r\nexport function ListRoute(props: OptionsByDateLoader | OptionsByStrikeLoader) {\r\n const [searchParams] = useSearchParams()\r\n const subpage = props.subpage\r\n const columnRenderer = React.useMemo(() => getColumnRenderer(searchParams), [searchParams])\r\n const isByDateList = props.view === OptionsView.ListByDate\r\n const columns = getColumns(subpage, isByDateList)\r\n const linkColumn = isByDateList ? ColumnId.StrikePrice : ColumnId.ExpirationDate\r\n const filterColumn = isByDateList ? ColumnId.ExpirationDate : ColumnId.StrikePrice\r\n const query = useOptionsQuery(searchParams)\r\n const prefixedTableOrder = useOptionsSortOrder(props.subpage, query, linkColumn)\r\n const tableOrder = removePrefix(prefixedTableOrder)\r\n const effectiveTableOrder = evalLinkOrder(tableOrder, linkColumn)\r\n const optionsSortChange = useOptionsSortChange(subpage, query)\r\n\r\n const handleSortChange = (\r\n column: TableColumnDefinition,\r\n sort: SortByShape,\r\n changeSort: (newSort: any, direction?: SortDirection) => void,\r\n sortPrefix: string\r\n ) => {\r\n optionsSortChange(column, sort, changeSort, column.id === linkColumn ? '' : sortPrefix, column.id === linkColumn)\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n
\r\n
{columnMap[filterColumn].name}
\r\n
\r\n {props.view === OptionsView.ListByDate && (\r\n \r\n )}\r\n {props.view === OptionsView.ListByStrike && (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n \r\n
\r\n
\r\n

Calls

\r\n
\r\n option.type === OptionType.Call)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'call_')}\r\n />\r\n
\r\n
\r\n\r\n
\r\n

\r\n Puts\r\n

\r\n \r\n
\r\n option.type === OptionType.Put)}\r\n renderColumn={columnRenderer}\r\n tableOrder={effectiveTableOrder}\r\n onSortChange={(column, sort, changeSort) => handleSortChange(column, sort, changeSort, 'put_')}\r\n />\r\n
\r\n
\r\n
\r\n \r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { Loading } from '../../../components/loading'\r\nimport ViewFooter from '../components/ViewFooter'\r\nimport { OptionsLoaderData } from '../types'\r\n\r\nconst ScatterPlot = React.lazy(() => import('../components/ScatterPlot'))\r\n\r\nexport function PlotRoute({ options }: OptionsLoaderData) {\r\n return (\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","import classnames from 'classnames'\r\nimport * as React from 'react'\r\nimport { useRevalidator, useSearchParams } from 'react-router-dom'\r\n\r\nimport { intervalCallbackOnWindowVisible } from '../../../app/shared/documentVisibility'\r\nimport { useTrackPageView } from '../../hooks/use-track-pageview'\r\nimport { useCachedLoaderData } from '../../hooks/useCachedLoaderData'\r\nimport { QuoteOptionsTabMenu } from '../quote/components/QuoteOptionsTabMenu'\r\nimport { QuoteStickySubMenu } from '../quote/components/QuoteStickySubMenu'\r\nimport { OptionsViewSwitcher } from './components/OptionsViewSwitcher'\r\nimport { useOptionsQuery } from './hooks/useOptionsQuery'\r\nimport { ChainRoute } from './routes/ChainRoute'\r\nimport { ListRoute } from './routes/ListRoute'\r\nimport { PlotRoute } from './routes/PlotRoute'\r\nimport { OptionsLoaderData, OptionsSubpage, OptionsView } from './types'\r\n\r\nconst OPTIONS_REFRESH_INTERVAL = 60 * 1000\r\n\r\nexport default function Options() {\r\n useTrackPageView()\r\n\r\n const { data } = useCachedLoaderData()\r\n const revalidator = useRevalidator()\r\n const [searchParams] = useSearchParams()\r\n const query = useOptionsQuery(searchParams)\r\n\r\n React.useEffect(() => {\r\n const unsubscribe = intervalCallbackOnWindowVisible({ interval: OPTIONS_REFRESH_INTERVAL }, () => {\r\n // Do a false check so that browsers which don’t support this just continue\r\n if (navigator.onLine === false) return\r\n revalidator.revalidate()\r\n })\r\n\r\n return unsubscribe\r\n // Reset the refetch interval after every expiry change\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [query.expiry, query.strike])\r\n\r\n return FinvizSettings.hasOptionsGreeksEnabled ? (\r\n <>\r\n }\r\n rightContent={\r\n data?.options?.length ? (\r\n \r\n ) : undefined\r\n }\r\n />\r\n
\r\n {data?.options?.length ? (\r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n
\r\n \r\n ) : (\r\n
\r\n {data?.options?.length ? (\r\n <>\r\n \r\n \r\n
\r\n \r\n \r\n ) : (\r\n
\r\n Options are not available for this stock.\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\nfunction OptionsContent(props: OptionsLoaderData & { subpage: OptionsSubpage; view: OptionsView }) {\r\n switch (props.view) {\r\n case OptionsView.Plot:\r\n return \r\n case OptionsView.ListByDate:\r\n case OptionsView.ListByStrike:\r\n return \r\n case OptionsView.ChainByStrike:\r\n default:\r\n return \r\n }\r\n}\r\n","import { TableAlign } from '../../components/Table'\r\nimport { SortableColumn } from '../../hooks/use-sort-data'\r\n\r\nexport enum OptionsQuery {\r\n Ticker = 't',\r\n Expiry = 'e',\r\n Strike = 's',\r\n Order = 'o',\r\n View = 'ov',\r\n Type = 'ty',\r\n}\r\n\r\nexport enum OptionsSubpage {\r\n Prices = 'oc',\r\n Volatility = 'ocv',\r\n}\r\n\r\nexport enum OptionsView {\r\n ChainByDate = 'chain_date',\r\n ChainByStrike = 'chain_strike',\r\n ListByDate = 'list_date',\r\n ListByStrike = 'list_strike',\r\n Plot = 'plot',\r\n}\r\n\r\nexport enum OptionType {\r\n Call = 'call',\r\n Put = 'put',\r\n}\r\n\r\nexport interface Option {\r\n type: OptionType\r\n ticker: string\r\n exDate: number\r\n strike: number\r\n openInterest: number\r\n averageVolume: number\r\n bidPrice: number\r\n askPrice: number\r\n lastClose: number\r\n lastChange: number\r\n lastSize: number\r\n lastVolume: number\r\n lastTime: string\r\n iv: number | null\r\n delta: number | null\r\n gamma: number | null\r\n theta: number | null\r\n vega: number | null\r\n rho: number | null\r\n}\r\n\r\nexport interface OptionRow {\r\n strike: number\r\n exDate: number\r\n call: Option | null\r\n put: Option | null\r\n}\r\n\r\nexport interface LoaderBase {\r\n ticker: string | null\r\n options: Option[]\r\n lastClose: number | null\r\n lastTime: number | null\r\n hasData?: boolean\r\n}\r\n\r\nexport interface OptionsByDateLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByDate | OptionsView.ListByDate\r\n expiries: string[]\r\n currentExpiry: string\r\n}\r\n\r\nexport interface OptionsByStrikeLoader extends LoaderBase {\r\n subpage: OptionsSubpage\r\n view: OptionsView.ChainByStrike | OptionsView.ListByStrike\r\n strikes: number[]\r\n currentStrike: number\r\n}\r\n\r\nexport interface PlotLoader {\r\n subpage: OptionsSubpage\r\n view: OptionsView.Plot\r\n optionable: boolean\r\n options: Option[]\r\n}\r\n\r\nexport type OptionsLoaderData = OptionsByDateLoader | OptionsByStrikeLoader | PlotLoader\r\n\r\nexport enum ColumnId {\r\n ContractName = 'contractName',\r\n LastClose = 'lastClose',\r\n ChangeUsd = 'lastChange',\r\n ChangePct = 'changePct',\r\n BidPrice = 'bidPrice',\r\n AskPrice = 'askPrice',\r\n Volume = 'lastVolume',\r\n OpenInterest = 'openInterest',\r\n StrikePrice = 'strike',\r\n ExpirationDate = 'exDate',\r\n LastTrade = 'lastTime',\r\n IV = 'iv',\r\n Delta = 'delta',\r\n Gamma = 'gamma',\r\n Theta = 'theta',\r\n Vega = 'vega',\r\n Rho = 'rho',\r\n}\r\n\r\nexport enum RowKind {\r\n OptionRow, // Base row which includes both call and put. Used to render strike price\r\n Call,\r\n Put,\r\n}\r\n\r\ninterface OptionRowKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.OptionRow\r\n row: OptionRow\r\n}\r\n\r\nexport interface CallKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Call\r\n row: Option\r\n}\r\n\r\ninterface PutKind {\r\n ticker?: string\r\n lastClose?: number | null\r\n kind: RowKind.Put\r\n row: Option\r\n}\r\n\r\nexport type ColumnRendererProps = CallKind | PutKind | OptionRowKind\r\n\r\nexport interface TableColumnDefinition extends SortableColumn {\r\n name: string\r\n align?: TableAlign\r\n className?: string\r\n renderColumn: (props: ColumnRendererProps) => React.ReactNode\r\n}\r\n\r\nexport type MappedSubpageOrders = { [key in OptionsSubpage]?: string }\r\n","import { formatDate } from '../../../../app/header/utils'\r\nimport { DATE_FORMAT_DB, DATE_FORMAT_INT, LINK_COLUMN_NAME } from '../constants/common'\r\nimport { ColumnId, MappedSubpageOrders, Option, OptionRow, OptionsQuery, OptionsSubpage, OptionsView } from '../types'\r\n\r\nconst DELIMITER = '|'\r\n\r\nfunction parseOrder(input: string | null): MappedSubpageOrders {\r\n if (!input) return {}\r\n const parts = input.split(DELIMITER)\r\n let pricesOrder, volatilityOrder\r\n if (parts.length === 1) pricesOrder = volatilityOrder = parts[0]\r\n else [pricesOrder, volatilityOrder] = parts\r\n return {\r\n [OptionsSubpage.Prices]: pricesOrder,\r\n [OptionsSubpage.Volatility]: volatilityOrder,\r\n }\r\n}\r\n\r\nexport function orderToString(obj: MappedSubpageOrders): string {\r\n const arr = [obj[OptionsSubpage.Prices], obj[OptionsSubpage.Volatility]]\r\n return arr.join(DELIMITER)\r\n}\r\n\r\nexport type OptionsParsedQuery = ReturnType\r\n\r\nexport function parseOptionsQuery(query: URLSearchParams) {\r\n const strike = Number(query.get(OptionsQuery.Strike))\r\n\r\n return {\r\n params: Object.fromEntries(query.entries()) as Record, // Re-export the original query as key/val\r\n ticker: query.get(OptionsQuery.Ticker)!, // Validated on BE\r\n expiry: query.get(OptionsQuery.Expiry),\r\n order: parseOrder(query.get(OptionsQuery.Order)),\r\n strike: Number.isFinite(strike) ? strike : null,\r\n view: (query.get(OptionsQuery.View) as OptionsView) ?? OptionsView.ChainByDate,\r\n type: query.get(OptionsQuery.Type) as OptionsSubpage,\r\n }\r\n}\r\n\r\nexport function evalLinkOrder(order: string, linkAlias: string) {\r\n if (!linkAlias) return order\r\n if (order === LINK_COLUMN_NAME) return linkAlias\r\n if (order === `-${LINK_COLUMN_NAME}`) return `-${linkAlias}`\r\n return order\r\n}\r\n\r\nexport function getViewLink(columnId: ColumnId, searchParams: URLSearchParams, option: Option | OptionRow) {\r\n const middleLink = new URLSearchParams(searchParams)\r\n\r\n switch (searchParams.get(OptionsQuery.View)) {\r\n case OptionsView.ChainByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByDate)\r\n break\r\n case OptionsView.ListByDate:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByStrike)\r\n break\r\n case OptionsView.ListByStrike:\r\n middleLink.set(OptionsQuery.View, OptionsView.ListByDate)\r\n break\r\n case OptionsView.ChainByDate:\r\n default:\r\n middleLink.set(OptionsQuery.View, OptionsView.ChainByStrike)\r\n }\r\n\r\n if (columnId === ColumnId.ExpirationDate) {\r\n middleLink.delete(OptionsQuery.Strike)\r\n middleLink.set(OptionsQuery.Expiry, formatDate(option.exDate, DATE_FORMAT_INT, DATE_FORMAT_DB))\r\n } else {\r\n middleLink.delete(OptionsQuery.Expiry)\r\n middleLink.set(OptionsQuery.Strike, option.strike.toString())\r\n }\r\n\r\n return middleLink\r\n}\r\n","import classNames from 'classnames'\r\nimport { isRedesignEnabled } from 'finviz-charts/app/utils'\r\nimport * as React from 'react'\r\n\r\ninterface Props extends React.HTMLProps {\r\n leftContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function SubMenu({ leftContent, rightContent, ...props }: Props) {\r\n return (\r\n
\r\n
\r\n \r\n {leftContent}\r\n
\r\n
{rightContent}
\r\n
\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { SubMenu } from '../../../components/SubMenu/SubMenu'\r\n\r\ninterface Props {\r\n leftContent?: React.ReactNode\r\n rightContent?: React.ReactNode\r\n}\r\n\r\nexport function QuoteStickySubMenu({ leftContent, rightContent }: Props) {\r\n return \r\n}\r\n","export const FONT_SIZE = {\r\n XXS: 5,\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n L: 11,\r\n XXL: 18,\r\n XXXL: 23,\r\n}\r\nexport const LINE_HEIGHT = {\r\n XS: 7,\r\n S: 8,\r\n M: 10,\r\n}\r\nexport const PADDING = {\r\n XXXS: 1,\r\n XXS: 2,\r\n XS: 3,\r\n S: 5,\r\n}\r\nexport const MARGIN = {\r\n XS: 4,\r\n}\r\nexport const CHART_MARGIN = {\r\n S: 15,\r\n M: 30,\r\n L: 35,\r\n XL: 38,\r\n XXL: 48,\r\n}\r\nexport const SETTINGS_HEIGHT = 44\r\nexport const TICKER_TIMEFRAME_CHANGE_HEIGHT = 20\r\nexport const OFFSET = {\r\n XXS: 2,\r\n XS: 4,\r\n S: 6,\r\n M: 8,\r\n XXL: 20,\r\n}\r\nexport const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']\r\n\r\nexport enum ChartEditorEnum {\r\n publish = 'publish',\r\n tools = 'tools',\r\n ideas = 'ideas',\r\n settings = 'settings',\r\n timeframe = 'timeframe',\r\n}\r\n\r\nexport enum LayoutType {\r\n '1h1v' = '1h1v',\r\n '1h2v' = '1h2v',\r\n '1h3v' = '1h3v',\r\n '2h1v' = '2h1v',\r\n '2h2v' = '2h2v',\r\n '3h1v' = '3h1v',\r\n '3h2v' = '3h2v',\r\n '1l2r' = '1l2r',\r\n '1t2b' = '1t2b',\r\n}\r\n\r\nexport enum CanvasElementType {\r\n element = 'canvas/element',\r\n arrow = 'canvas/arrow',\r\n brushV1 = 'canvas/brush/brush_v1',\r\n curve = 'canvas/curve',\r\n ellipse = 'canvas/ellipse',\r\n fibonacciRetracements = 'canvas/fibonacci_retracements',\r\n horizontalLine = 'canvas/horizontal_line',\r\n line = 'canvas/line',\r\n measure = 'canvas/measure',\r\n pitchforkV1 = 'canvas/pitchfork/pitchfork_v1',\r\n polygon = 'canvas/polygon',\r\n position = 'canvas/position',\r\n rectangle = 'canvas/rectangle',\r\n rotatedRectangle = 'canvas/rotated_rectangle',\r\n scaledLine = 'canvas/scaled_line',\r\n scaledText = 'canvas/scaled_text',\r\n symbol = 'canvas/symbol',\r\n text = 'canvas/text',\r\n triangle = 'canvas/triangle',\r\n verticalLine = 'canvas/vertical_line',\r\n xabcd = 'canvas/xabcd',\r\n calloutV1 = 'canvas/callout/callout_v1',\r\n elliottWaves = 'canvas/elliott_waves/elliott_waves',\r\n ellipseV1 = 'canvas/ellipse/ellipse_v1',\r\n rotatedRectangleV1 = 'canvas/rotated_rectangle/rotated_rectangle_v1',\r\n}\r\n\r\nexport enum ChartElementType {\r\n CandleStick = 'charts/candle_stick',\r\n HeikinAshi = 'charts/heikin_ashi',\r\n HollowCandleStick = 'charts/candle_stick_hollow',\r\n LineChart = 'charts/line_chart',\r\n OhlcChart = 'charts/ohlc_chart',\r\n MarketSentiment = 'charts/market_sentiment',\r\n MultiLineChart = 'charts/multi_line_chart',\r\n PerfChart = 'charts/perf_chart',\r\n}\r\n\r\nexport enum IndicatorType {\r\n Indicator = 'indicators/indicator',\r\n None = 'indicators/none',\r\n Adx = 'indicators/adx',\r\n Aro = 'indicators/aro',\r\n Aroosc = 'indicators/aroosc',\r\n Atr = 'indicators/atr',\r\n Cci = 'indicators/cci',\r\n Cot = 'indicators/cot',\r\n Fi = 'indicators/fi',\r\n Macd = 'indicators/macd',\r\n Mfi = 'indicators/mfi',\r\n Obv = 'indicators/obv',\r\n Perf = 'indicators/perf',\r\n Rmi = 'indicators/rmi',\r\n Roc = 'indicators/roc',\r\n Rsi = 'indicators/rsi',\r\n Rvol = 'indicators/rvol',\r\n Rwi = 'indicators/rwi',\r\n Stofa = 'indicators/stofa',\r\n Stofu = 'indicators/stofu',\r\n Stosl = 'indicators/stosl',\r\n Trix = 'indicators/trix',\r\n Ult = 'indicators/ult',\r\n Vol = 'indicators/vol',\r\n Wr = 'indicators/wr',\r\n Shrtfl = 'indicators/shrtfl',\r\n Shrtra = 'indicators/shrtra',\r\n}\r\n\r\nexport enum OverlayType {\r\n Overlay = 'overlays/overlay',\r\n None = 'overlays/none',\r\n Bb = 'overlays/bb',\r\n Dch = 'overlays/dch',\r\n Ema = 'overlays/ema',\r\n Ema2 = 'overlays/ema2',\r\n Hilo = 'overlays/hilo',\r\n Hline = 'overlays/hline',\r\n Ic = 'overlays/ic',\r\n Icf = 'overlays/icf',\r\n Kch = 'overlays/kch',\r\n Patterns = 'overlays/patterns',\r\n Pp = 'overlays/pp',\r\n Sar = 'overlays/sar',\r\n Sma = 'overlays/sma',\r\n Sma2 = 'overlays/sma2',\r\n Str = 'overlays/str',\r\n Vp = 'overlays/vp',\r\n Vwap = 'overlays/vwap',\r\n}\r\n\r\nexport enum ChartEventDbType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventType {\r\n ChartEvent = 'chartEvent/chartEvent',\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n Earnings = 'chartEvent/earnings',\r\n}\r\n\r\nexport enum ChartEventBadgeType {\r\n Dividends = 'chartEvent/dividends',\r\n Split = 'chartEvent/split',\r\n EarningsPositive = 'chartEvent/earnings',\r\n EarningsNegative = 'chartEvent/earningsNegative',\r\n EarningsNeutral = 'chartEvent/earningsNeutral',\r\n EarningsFuture = 'chartEvent/earningsFuture',\r\n}\r\n\r\nexport const ChartEventLabels: Record = {\r\n [ChartEventBadgeType.Dividends]: 'Dividends',\r\n [ChartEventBadgeType.Split]: 'Split',\r\n [ChartEventBadgeType.EarningsPositive]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNegative]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsNeutral]: 'Earnings & Revenue',\r\n [ChartEventBadgeType.EarningsFuture]: 'Earnings & Revenue',\r\n}\r\n\r\ninterface LayoutRule {\r\n columns: number\r\n rows: number\r\n count: number\r\n gridAreas?: string[]\r\n}\r\n\r\nexport const LAYOUTS: Record = {\r\n '1h1v': { columns: 1, rows: 1, count: 1 },\r\n '1h2v': { columns: 1, rows: 2, count: 2 },\r\n '1h3v': { columns: 1, rows: 3, count: 3 },\r\n '2h1v': { columns: 2, rows: 1, count: 2 },\r\n '2h2v': { columns: 2, rows: 2, count: 4 },\r\n '3h1v': { columns: 3, rows: 1, count: 3 },\r\n '3h2v': { columns: 3, rows: 2, count: 6 },\r\n '1l2r': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 3 / 2', '1 / 2 / 2 / 3', '2 / 2 / 3 / 3'],\r\n },\r\n '1t2b': {\r\n columns: 2,\r\n rows: 2,\r\n count: 3,\r\n gridAreas: ['1 / 1 / 2 / 3', '2 / 1 / 3 / 2', '2 / 2 / 3 / 3'],\r\n },\r\n}\r\n\r\nexport const SORT_DIRECTION = {\r\n ASC: 'ASC',\r\n DESC: 'DESC',\r\n}\r\n\r\nexport const ICON_SIZE = {\r\n L: 32,\r\n}\r\n\r\n// Keep in sync with the copy in Website repo - Website/js/main/constants.ts\r\nexport enum TIMEFRAME {\r\n i1 = 'i1',\r\n i2 = 'i2',\r\n i3 = 'i3',\r\n i5 = 'i5',\r\n i10 = 'i10',\r\n i15 = 'i15',\r\n i30 = 'i30',\r\n h = 'h',\r\n h2 = 'h2',\r\n h4 = 'h4',\r\n d = 'd',\r\n w = 'w',\r\n m = 'm',\r\n}\r\n\r\nexport type TimeframeAndIntradayType = TIMEFRAME | 'intraday'\r\n\r\nexport const TIMEFRAMES_WITH_PRE_MARKET = [TIMEFRAME.i1, TIMEFRAME.i2, TIMEFRAME.i3, TIMEFRAME.i5]\r\n\r\nexport const IntradayTimeframeInterval = {\r\n [TIMEFRAME.i1]: 1,\r\n [TIMEFRAME.i2]: 2,\r\n [TIMEFRAME.i3]: 3,\r\n [TIMEFRAME.i5]: 5,\r\n [TIMEFRAME.i10]: 10,\r\n [TIMEFRAME.i15]: 15,\r\n [TIMEFRAME.i30]: 30,\r\n [TIMEFRAME.h]: 60,\r\n [TIMEFRAME.h2]: 120,\r\n [TIMEFRAME.h4]: 240,\r\n}\r\n\r\nexport const TimeframeLabelShort = {\r\n [TIMEFRAME.i1]: '1M',\r\n [TIMEFRAME.i2]: '2M',\r\n [TIMEFRAME.i3]: '3M',\r\n [TIMEFRAME.i5]: '5M',\r\n [TIMEFRAME.i10]: '10M',\r\n [TIMEFRAME.i15]: '15M',\r\n [TIMEFRAME.i30]: '30M',\r\n [TIMEFRAME.h]: '1H',\r\n [TIMEFRAME.h2]: '2H',\r\n [TIMEFRAME.h4]: '4H',\r\n [TIMEFRAME.d]: 'D',\r\n [TIMEFRAME.w]: 'W',\r\n [TIMEFRAME.m]: 'M',\r\n}\r\n\r\nexport enum DateRangeType {\r\n d1 = 'd1',\r\n d5 = 'd5',\r\n m1 = 'm1',\r\n m3 = 'm3',\r\n m6 = 'm6',\r\n ytd = 'ytd',\r\n y1 = 'y1',\r\n y2 = 'y2',\r\n y5 = 'y5',\r\n max = 'max',\r\n}\r\n\r\nexport enum QuoteFinancialAttachment {\r\n shortInterest = 'shortInterest',\r\n}\r\n\r\nexport const TIMEFRAME_SECONDS = {\r\n [TIMEFRAME.i1]: 60,\r\n [TIMEFRAME.i2]: 120,\r\n [TIMEFRAME.i3]: 180,\r\n [TIMEFRAME.i5]: 300,\r\n [TIMEFRAME.i10]: 600,\r\n [TIMEFRAME.i15]: 900,\r\n [TIMEFRAME.i30]: 1800,\r\n [TIMEFRAME.h]: 3600,\r\n [TIMEFRAME.h2]: 7200,\r\n [TIMEFRAME.h4]: 14400,\r\n [TIMEFRAME.d]: 86400,\r\n [TIMEFRAME.w]: 604800,\r\n [TIMEFRAME.m]: 2592000,\r\n}\r\n\r\nexport const CRYPTOS = {\r\n BTCUSD: 'BTCUSD',\r\n LTCUSD: 'LTCUSD',\r\n ETHUSD: 'ETHUSD',\r\n XRPUSD: 'XRPUSD',\r\n BCHUSD: 'BCHUSD',\r\n BTCEUR: 'BTCEUR',\r\n LTCEUR: 'LTCEUR',\r\n ETHEUR: 'ETHEUR',\r\n XRPEUR: 'XRPEUR',\r\n BCHEUR: 'BCHEUR',\r\n LTCBTC: 'LTCBTC',\r\n ETHBTC: 'ETHBTC',\r\n XRPBTC: 'XRPBTC',\r\n BCHBTC: 'BCHBTC',\r\n}\r\n\r\nexport enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\r\n quoteFinancials = 'quoteFinancials',\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\nexport enum TextAlign {\r\n left = 'left',\r\n right = 'right',\r\n center = 'center',\r\n start = 'start',\r\n end = 'end',\r\n}\r\n\r\nexport enum TextBaseline {\r\n top = 'top',\r\n hanging_dont_use = 'hanging', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n middle = 'middle',\r\n alphabetic = 'alphabetic',\r\n ideographic_dont_use = 'ideographic', // not supported - https://github.com/Automattic/node-canvas/wiki/Compatibility-Status#text-styles\r\n bottom = 'bottom',\r\n}\r\n\r\nexport enum ScaleType {\r\n Linear = 'linear',\r\n Percentage = 'percentage',\r\n Logarithmic = 'logarithmic',\r\n}\r\n\r\nexport enum QuotePollingIntervalInMs {\r\n Default = 2000,\r\n Free = 180000,\r\n Elite = Default,\r\n EliteStocksReduced = 60000,\r\n}\r\n\r\nexport const EXTRA_MARKET_BUFFER_MINUTES = 30\r\n\r\nexport const ScaleLabel = {\r\n [ScaleType.Linear]: 'Linear',\r\n [ScaleType.Percentage]: 'Percentage',\r\n [ScaleType.Logarithmic]: 'Logarithmic',\r\n}\r\n\r\nexport const PANE_HEIGHT_DEFAULT = {\r\n chart: 400,\r\n indicator: 120,\r\n}\r\n\r\nexport const INDICATOR_LABEL_HEIGHT = 24\r\n\r\nexport const MOBILE_BARS_TO_VIEW = 150 // 5 months of daily bars\r\n\r\nexport const MOBILE_VIEW_BREAKPOINT_WIDTH = 768\r\n\r\nexport const FREE_DATE_RANGES = ['m1', 'm3', 'm6', 'ytd', 'y1', 'y2', 'y5', 'max']\r\n\r\nexport const getTimeframeLabel = (timeframe: string) => {\r\n switch (timeframe) {\r\n case TIMEFRAME.i1:\r\n return '1 MIN'\r\n case TIMEFRAME.i2:\r\n return '2 MIN'\r\n case TIMEFRAME.i3:\r\n return '3 MIN'\r\n case TIMEFRAME.i5:\r\n return '5 MIN'\r\n case TIMEFRAME.i10:\r\n return '10 MIN'\r\n case TIMEFRAME.i15:\r\n return '15 MIN'\r\n case TIMEFRAME.i30:\r\n return '30 MIN'\r\n case TIMEFRAME.h:\r\n return '1 HR'\r\n case TIMEFRAME.h2:\r\n return '2 HR'\r\n case TIMEFRAME.h4:\r\n return '4 HR'\r\n case TIMEFRAME.d:\r\n return 'DAILY'\r\n case TIMEFRAME.w:\r\n return 'WEEKLY'\r\n case TIMEFRAME.m:\r\n return 'MONTHLY'\r\n default:\r\n return ''\r\n }\r\n}\r\n\r\nexport type ChartsPageQueryParams = {\r\n p: string\r\n t: string\r\n l: string\r\n r?: string\r\n i?: string\r\n sidebar?: string\r\n}\r\n\r\nexport type QuotePageQueryParams = {\r\n p?: string\r\n t: string\r\n r?: string\r\n i?: string\r\n ty?: QuotePageQueryChartTypes\r\n}\r\n\r\nexport enum QuotePageQueryChartTypes {\r\n l = 'l',\r\n c = 'c',\r\n cs = 'cs',\r\n hc = 'hc',\r\n ha = 'ha',\r\n o = 'o',\r\n p = 'p',\r\n}\r\n\r\nexport type ChartsOrQuotePageQueryParams = ChartsPageQueryParams | QuotePageQueryParams\r\n\r\nexport enum MacroTimeframe {\r\n // seconds = 'seconds',\r\n minutes = 'minutes',\r\n hours = 'hours',\r\n days = 'days',\r\n weeks = 'weeks',\r\n months = 'months',\r\n}\r\n\r\nexport const MicroMacroTimeframe = {\r\n [TIMEFRAME.i1]: {\r\n micro: 1,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i3]: {\r\n micro: 3,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i5]: {\r\n micro: 5,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i10]: {\r\n micro: 10,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i15]: {\r\n micro: 15,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.i30]: {\r\n micro: 30,\r\n macro: MacroTimeframe.minutes,\r\n },\r\n [TIMEFRAME.h]: {\r\n micro: 1,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h2]: {\r\n micro: 2,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.h4]: {\r\n micro: 4,\r\n macro: MacroTimeframe.hours,\r\n },\r\n [TIMEFRAME.d]: {\r\n micro: 1,\r\n macro: MacroTimeframe.days,\r\n },\r\n [TIMEFRAME.w]: {\r\n micro: 1,\r\n macro: MacroTimeframe.weeks,\r\n },\r\n [TIMEFRAME.m]: {\r\n micro: 1,\r\n macro: MacroTimeframe.months,\r\n },\r\n}\r\n\r\nexport const MicroTimeframeRange = (Object.keys(MicroMacroTimeframe) as TIMEFRAME[]).reduce(\r\n (prev, curr) => ({\r\n ...prev,\r\n [MicroMacroTimeframe[curr].macro]: prev[MicroMacroTimeframe[curr].macro]\r\n ? [...prev[MicroMacroTimeframe[curr].macro], MicroMacroTimeframe[curr].micro]\r\n : [MicroMacroTimeframe[curr].micro],\r\n }),\r\n {} as { [key in MacroTimeframe]: number[] }\r\n)\r\n\r\ntype IRange = {\r\n from?: number\r\n to?: number\r\n}\r\n\r\nexport type IVisibility = {\r\n [key in MacroTimeframe]?: IRange\r\n}\r\n\r\nexport enum SetVisibilityTo {\r\n currentAndAbove,\r\n currentAndBelow,\r\n currentOnly,\r\n all,\r\n}\r\n\r\nexport const QUOTE_FETCH_EVENT = 'quoteFetchEvent'\r\n\r\n// Keep in sync with the clone in Website repo in shared/is-stock-fast-refresh-available.ts\r\nexport const PREMARKET_AFTERMARKET_HOURS = 2.5\r\n\r\nexport const CHART_ELEMENT_ID = 'chart'\r\n\r\nexport const CHART_SETTINGS_DIALOG_TEST_ID = 'chart-settings-dialog'\r\n","import {\r\n MOBILE_VIEW_BREAKPOINT_WIDTH,\r\n PREMARKET_AFTERMARKET_HOURS,\r\n SpecificChartFunctionality,\r\n} from './constants/common'\r\nimport { captureException, getIsSSr } from './utils/helpers'\r\n\r\nexport { getSanitizedTicker } from './utils/ticker-sanitizer'\r\n\r\nfunction getIsDstInNy(date: Date) {\r\n const dayNumber = date.getDate()\r\n const monthIndex = date.getMonth()\r\n const dayOfWeek = date.getDay()\r\n const previousSunday = dayNumber - dayOfWeek\r\n if (monthIndex < 2 || monthIndex > 10) {\r\n return false\r\n }\r\n if (monthIndex > 2 && monthIndex < 10) {\r\n return true\r\n }\r\n return monthIndex === 2 ? previousSunday >= 8 : previousSunday <= 0\r\n}\r\n\r\nclass Utils {\r\n static min(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] < +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let min = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el < min) {\r\n min = el\r\n }\r\n }\r\n }\r\n return min\r\n }\r\n\r\n static max(...args: T[]): number {\r\n if (typeof args[0] === 'number') {\r\n return args[0] > +args[1] ? args[0] : (args[1] as number)\r\n }\r\n let max = args[0][0]\r\n for (const arg of args) {\r\n for (const el of arg as number[]) {\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return max\r\n }\r\n\r\n static minMax(...args: number[][]) {\r\n let max\r\n let min = (max = args[0][0] as number)\r\n for (const arg of args) {\r\n for (const el of arg) {\r\n if (el < min) {\r\n min = el\r\n }\r\n if (el > max) {\r\n max = el\r\n }\r\n }\r\n }\r\n return [min, max]\r\n }\r\n\r\n static getScaleRatio() {\r\n return (typeof window !== 'undefined' && window.devicePixelRatio) || 1\r\n }\r\n\r\n static setSizeOnCanvasElement({\r\n canvasElement,\r\n width,\r\n height,\r\n ratio = Utils.getScaleRatio(),\r\n }: {\r\n canvasElement: HTMLCanvasElement | null\r\n width: number\r\n height: number\r\n ratio?: number\r\n }) {\r\n if (canvasElement) {\r\n canvasElement.width = width * ratio\r\n canvasElement.height = height * ratio\r\n canvasElement.style.width = width + 'px'\r\n canvasElement.style.height = height + 'px'\r\n }\r\n }\r\n\r\n static getQuoteDateTimestampOffsetInSeconds(referenceDate?: Date) {\r\n const date = referenceDate || new Date()\r\n const dateAsNY = new Date(\r\n date.getUTCFullYear(),\r\n date.getUTCMonth(),\r\n date.getUTCDate(),\r\n date.getUTCHours() - 5,\r\n date.getUTCMinutes(),\r\n date.getUTCSeconds()\r\n )\r\n const isDst = getIsDstInNy(dateAsNY)\r\n return (isDst ? 4 : 5) * 60 * 60\r\n }\r\n\r\n static convertLocalToNyTime(referenceDate: Date, addOffset: boolean) {\r\n const date = new Date(referenceDate)\r\n const quoteDateTimeOffsetInMs = Utils.getQuoteDateTimestampOffsetInSeconds(date) * 1000\r\n const localTimeOffsetInMs = date.getTimezoneOffset() * 60 * 1000\r\n const offsetDirectionCoefficient = addOffset ? 1 : -1\r\n date.setTime(date.getTime() + (localTimeOffsetInMs - quoteDateTimeOffsetInMs) * offsetDirectionCoefficient)\r\n return date\r\n }\r\n\r\n // Keep in sync with the clone in Website repo in shared/isStockFastRefreshAvailable.ts\r\n static isStockFastRefreshAvailable(hasPremarket = true, hasAftermarket = true, bufferMinutes = 30) {\r\n const MARKET_START = { hours: 9, minutes: 30 }\r\n const MARKET_END = { hours: 16, minutes: 0 }\r\n const getMinutes = ({ hours, minutes }: { hours: number; minutes: number }) => hours * 60 + minutes\r\n\r\n const date = convertLocalToNyTime(new Date(), true)\r\n const dayOfWeek = date.getDay()\r\n const currentDayMinutes = date.getHours() * 60 + date.getMinutes()\r\n\r\n const premarketMinutes = hasPremarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n const aftermarketMinutes = hasAftermarket ? PREMARKET_AFTERMARKET_HOURS * 60 : 0\r\n\r\n const isWeekend = dayOfWeek === 0 || dayOfWeek === 6\r\n const isOpen = getMinutes(MARKET_START) - premarketMinutes - bufferMinutes <= currentDayMinutes\r\n const isClosed = getMinutes(MARKET_END) + aftermarketMinutes + bufferMinutes <= currentDayMinutes\r\n return !isWeekend && isOpen && !isClosed\r\n }\r\n\r\n static dateFromUnixTimestamp(timestamp: number) {\r\n /*\r\n * Passing 0 as a param is needed in order to setUTCSeconds work properly.\r\n * The function adds seconds to the date instance if it exceeds 60.\r\n * For more info see the docs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds\r\n * */\r\n const date = new Date(0)\r\n date.setUTCSeconds(timestamp)\r\n return Utils.convertLocalToNyTime(date, true)\r\n }\r\n\r\n static dateStringFromDate(date: Date) {\r\n return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(\r\n 2,\r\n '0'\r\n )}`\r\n }\r\n\r\n static dateFromDateString(dateString: string) {\r\n const [yyyy, mm, dd] = dateString.split('-')\r\n\r\n const date = new Date(Number.parseInt(yyyy), Number.parseInt(mm) - 1, Number.parseInt(dd))\r\n if (Number.isNaN(date.getTime())) {\r\n captureException(new Error('Invalid Date'), { extra: { date, dateString } })\r\n }\r\n\r\n return date\r\n }\r\n\r\n static isMobile(testTouchPoints?: boolean) {\r\n if (getIsSSr()) return false\r\n let isMobileOs = false\r\n\r\n // New iOS versions no longer report iPad in user agent\r\n if (navigator.userAgent.indexOf('Macintosh') > -1) {\r\n try {\r\n document.createEvent('TouchEvent')\r\n isMobileOs = true\r\n } catch {}\r\n } else {\r\n isMobileOs = !!navigator.userAgent.match(\r\n /\\b(Android|webOS|i(?:Phone|Pad|Pod)|BlackBerry|Windows (?:Phone|Mobile))\\b/i\r\n )\r\n }\r\n\r\n if (testTouchPoints) {\r\n try {\r\n return (\r\n isMobileOs &&\r\n (window.navigator.msMaxTouchPoints ||\r\n window.navigator.maxTouchPoints ||\r\n 'ontouchstart' in document.createElement('div'))\r\n )\r\n } catch {}\r\n }\r\n\r\n return isMobileOs\r\n }\r\n\r\n static isIPad() {\r\n const matchesIPad = navigator.userAgent.match(/iPad/i)\r\n const matchesIPhone = navigator.userAgent.match(/iPhone/i)\r\n const matchesIPod = navigator.userAgent.match(/iPod/i)\r\n const matchesIOSLike = navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints > 0\r\n\r\n return (matchesIOSLike && !matchesIPhone && !matchesIPod) || matchesIPad\r\n }\r\n\r\n static getCookie(name: string) {\r\n const re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n }\r\n\r\n static setCookie(name: string, value: string, expires: Date) {\r\n let cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (document.location.hostname !== 'localhost') {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n }\r\n}\r\n\r\nexport default Utils\r\nexport const convertLocalToNyTime = Utils.convertLocalToNyTime\r\nexport const dateFromUnixTimestamp = Utils.dateFromUnixTimestamp\r\nexport const dateStringFromDate = Utils.dateStringFromDate\r\nexport const dateFromDateString = Utils.dateFromDateString\r\n\r\nexport function getFullscreenStatus(): boolean {\r\n return (\r\n document.fullscreenElement ??\r\n document.webkitFullscreenElement ??\r\n document.mozFullScreenElement ??\r\n document.msFullscreenElement ??\r\n false\r\n )\r\n}\r\n\r\nexport function getRequestFullscreen(element: HTMLElement) {\r\n return (\r\n element.requestFullscreen ??\r\n element.webkitRequestFullScreen ??\r\n element.mozRequestFullScreen ??\r\n element.msRequestFullscreen\r\n )\r\n}\r\n\r\nexport function getExitFullscreen() {\r\n return (\r\n document.exitFullscreen ?? document.webkitExitFullscreen ?? document.mozExitFullScreen ?? document.msExitFullscreen\r\n )\r\n}\r\n\r\nexport function ready(fn: () => void) {\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\r\nexport function getChartsDimensions(chartElementId: string) {\r\n const PADDING = 2 // Border widths\r\n const containerElement = document.getElementById(chartElementId)\r\n\r\n const box = containerElement?.getBoundingClientRect()\r\n\r\n return {\r\n width: Math.max((box?.width ?? 0) - PADDING, 0),\r\n height: Math.max((box?.height ?? 0) - PADDING, 0),\r\n }\r\n}\r\n\r\nexport function getIsMobileScreenSize() {\r\n return window.innerWidth < MOBILE_VIEW_BREAKPOINT_WIDTH\r\n}\r\n\r\nexport function getIsMobilePortrait(isMobile?: boolean) {\r\n if (isMobile ?? Utils.isMobile()) {\r\n return window.orientation % 180 === 0\r\n }\r\n return false\r\n}\r\n\r\nexport function numberToStringWithUnitsSuffix(value: number) {\r\n let suffix = ''\r\n if (value >= 1000000000) {\r\n value /= 1000000000\r\n suffix = 'B'\r\n } else if (value >= 1000000) {\r\n value /= 1000000\r\n suffix = 'M'\r\n } else if (value >= 1000) {\r\n value /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n return value.toFixed(2) + suffix\r\n}\r\n\r\nexport function isRedesignEnabled() {\r\n return typeof window !== 'undefined' && window.FinvizSettings?.hasRedesignEnabled\r\n}\r\n\r\nexport function isRedesignedPage(\r\n obj: { specificChartFunctionality?: SpecificChartFunctionality | null },\r\n matchingPages = [\r\n SpecificChartFunctionality.forexPage,\r\n SpecificChartFunctionality.futuresPage,\r\n SpecificChartFunctionality.cryptoPage,\r\n ]\r\n) {\r\n const isQuotePage = obj.specificChartFunctionality === SpecificChartFunctionality.quotePage\r\n const isQuoteFinancials = obj.specificChartFunctionality === SpecificChartFunctionality.quoteFinancials\r\n\r\n return (\r\n (isRedesignEnabled() && matchingPages.includes(obj.specificChartFunctionality!)) ||\r\n // Legacy design on quote uses redesigned elements (page header + chart controls)\r\n isQuotePage ||\r\n isQuoteFinancials\r\n )\r\n}\r\n","import { EmptyObject, ObjectHash } from '../../types/shared'\r\n\r\nexport function getRoundedString({ number, numOfDecimalPlaces }: { number: number; numOfDecimalPlaces: number }) {\r\n const precision = Math.pow(10, numOfDecimalPlaces)\r\n return String(Math.round(number * precision) / precision)\r\n}\r\n\r\nexport function getIsSSr() {\r\n return typeof process !== 'undefined' && !!process?.env.IS_OFFSCREEN_RENDERER\r\n}\r\n\r\nexport function isValidHexColor(color: string) {\r\n const regex = /^#([\\da-f]{3}){1,2}$|^#([\\da-f]{4}){1,2}$/i\r\n return !!color && regex.test(color)\r\n}\r\n\r\nexport function getParsedIntegersFromPeriodString(periodString: string) {\r\n const periodParts = periodString.split(',')\r\n return periodParts.map((part) => Number.parseInt(part, 10))\r\n}\r\n\r\nexport function captureException(exception: Error, captureContext?: { extra: ObjectHash }) {\r\n if (process.env.NODE_ENV === 'development' || process.env.IS_E2E_TESTING) {\r\n console.error(exception)\r\n } else if (process.env.IS_OFFSCREEN_RENDERER) {\r\n import('@sentry/node').then((client) => {\r\n client.captureException(exception, captureContext)\r\n })\r\n } else {\r\n window.Sentry.captureException(exception, captureContext)\r\n }\r\n}\r\n\r\nexport function isPositiveFloat(value: string | number) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && isFinite(parsedNumber) && parsedNumber > 0\r\n}\r\n\r\nexport function isPositiveInteger(value: string | number) {\r\n const string = `${value}`\r\n return isPositiveFloat(value) && Number.parseInt(string, 10) === Number.parseFloat(string)\r\n}\r\n\r\nexport function isInRange({\r\n value,\r\n min = Number.MIN_SAFE_INTEGER,\r\n max = Number.MAX_SAFE_INTEGER,\r\n}: {\r\n value: string | number\r\n min?: number\r\n max?: number\r\n}) {\r\n const parsedNumber = Number.parseFloat(`${value}`)\r\n return !Number.isNaN(parsedNumber) && parsedNumber >= min && parsedNumber <= max\r\n}\r\n\r\nexport function tryJsonParse(json: string | null = '') {\r\n try {\r\n return JSON.parse(json ?? '') as Result\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\nexport function getValueInRange({ value, min, max }: { value: number; min: number; max: number }) {\r\n return Math.min(Math.max(value, min), max)\r\n}\r\n\r\nexport function isPrimaryClick(e: React.Touch | React.TouchEvent | React.MouseEvent) {\r\n // cypress trigger mouseevent has button: undefined if button option isn't explicitly specified\r\n // as cy.get('.target').trigger('mousedown', { button: 0 })\r\n if (e.hasOwnProperty('button') && (e as unknown as MouseEvent).button !== undefined) {\r\n return (e as unknown as MouseEvent).button === 0\r\n } else {\r\n return true\r\n }\r\n}\r\n\r\n// this function is used to fix the issue with circular reference when stringifying an object using JSON.stringify\r\nexport function getJSONReplacerFunc() {\r\n const visited = new WeakSet()\r\n return (key: string, value: any) => {\r\n if (typeof value === 'object' && value !== null) {\r\n if (visited.has(value)) {\r\n return\r\n }\r\n visited.add(value)\r\n }\r\n return value\r\n }\r\n}\r\n\r\n// This is a duplicate from Website repo which is accessible on window.FLibs but this doesn't work on SSR charts\r\nexport const formatDateToStringUS = (date: Date, options?: Intl.DateTimeFormatOptions | undefined) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n ...options,\r\n })\r\n\r\n// randomUUID source: https://stackoverflow.com/questions/105034/how-do-i-create-a-guid-uuid/2117523#2117523\r\nexport function randomUUID() {\r\n return `${1e7}-${1e3}-${4e3}-${8e3}-${1e11}`.replace(/[018]/g, (substring) => {\r\n const c = Number(substring)\r\n return (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)\r\n })\r\n}\r\n\r\nexport function getUuid() {\r\n return window.crypto?.randomUUID?.() ?? randomUUID()\r\n}\r\n\r\n// duplicate from Website/js/main/util.ts, to be refactored\r\nexport function getEarningsDateSuffix(date: Date) {\r\n const hours = date.getHours()\r\n\r\n if (hours <= 9) {\r\n return 'BMO'\r\n } else if (hours >= 16) {\r\n return 'AMC'\r\n }\r\n\r\n return ''\r\n}\r\n\r\nexport function isValidTickerString(ticker: string) {\r\n const regex = /^@?[a-z0-9](?:[a-z0-9]*[-_]?[a-z0-9]+)?$/\r\n return regex.test(ticker.toLowerCase())\r\n}\r\n","'use strict';\nvar $ = require('../internals/export');\nvar $findLastIndex = require('../internals/array-iteration-from-last').findLastIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// `Array.prototype.findLastIndex` method\n// https://tc39.es/ecma262/#sec-array.prototype.findlastindex\n$({ target: 'Array', proto: true }, {\n findLastIndex: function findLastIndex(callbackfn /* , that = undefined */) {\n return $findLastIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\naddToUnscopables('findLastIndex');\n"],"names":["AdsProvider","getAdsProvider","FinvizSettings","hasUserPremium","None","adsProvider","Freestar","InvestingChannel","trackPageView","props","_window$gtag","_window","_window$gtag2","_window2","pathname","window","location","query","search","freestarPageView","_window$freestar","gtag","call","length","replace","freestar","queue","push","trackPageview","ChipSwitch","_ref","children","label","size","rounding","_jsxs","className","_jsx","Paragraph","React","map","child","_child$props$theme","type","Button","theme","classnames","active","ChipSwitchButton","SubMenuTabs","items","_ref2","href","isActive","reloadDocument","as","Link","to","useStickyShadow","stickyRef","isSticky","setIsSticky","current","onScroll","throttle","stickyElement","elementStickyTopOffset","parseFloat","getComputedStyle","top","elementCurrentTopOffset","getBoundingClientRect","document","addEventListener","removeEventListener","useTrackPageView","trackInitial","trackAutomatically","initialRender","useLocation","handleTrackView","tracking","StickyShadow","ref","classNames","NULL_VALUE","FORMAT_SETTINGS","defaultValue","GREEK_SETTINGS","fractions","columnMap","Object","freeze","ColumnId","LastClose","id","align","TableAlign","Right","name","renderColumn","args","kind","RowKind","OptionRow","row","lastClose","formatNumber","ChangeUsd","getValueForSort","lastChange","RedGreenText","value","rightContent","showPlusSign","ChangePct","prevClose","change","BidPrice","bidPrice","AskPrice","askPrice","Volume","lastVolume","OpenInterest","openInterest","StrikePrice","strike","ExpirationDate","formatDate","exDate","DATE_FORMAT_INT","DATE_FORMAT_VIEW","ContractName","Left","ticker","_args$ticker","toString","padStart","Call","LastTrade","Date","lastTime","DATE_FORMAT_VIEW_LONG","IV","iv","Delta","delta","Gamma","gamma","Theta","theta","Vega","vega","Rho","rho","DATE_FORMAT_DB","DATE_FORMAT_SCATTER_PLOT","LINK_COLUMN_NAME","OPTIONS_SECTION_LABELS","QuoteSubview","OptionsChain","OptionsVolatility","OPTIONS_MENU_TABS","getOptionsMenuTabs","searchParams","decodeQueryString","encodeQueryString","ty","ov","OptionsSubpage","Volatility","OptionsView","Plot","ChainByDate","QuoteOptionsTabMenu","OptionsViewSwitcher","activeView","subpage","useSearchParams","chainLink","newParams","URLSearchParams","set","OptionsQuery","View","ChainByStrike","ListByStrike","includes","get","listLink","ListByDate","plotLink","delete","Strike","Expiry","Prices","useOptionsQuery","params","parseOptionsQuery","PriceRow","leftSpan","rightSpan","priceAlign","Center","showAdditionalCells","date","getDate","formattedDate","getFormattedDateString","formattedTime","TableRow","TableCell","colSpan","OptionsTableCell","isFirst","isLast","isHighlighted","isBorderVisible","CALL_OPTION_COLUMNS","originalId","rowKind","PUT_OPTION_COLUMNS","option","Put","CALL_OPTION_GREEK_COLUMNS","PUT_OPTION_GREEK_COLUMNS","FULL_COLUMNS_BREAKPOINT","valueGetter","column","customValueGetter","undefined","_row$call","_row$call2","put","_row$put","_row$put2","ChainTable","data","middleColumn","isPriceRowEnabled","isHeaderSticky","headerClass","tableOrder","onSortChange","CALL_COLUMNS","PUT_COLUMNS","columnsLength","setColumnsLength","tickerLastClose","updateColumnsLength","innerWidth","middleColumnDefinition","allColumns","mergedData","options","mergeBy","result","sorted","slice","sort","a","b","_last","last","OptionType","mergeOptionsBy","tableRows","changeSort","useTableSort","columns","defaultSort","getDefaultSortFromUrl","currentPriceRow","isVisible","rowIndex","index","direction","SortDirection","Ascending","findLastIndex","priceRowProps","Table","cellPadding","TableHead","TableHeaderSortable","onClick","TableBody","_tableRows","_tableRows2","showPriceAfter","columnClass","middleLink","getViewLink","ChainOptionRow","_ref3","_Fragment","_createElement","key","FilterSelect","filterColumn","selected","onChange","filterValue","setFilterValue","Select","placement","item","DateFilter","currentExpiry","expiries","setSearchParams","filterOptions","prev","newQuery","StrikeFilter","currentStrike","strikes","ViewFooter","expiry","exportUrl","t","e","s","event_category","useOptionsSortChange","navigate","useNavigate","prefix","arguments","isLinkColumn","urlColumnId","urlOrderValue","newOrder","order","Order","orderToString","preventScrollReset","useOptionsSortOrder","defaultOrder","ChainRoute","view","effectiveTableOrder","evalLinkOrder","optionsSortChange","handleSortChange","defaultColumnRenderer","getColumnValueGetter","_row","OptionsTable","useTableSortWithAutoupdate","LEFT_COLUMNS","RIGHT_PRICES_COLUMNS","RIGHT_GREEK_COLUMNS","BY_DATE_PRICES_COLUMNS","BY_STRIKE_PRICES_COLUMNS","BY_DATE_GREEK_COLUMNS","BY_STRIKE_GREEK_COLUMNS","ListRoute","columnRenderer","getColumnRenderer","isByDateList","getColumns","linkColumn","sortOrder","rest","split","startsWith","removePrefix","sortPrefix","filter","ScatterPlot","PlotRoute","fallback","Loading","OPTIONS_REFRESH_INTERVAL","Options","_data$options","_data$view","_data$options2","_data$options3","_data$view2","useCachedLoaderData","revalidator","useRevalidator","intervalCallbackOnWindowVisible","interval","navigator","onLine","revalidate","hasOptionsGreeksEnabled","QuoteStickySubMenu","leftContent","OptionsContent","DELIMITER","parseOrder","input","parts","pricesOrder","volatilityOrder","obj","join","Number","fromEntries","entries","Ticker","isFinite","Type","linkAlias","columnId","SubMenu","isRedesignEnabled","FONT_SIZE","XXS","XS","S","M","L","XXL","XXXL","LINE_HEIGHT","PADDING","XXXS","MARGIN","CHART_MARGIN","XL","SETTINGS_HEIGHT","TICKER_TIMEFRAME_CHANGE_HEIGHT","OFFSET","MONTHS","ChartEditorEnum","LayoutType","CanvasElementType","ChartElementType","IndicatorType","OverlayType","ChartEventDbType","ChartEventType","ChartEventBadgeType","ChartEventLabels","Dividends","Split","EarningsPositive","EarningsNegative","EarningsNeutral","EarningsFuture","LAYOUTS","rows","count","gridAreas","SORT_DIRECTION","ASC","DESC","TIMEFRAME","TIMEFRAMES_WITH_PRE_MARKET","i1","i2","i3","i5","IntradayTimeframeInterval","i10","i15","i30","h","h2","h4","TimeframeLabelShort","d","w","m","DateRangeType","QuoteFinancialAttachment","TIMEFRAME_SECONDS","CRYPTOS","BTCUSD","LTCUSD","ETHUSD","XRPUSD","BCHUSD","BTCEUR","LTCEUR","ETHEUR","XRPEUR","BCHEUR","LTCBTC","ETHBTC","XRPBTC","BCHBTC","SpecificChartFunctionality","TextAlign","TextBaseline","ScaleType","QuotePollingIntervalInMs","EXTRA_MARKET_BUFFER_MINUTES","ScaleLabel","Linear","Percentage","Logarithmic","PANE_HEIGHT_DEFAULT","chart","indicator","INDICATOR_LABEL_HEIGHT","MOBILE_BARS_TO_VIEW","MOBILE_VIEW_BREAKPOINT_WIDTH","FREE_DATE_RANGES","getTimeframeLabel","timeframe","QuotePageQueryChartTypes","MacroTimeframe","MicroMacroTimeframe","micro","macro","minutes","hours","days","weeks","months","MicroTimeframeRange","keys","reduce","curr","SetVisibilityTo","QUOTE_FETCH_EVENT","PREMARKET_AFTERMARKET_HOURS","CHART_ELEMENT_ID","CHART_SETTINGS_DIALOG_TEST_ID","Utils","min","_len","Array","_key","arg","el","max","_len2","_key2","minMax","_len3","_key3","getScaleRatio","devicePixelRatio","setSizeOnCanvasElement","canvasElement","width","height","ratio","style","getQuoteDateTimestampOffsetInSeconds","referenceDate","dayNumber","monthIndex","getMonth","previousSunday","getDay","getIsDstInNy","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","convertLocalToNyTime","addOffset","quoteDateTimeOffsetInMs","localTimeOffsetInMs","getTimezoneOffset","offsetDirectionCoefficient","setTime","getTime","isStockFastRefreshAvailable","hasPremarket","hasAftermarket","bufferMinutes","getMinutes","dayOfWeek","currentDayMinutes","getHours","premarketMinutes","aftermarketMinutes","isWeekend","isOpen","isClosed","dateFromUnixTimestamp","timestamp","setUTCSeconds","dateStringFromDate","getFullYear","String","dateFromDateString","dateString","yyyy","mm","dd","parseInt","isNaN","captureException","Error","extra","isMobile","testTouchPoints","getIsSSr","isMobileOs","userAgent","indexOf","createEvent","match","msMaxTouchPoints","maxTouchPoints","createElement","isIPad","matchesIPad","matchesIPhone","matchesIPod","getCookie","re","RegExp","cookie","setCookie","expires","toUTCString","hostname","getFullscreenStatus","_ref4","_ref5","_document$fullscreenE","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","getRequestFullscreen","element","_ref6","_ref7","_element$requestFulls","requestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","getExitFullscreen","_ref8","_ref9","_document$exitFullscr","exitFullscreen","webkitExitFullscreen","mozExitFullScreen","msExitFullscreen","ready","fn","readyState","getChartsDimensions","chartElementId","_box$width","_box$height","containerElement","getElementById","box","Math","getIsMobileScreenSize","getIsMobilePortrait","orientation","numberToStringWithUnitsSuffix","suffix","toFixed","_window$FinvizSetting","hasRedesignEnabled","isRedesignedPage","matchingPages","forexPage","futuresPage","cryptoPage","isQuotePage","specificChartFunctionality","quotePage","isQuoteFinancials","quoteFinancials","getRoundedString","number","numOfDecimalPlaces","precision","pow","round","process","getParsedIntegersFromPeriodString","periodString","part","exception","captureContext","Sentry","isPositiveFloat","parsedNumber","isPositiveInteger","string","isInRange","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","getValueInRange","isPrimaryClick","hasOwnProperty","button","getJSONReplacerFunc","visited","WeakSet","has","add","formatDateToStringUS","toLocaleDateString","day","month","year","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","substring","c","getRandomValues","Uint8Array","getEarningsDateSuffix","$","$findLastIndex","addToUnscopables","target","proto","callbackfn","this"],"sourceRoot":""}