{"version":3,"file":"main.cf32b5f8.js","mappings":"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","sources":["webpack://@finviz/website/./js/app/queryString.ts","webpack://@finviz/website/./js/app/shared/cookie.ts","webpack://@finviz/website/./js/app/shared/sentry/constants.ts","webpack://@finviz/website/./js/app/shared/sentry/init.ts","webpack://@finviz/website/./js/app/shared/utils.ts","webpack://@finviz/website/./js/main/components/button.tsx","webpack://@finviz/website/./js/main/components/delayed.tsx","webpack://@finviz/website/./js/main/components/error-view.tsx","webpack://@finviz/website/./js/main/components/icon/icon.tsx","webpack://@finviz/website/./js/main/components/icon/index.tsx","webpack://@finviz/website/./js/main/components/loading.tsx","webpack://@finviz/website/./js/main/components/notification/hooks.ts","webpack://@finviz/website/./js/main/components/notification/notification-wrapper.tsx","webpack://@finviz/website/./js/main/components/notification/with-notification-context.tsx","webpack://@finviz/website/./js/main/components/notification/notification.tsx","webpack://@finviz/website/./js/main/components/spinner.tsx","webpack://@finviz/website/./js/main/components/typography.tsx","webpack://@finviz/website/./js/main/constants.ts","webpack://@finviz/website/./js/main/context.ts","webpack://@finviz/website/./js/main/hooks/useCachedLoaderData.tsx","webpack://@finviz/website/./js/main/hooks/useVisualViewport.ts","webpack://@finviz/website/./js/main/QuoteRoutesSwitch.tsx","webpack://@finviz/website/./js/main/index.tsx","webpack://@finviz/website/./js/main/services/api.ts","webpack://@finviz/website/./js/main/services/routing.ts","webpack://@finviz/website/./js/main/types.ts","webpack://@finviz/website/./js/main/util.tsx"],"sourcesContent":["export type ObjectHash = Record\r\n\r\nexport const decodeQueryString = function = ObjectHash>(\r\n search = window.location.search\r\n): T {\r\n const vars = search.substring(1).split('&')\r\n const obj: ObjectHash = {}\r\n vars.forEach((pair) => {\r\n const delimiterPos = pair.indexOf('='),\r\n key = decodeURIComponent(pair.substring(0, delimiterPos)),\r\n value = decodeURIComponent(pair.substring(delimiterPos + 1))\r\n obj[key] = value\r\n })\r\n return obj as T\r\n}\r\n\r\nexport const encodeQueryString = function (values: ObjectHash, whitelistedValues: string[] = []) {\r\n return Object.keys(values).reduce((prev, key) => {\r\n const value = values[key]\r\n if (!['', null, undefined].includes(value) || whitelistedValues.includes(value)) {\r\n return prev + (prev.length > 0 ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value)\r\n }\r\n return prev\r\n }, '')\r\n}\r\n","export function getParsedCookies(cookieName: string) {\r\n const parseCookies = document.cookie\r\n .split(';')\r\n .map((cookieString) => cookieString.split('='))\r\n .reduce(\r\n (acc, v) => {\r\n acc[decodeURIComponent(v[0].trim())] = decodeURIComponent(v[1].trim())\r\n return acc\r\n },\r\n {} as Record\r\n )\r\n\r\n return cookieName ? parseCookies[cookieName] : parseCookies\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n var re = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$')\r\n return document.cookie.replace(re, '$1')\r\n}\r\n\r\nexport function setCookie(name: string, value: string, expires: Date) {\r\n var cookie = name + '=' + value + '; expires=' + expires.toUTCString()\r\n if (/\\bfinviz\\b/.test(document.location.hostname)) {\r\n cookie += '; domain=.finviz.com'\r\n }\r\n document.cookie = cookie\r\n}\r\n","import { dedupeIntegration, extraErrorDataIntegration, httpClientIntegration } from '@sentry/integrations'\r\n\r\nexport const sentryOptions = {\r\n dsn: 'https://11de51e753454212a2845e5899a38cae@sentry.io/33153',\r\n allowUrls: [/finviz\\.com/, /www\\.finviz\\.com/, /elite\\.finviz\\.com/],\r\n release: typeof window !== 'undefined' && 'FinvizSentrySettings' in window ? FinvizSentrySettings.release : undefined,\r\n sendDefaultPii: true,\r\n integrations: [dedupeIntegration(), extraErrorDataIntegration(), httpClientIntegration()],\r\n\r\n ignoreErrors: [\r\n 'TypeError: Failed to fetch',\r\n 'TypeError: NetworkError when attempting to fetch resource.',\r\n 'ChunkLoadError: Loading chunk',\r\n 'Error: Loading CSS chunk',\r\n /^TypeError: Load failed$/,\r\n ],\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { sentryOptions } from './constants'\r\n\r\nif ('FinvizSentrySettings' in window && !('sentryDisabled' in window)) {\r\n Sentry.init({\r\n ...sentryOptions,\r\n beforeSend(event: Sentry.Event) {\r\n if ('sentryDisabled' in window) {\r\n return null\r\n }\r\n return event\r\n },\r\n })\r\n\r\n if (FinvizSentrySettings.id > 0) {\r\n Sentry.setUser({ id: String(FinvizSentrySettings.id) })\r\n }\r\n\r\n try {\r\n Sentry.setTags({\r\n dpr: window.devicePixelRatio,\r\n redesign: window.FinvizSettings?.hasRedesignEnabled,\r\n dark: window.FinvizSettings?.hasDarkTheme,\r\n innerWidth: window.innerWidth,\r\n innerHeight: window.innerHeight,\r\n })\r\n } catch {}\r\n}\r\n\r\nwindow['Sentry'] = {\r\n captureException: Sentry.captureException,\r\n captureMessage: Sentry.captureMessage,\r\n withScope: Sentry.withScope,\r\n}\r\n","import { setCookieRequest } from '../../main/services/api'\r\nimport { decodeQueryString, encodeQueryString } from '../queryString'\r\nimport { getCookie, setCookie } from './cookie'\r\n\r\nexport const formatDateToStringUS = (date: Date) =>\r\n date.toLocaleDateString('en-US', {\r\n day: '2-digit',\r\n month: '2-digit',\r\n year: 'numeric',\r\n })\r\n\r\nconst DRAWING_QUOTE_PAGE_COOKIE_NAME = 'charts-draw'\r\nexport function getIsDrawingEnabledOnQuotePage() {\r\n return getCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME) === 'on'\r\n}\r\n\r\nexport async function setIsDrawingEnabledOnQuotePage(isEnabled: boolean) {\r\n return setCookieRequest(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off')\r\n .catch(() => {\r\n // fallback to JS otherwise draw toggle won't work if API doesn't work\r\n setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled)\r\n })\r\n .finally(() => {\r\n const { i: idea, ...rest } = decodeQueryString()\r\n if (idea) {\r\n document.location = `quote.ashx?${encodeQueryString(rest)}`\r\n } else {\r\n document.location.reload()\r\n }\r\n })\r\n}\r\n\r\nfunction setIsDrawingEnabledOnQuotePageCookieViaJS(isEnabled: boolean) {\r\n const expires = new Date()\r\n expires.setMonth(expires.getMonth() + 1)\r\n setCookie(DRAWING_QUOTE_PAGE_COOKIE_NAME, isEnabled ? 'on' : 'off', expires)\r\n}\r\n\r\nexport function parseInitData(elementId: string): T | undefined {\r\n try {\r\n const initDataElement = document.getElementById(elementId)!\r\n return JSON.parse(initDataElement.textContent!)\r\n } catch (e) {\r\n Sentry.captureException(e)\r\n return\r\n }\r\n}\r\n\r\nexport function getSidebarFromCookie() {\r\n const chartsUrl = getCookie('chartsUrl')\r\n const decodedCookie = chartsUrl ? decodeQueryString<{ sidebar?: string }>(chartsUrl) : null\r\n return decodedCookie?.sidebar || undefined\r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Icon, IconNameType, isValidIconName } from './icon'\r\nimport { PropsWithAs } from './types'\r\n\r\nexport const BUTTON_DEFAULT_ELEMENT = 'button'\r\n\r\nexport const BUTTON_BASE_CLASS =\r\n 'flex shrink-0 items-center justify-center font-medium whitespace-nowrap focus:outline-none'\r\nexport const BUTTON_SQUARE_BASE_CLASS = 'shrink-0 justify-center'\r\nexport const BUTTON_FOCUS_STYLES = 'focus-visible:ring-2 ring-gray-200 dark:ring-gray-500'\r\n\r\nexport enum ButtonSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'text-[11px] h-4 min-w-4', // 16px height\r\n xsmall = 'text-2xs h-5 min-w-5', // 20px height\r\n small = 'text-2xs h-6 min-w-6', // 24px height\r\n regular = 'text-2xs h-7 min-w-7', // 28px height\r\n medium = 'text-sm h-8 min-w-8', // 32px height\r\n large = 'text-sm h-9 min-w-9', // 36px height\r\n}\r\n\r\n// Must have the same keys as ButtonSize\r\nexport enum ButtonPadding {\r\n none = '',\r\n xxsmall = 'px-0.5', // 2px padding\r\n xsmall = 'px-1', // 4px padding\r\n small = 'px-1.5', // 6px padding\r\n regular = 'px-2', // 8px padding\r\n medium = 'px-2.5', // 10px padding\r\n large = 'px-3', // 12px padding\r\n}\r\n\r\nexport enum ButtonAlign {\r\n none = '',\r\n left = 'text-left',\r\n center = 'text-center',\r\n right = 'text-right',\r\n}\r\n\r\nexport type ButtonSizeType = keyof typeof ButtonSize\r\n\r\nexport enum ButtonSquareSize {\r\n none = '', // Do not set fixed dimensions\r\n xxsmall = 'h-4 w-4', // 16x16px\r\n xsmall = 'h-5 w-5', // 20x20px\r\n small = 'h-6 w-6', // 24x24px\r\n regular = 'h-7 w-7', // 28x28px\r\n medium = 'h-8 w-8', // 32x32px\r\n large = 'h-9 w-9', // 36x36px\r\n}\r\n\r\nexport enum ButtonRounding {\r\n none = '',\r\n small = 'rounded', // 4px\r\n regular = 'rounded-md', // 6px\r\n full = 'rounded-full', // 9999px\r\n}\r\n\r\nexport type ButtonRoundingType = keyof typeof ButtonRounding\r\n\r\nexport enum ButtonTheme {\r\n transparent, // Only basic shape is rendered\r\n light,\r\n lightTransparent,\r\n dark,\r\n blue,\r\n violet,\r\n blueHover,\r\n red,\r\n headerItem,\r\n menuItem,\r\n menuItemTransparent,\r\n menuItemDark,\r\n opacity,\r\n outline,\r\n chipTransparent,\r\n chip,\r\n link,\r\n tab,\r\n}\r\n\r\nexport type ButtonThemeType = keyof typeof ButtonTheme\r\n\r\n/**\r\n * Get button theme\r\n */\r\nexport function getButtonTheme(theme: ButtonTheme, active = false) {\r\n switch (theme) {\r\n case ButtonTheme.light: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-gray-200/30 disabled:text-gray-400 disabled:hover:bg-gray-200/30 disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-gray-200/30 hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.lightTransparent: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-gray-200/90 disabled:bg-transparent disabled:text-gray-400 disabled:hover:bg-transparent disabled:hover:text-gray-400', // Light\r\n 'dark:active:bg-gray-500/90 dark:disabled:bg-gray-500/30 dark:disabled:text-gray-300 dark:disabled:hover:bg-gray-500/30 dark:disabled:hover:text-gray-300', // Dark\r\n {\r\n 'bg-transparent hover:bg-gray-200/50 dark:bg-gray-500/30 dark:hover:bg-gray-500/50': !active,\r\n 'bg-gray-200/90 dark:bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.dark: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-gray-50 active:bg-gray-500/90 disabled:bg-gray-500/30 disabled:text-gray-300 disabled:hover:bg-gray-500/30 disabled:hover:text-gray-300',\r\n {\r\n 'bg-gray-500/30 hover:bg-gray-500/50': !active,\r\n 'bg-gray-500/90': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blue: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white hover:text-white active:bg-blue-600 disabled:bg-blue-200 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-blue-400 hover:bg-blue-500': !active,\r\n 'bg-blue-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.violet: {\r\n return {\r\n button: classnames(\r\n 'text-white hover:text-white focus:text-white disabled:bg-violet-200 dark:disabled:text-gray-300 disabled:hover:bg-violet-200 dark:disabled:hover:text-gray-300',\r\n {\r\n 'bg-violet-400 hover:bg-violet-500': !active,\r\n 'bg-violet-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.blueHover: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent active:bg-blue-600 disabled:bg-blue-200 disabled:text-gray-400 dark:disabled:text-gray-300 disabled:hover:bg-blue-200 disabled:hover:text-gray-400 dark:disabled:hover:text-gray-300',\r\n {\r\n 'text-blue-600 hover:bg-blue-400 hover:text-white dark:text-blue-500 dark:hover:text-white': !active,\r\n 'bg-blue-400 text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.red: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent text-white active:bg-red-600 disabled:bg-red-200 disabled:text-gray-300 disabled:hover:bg-red-200 disabled:hover:text-gray-300',\r\n {\r\n 'bg-red-400 hover:bg-red-500': !active,\r\n 'bg-red-600': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.headerItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent bg-gray-800 text-gray-300 hover:bg-gray-900 hover:text-white disabled:hover:text-gray-300 disabled:bg-gray-700 disabled:hover:bg-gray-700' // Base\r\n ),\r\n icon: 'text-white',\r\n }\r\n }\r\n case ButtonTheme.menuItem: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent dark:disabled:hover:bg-transparent disabled:hover:bg-transparent',\r\n {\r\n 'hover:bg-gray-200/30 disabled:text-gray-400 disabled:hover:text-gray-400 dark:hover:bg-gray-500/30':\r\n !active,\r\n 'bg-gray-200/30 dark:bg-gray-500/30': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.menuItemTransparent: {\r\n return {\r\n button: 'border border-transparent',\r\n }\r\n }\r\n case ButtonTheme.menuItemDark: {\r\n return {\r\n button: classnames('border border-transparent text-white dark:disabled:hover:bg-transparent', {\r\n 'hover:bg-gray-700': !active,\r\n 'bg-gray-700': active,\r\n }),\r\n }\r\n }\r\n case ButtonTheme.opacity:\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:opacity-50 disabled:hover:opacity-50 dark:text-gray-400',\r\n {\r\n 'opacity-70 hover:opacity-100': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.outline:\r\n return {\r\n button: classnames(\r\n // Base styles\r\n 'bg-primary border disabled:border-gray-100 disabled:bg-gray-50 disabled:text-gray-500 disabled:hover:border-gray-100 disabled:hover:bg-gray-50 disabled:hover:text-gray-500',\r\n // Dark styles\r\n 'dark:bg-gray-800 dark:text-gray-50 dark:disabled:border-transparent dark:disabled:bg-gray-700 dark:disabled:text-gray-400 dark:disabled:hover:border-transparent dark:disabled:hover:bg-gray-700 dark:disabled:hover:text-gray-400',\r\n {\r\n 'border-blue-400 dark:border-blue-400': active,\r\n 'border-gray-100 hover:border-gray-300 dark:hover:border-gray-400 dark:border-gray-600': !active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.chip:\r\n return {\r\n button: classnames('border dark:disabled:hover:bg-gray-700 disabled:hover:bg-gray-50', {\r\n 'border-transparent bg-gray-200/30 hover:bg-gray-200/30 dark:bg-gray-700 dark:hover:bg-gray-500/30': !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:border-blue-400 dark:bg-gray-500/30 dark:text-white': active,\r\n }),\r\n }\r\n case ButtonTheme.chipTransparent:\r\n return {\r\n button: classnames(\r\n 'border dark:disabled:hover:bg-transparent disabled:hover:bg-transparent dark:disabled:hover:text-gray-400 disabled:hover:text-gray-500', // Base styles\r\n {\r\n 'border-transparent text-gray-500 hover:bg-gray-200/30 hover:text-gray-900 dark:text-gray-400 dark:hover:bg-gray-500/30 dark:hover:text-gray-200':\r\n !active,\r\n 'border-blue-400 bg-blue-50 text-gray-900 dark:bg-gray-500/30 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n case ButtonTheme.link: {\r\n return {\r\n button: classnames(\r\n 'border border-transparent disabled:text-blue-500/50 disabled:hover:text-blue-500/50', // Light\r\n 'dark:disabled:text-blue-300/50 dark:disabled:hover:text-blue-300/50', // Dark\r\n {\r\n 'text-blue-500 hover:text-blue-600 dark:text-blue-300 dark:hover:text-blue-200': !active,\r\n 'bg-blue-50 text-blue-600 dark:bg-blue-700 dark:text-white': active,\r\n }\r\n ),\r\n }\r\n }\r\n case ButtonTheme.tab: {\r\n return {\r\n button: classnames('border-b', {\r\n 'border-b-gray-100 dark:border-b-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 dark:hover:border-b-gray-600':\r\n !active,\r\n 'text-blue-500 border-b-blue-500 shadow-blue-500 shadow-[inset_0_-1px_0] dark:text-blue-400 dark:border-b-blue-400 dark:shadow-blue-400':\r\n active,\r\n }),\r\n }\r\n }\r\n default:\r\n return {}\r\n }\r\n}\r\n\r\n/**\r\n * Export Button html props type so we don’t always have to omit\r\n */\r\nexport type ButtonHTMLProps = Omit<\r\n React.HTMLProps,\r\n 'ref' | 'type' | 'size' | 'content' | 'align' | 'as'\r\n>\r\n\r\nexport interface ButtonProps {\r\n /**\r\n * Visual appearance of the button\r\n */\r\n theme?: ButtonThemeType\r\n\r\n /**\r\n * Sets if button is square or normal.\r\n *\r\n * @default 'regular'\r\n */\r\n appearance?: 'regular' | 'square'\r\n\r\n /**\r\n * Size of the button\r\n *\r\n * @default \"regular\"\r\n */\r\n size?: ButtonSizeType\r\n\r\n /**\r\n * Override align of the text for a button\r\n *\r\n * @default center, left when `leftContent` or `rightContent` are defined\r\n */\r\n align?: keyof typeof ButtonAlign\r\n\r\n /**\r\n * Override button padding\r\n *\r\n * @default undefined\r\n */\r\n padding?: keyof typeof ButtonPadding\r\n\r\n /**\r\n * Render button in an active state (darker background, etc.)\r\n */\r\n active?: boolean\r\n\r\n /**\r\n * Sets if the button has focus ring\r\n *\r\n * @default true\r\n */\r\n focusRing?: boolean\r\n\r\n /**\r\n * Sets rounded corners for the button\r\n *\r\n * @default regular\r\n */\r\n rounding?: ButtonRoundingType\r\n\r\n /**\r\n * Class for the content wrapper\r\n */\r\n contentClass?: string\r\n\r\n /**\r\n * Name of left icon\r\n */\r\n leftContent?: JSX.Element | IconNameType\r\n\r\n /**\r\n * Name of right icon\r\n */\r\n rightContent?: JSX.Element | IconNameType\r\n}\r\n\r\nexport type ButtonComponentProps =\r\n PropsWithAs & ButtonProps\r\n\r\nfunction ButtonComponent(\r\n {\r\n as: asComponent,\r\n theme = 'light',\r\n size = 'regular',\r\n rounding = 'regular',\r\n focusRing = true,\r\n appearance = 'regular',\r\n align,\r\n padding = size, // same as size\r\n active,\r\n contentClass,\r\n leftContent,\r\n rightContent,\r\n className,\r\n children,\r\n ...props\r\n }: ButtonComponentProps,\r\n ref: React.ForwardedRef\r\n) {\r\n const isSquare = appearance === 'square'\r\n const buttonTheme = React.useMemo(() => getButtonTheme(ButtonTheme[theme], active), [theme, active])\r\n const buttonPadding = React.useMemo(() => (isSquare ? null : ButtonPadding[padding]), [isSquare, padding])\r\n const buttonSize = isSquare ? ButtonSquareSize[size] : ButtonSize[size]\r\n const buttonRounding = ButtonRounding[rounding]\r\n const hasIcons = leftContent || rightContent\r\n\r\n return React.createElement(\r\n asComponent ?? BUTTON_DEFAULT_ELEMENT,\r\n {\r\n ...props,\r\n ref,\r\n className: classnames(\r\n BUTTON_BASE_CLASS,\r\n buttonTheme.button,\r\n buttonPadding,\r\n buttonSize,\r\n buttonRounding,\r\n {\r\n [BUTTON_SQUARE_BASE_CLASS]: isSquare,\r\n [BUTTON_FOCUS_STYLES]: focusRing,\r\n },\r\n className\r\n ),\r\n },\r\n <>\r\n {leftContent && (\r\n
\r\n {isValidIconName(leftContent) ? : leftContent}\r\n
\r\n )}\r\n {children && !isSquare ? (\r\n \r\n {children}\r\n \r\n ) : (\r\n children\r\n )}\r\n {rightContent && (\r\n
\r\n {isValidIconName(rightContent) ? : rightContent}\r\n
\r\n )}\r\n \r\n )\r\n}\r\n\r\n/**\r\n * We need to forward ref to the function, but typescript looses the type of the\r\n * props param so we need to typecast to get suggestions to work\r\n */\r\nexport const Button = React.forwardRef(ButtonComponent) as <\r\n TagType extends React.ElementType = typeof BUTTON_DEFAULT_ELEMENT,\r\n>(\r\n props: PropsWithAs & ButtonProps & { ref?: React.ForwardedRef }\r\n) => ReturnType\r\n","import * as React from 'react'\r\n\r\nexport interface DelayedProps {\r\n /**\r\n * The delay in milliseconds before the component is rendered.\r\n *\r\n * @default 300\r\n */\r\n delay?: number\r\n\r\n /**\r\n * Delay in milliseconds before rendering timeout state.\r\n */\r\n timeout?: number\r\n\r\n /**\r\n * Throw on timeout (suspense)\r\n */\r\n throwOnTimeout?: boolean\r\n\r\n /**\r\n * Component visible during the delay.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n delayComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when timeout is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n timeoutComponent?: React.ReactNode\r\n\r\n /**\r\n * Component visible when delay is over.\r\n * If rendering text, wrap it in a `span` to prevent error — see PR#608\r\n */\r\n children?: React.ReactNode\r\n}\r\n\r\nexport function Delayed({\r\n delay = 300,\r\n timeout = 0,\r\n throwOnTimeout = false,\r\n delayComponent,\r\n timeoutComponent,\r\n children,\r\n}: DelayedProps) {\r\n const [visible, setVisible] = React.useState(false)\r\n const [hasTimedOut, setHasTimedOut] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const visibilityTimeout = window.setTimeout(() => setVisible(true), delay)\r\n\r\n let failedTimeout: number\r\n if (timeout > 0) {\r\n failedTimeout = window.setTimeout(() => {\r\n setHasTimedOut(true)\r\n if (throwOnTimeout) throw new Error()\r\n }, timeout)\r\n }\r\n\r\n return () => {\r\n clearTimeout(visibilityTimeout)\r\n clearTimeout(failedTimeout)\r\n }\r\n }, [delay, timeout, throwOnTimeout])\r\n\r\n if (!visible) return <>{delayComponent}\r\n\r\n if (hasTimedOut) {\r\n return <>{timeoutComponent}\r\n }\r\n\r\n return <>{children}\r\n}\r\n","import * as Sentry from '@sentry/browser'\r\nimport { ReactNode, useEffect } from 'react'\r\nimport { FallbackProps } from 'react-error-boundary'\r\nimport { useRouteError } from 'react-router-dom'\r\n\r\nimport { link } from '../services/routing'\r\nimport { Button } from './button'\r\nimport { Heading, Paragraph } from './typography'\r\n\r\ninterface ErrorViewProps {\r\n /**\r\n * Title of the message\r\n */\r\n title?: ReactNode\r\n\r\n /**\r\n * Body text\r\n */\r\n message?: ReactNode\r\n\r\n /**\r\n * Show contact support text under the message\r\n *\r\n * @default true\r\n */\r\n showContact?: boolean\r\n\r\n /**\r\n * Show refresh page button under the text\r\n *\r\n * @default true\r\n */\r\n showRefresh?: boolean\r\n}\r\n\r\nexport function ErrorView({ title, message, showContact = true, showRefresh = true }: ErrorViewProps) {\r\n return (\r\n
\r\n {title}\r\n {message}\r\n\r\n {showContact && (\r\n \r\n Our development team has been notified of this. If the error persists, please{' '}\r\n \r\n contact support\r\n \r\n .\r\n \r\n )}\r\n\r\n {showRefresh && (\r\n \r\n Refresh page\r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport function DefaultErrorBoundary({\r\n error,\r\n title = 'Application error',\r\n message = 'We’re sorry but an unknown error occured.',\r\n ...props\r\n}: Partial) {\r\n useEffect(() => {\r\n // Ignore webpack chunk loading errors\r\n if (error?.name === 'ChunkLoadError') return\r\n // Otherwise log to Sentry\r\n Sentry.captureException(error, { level: 'fatal' })\r\n // so we can see error in logs\r\n console.error('ErrorBoundary:', JSON.stringify(error))\r\n }, [error])\r\n\r\n return \r\n}\r\n\r\nexport function RouterErrorElement() {\r\n const error = useRouteError() as Error\r\n return \r\n}\r\n","import classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { IconNameType, iconList } from '.'\r\nimport { SVGProps } from './svg'\r\n\r\nexport interface IconProps extends SVGProps {\r\n /**\r\n * Icon name\r\n */\r\n name?: IconNameType\r\n\r\n /**\r\n * Alternative way to pass icon to render if you want to render a custom component\r\n * or use `iconList` object lookup\r\n */\r\n as?: React.FC\r\n}\r\n\r\nexport function Icon({ name, as: asComponent, className, width = 16, height = width, ...props }: IconProps) {\r\n if (name && asComponent) {\r\n throw new Error('Specifying both \"name\" and \"as\" on Icon component is not supported')\r\n }\r\n\r\n if (!name && !asComponent) {\r\n throw new Error('No icon specified')\r\n }\r\n\r\n if (name) {\r\n if (iconList[name] === undefined) {\r\n throw new Error('Icon not found')\r\n }\r\n\r\n const fileName = ['icons', iconList[name]].filter(Boolean).join('_')\r\n\r\n return (\r\n \r\n \r\n \r\n )\r\n }\r\n\r\n const Component = asComponent!\r\n return \r\n}\r\n","// Export the Icon component itself\r\nexport * from './icon'\r\n\r\nexport function isValidIconName(name?: unknown): name is IconNameType {\r\n if (!name || typeof name !== 'string') return false\r\n\r\n return iconList[name as IconNameType] !== undefined\r\n}\r\n\r\nexport type IconNameType = keyof typeof iconList\r\n\r\nconst root = ''\r\nconst chartLayouts = 'chart-layouts'\r\nconst chartTools = 'chart-tools'\r\nconst chartTypes = 'chart-types'\r\n\r\n// Export list of icon components\r\nexport const iconList = {\r\n // Main icons\r\n add: root,\r\n arrowDownShort: root,\r\n arrowForward: root,\r\n arrowUpShort: root,\r\n briefcase: root,\r\n calendar: root,\r\n caretDown: root,\r\n caretLeft: root,\r\n caretRight: root,\r\n caretUp: root,\r\n caretVertical: root,\r\n chartBar: root,\r\n chartBubble: root,\r\n chartPie: root,\r\n chartTable: root,\r\n chartTreemap: root,\r\n chevronDown: root,\r\n chevronRight: root,\r\n close: root,\r\n darkMode: root,\r\n diamondOutlined: root,\r\n done: root,\r\n drag: root,\r\n draw: root,\r\n empty: root,\r\n exitFullscreen: root,\r\n flash: root,\r\n fullscreen: root,\r\n gesture: root,\r\n gift: root,\r\n hamburger: root,\r\n help: root,\r\n idea: root,\r\n ideaLoad: root,\r\n ideaSave: root,\r\n info: root,\r\n interval: root,\r\n lightMode: root,\r\n lock: root,\r\n lockOpened: root,\r\n menuClose: root,\r\n minus: root,\r\n more: root,\r\n note: root,\r\n palette: root,\r\n profile: root,\r\n publish: root,\r\n refresh: root,\r\n remove: root,\r\n restore: root,\r\n search: root,\r\n settings: root,\r\n settingsWheel: root,\r\n share: root,\r\n signOut: root,\r\n star: root,\r\n starOutlined: root,\r\n switchHorizontal: root,\r\n switchVertical: root,\r\n tabKey: root,\r\n template: root,\r\n trashCan: root,\r\n trendingDown: root,\r\n trendingUp: root,\r\n triangle: root,\r\n triangleOutlineDown: root,\r\n triangleOutlineUp: root,\r\n warning: root,\r\n\r\n // Chart layouts\r\n layout1h1v: chartLayouts,\r\n layout1h2v: chartLayouts,\r\n layout1h3v: chartLayouts,\r\n layout1l2r: chartLayouts,\r\n layout1t2b: chartLayouts,\r\n layout2h1v: chartLayouts,\r\n layout2h2v: chartLayouts,\r\n layout3h1v: chartLayouts,\r\n layout3h2v: chartLayouts,\r\n\r\n // Chart tools\r\n drawingActionDelete: chartTools,\r\n drawingSettingAutosaveOff: chartTools,\r\n drawingSettingAutosaveOn: chartTools,\r\n drawingSettingAutosaveSaving: chartTools,\r\n drawingSettingDrawingMode: chartTools,\r\n drawingSettingDrawingModeActive: chartTools,\r\n drawingSettingHide: chartTools,\r\n drawingSettingLock: chartTools,\r\n drawingSettingPreserveDrawings: chartTools,\r\n drawingSettingPreserveDrawingsActive: chartTools,\r\n drawingSettingShow: chartTools,\r\n drawingSettingUnlock: chartTools,\r\n toolArrow: chartTools,\r\n toolBrush: chartTools,\r\n toolCallout: chartTools,\r\n toolCurve: chartTools,\r\n toolElliottWave: chartTools,\r\n toolEllipse: chartTools,\r\n toolExpand: chartTools,\r\n toolFibonacci: chartTools,\r\n toolLine: chartTools,\r\n toolMeasure: chartTools,\r\n toolMidLineH: chartTools,\r\n toolMidLineV: chartTools,\r\n toolMouse: chartTools,\r\n toolPitchfork: chartTools,\r\n toolPolygon: chartTools,\r\n toolPosition: chartTools,\r\n toolRect: chartTools,\r\n toolRectRotated: chartTools,\r\n toolText: chartTools,\r\n toolTriangle: chartTools,\r\n toolXABCD: chartTools,\r\n\r\n // Chart types\r\n candleBarBasic: chartTypes,\r\n candleBarHeikinAshi: chartTypes,\r\n candleBarHollow: chartTypes,\r\n lineChartType: chartTypes,\r\n ohlcChartType: chartTypes,\r\n}\r\n","import { link } from '../services/routing'\r\nimport { Delayed, DelayedProps } from './delayed'\r\nimport { ErrorView } from './error-view'\r\nimport { Spinner } from './spinner'\r\n\r\ntype LoadingProps = Pick\r\n\r\nexport function Loading({ delay, timeout, throwOnTimeout }: LoadingProps) {\r\n return (\r\n \r\n There’s been an error loading the application.\r\n
\r\n Please make sure your internet connection is stable and refresh the page. If the error persists, please{' '}\r\n \r\n contact support\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\nexport function LoadingScreen(props: LoadingProps) {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nexport type NotificationContextType = ReturnType\r\n\r\nexport enum NotificationPosition {\r\n TopLeft,\r\n TopRight,\r\n BottomLeft,\r\n BottomRight,\r\n}\r\n\r\nexport interface NotificationOptions {\r\n position?: NotificationPosition\r\n inline?: boolean\r\n}\r\n\r\nexport const NotificationContext = React.createContext<{\r\n show: (element: JSX.Element, options?: NotificationOptions) => void\r\n hide: () => void\r\n}>({\r\n show: () => {},\r\n hide: () => {},\r\n})\r\n\r\nexport function useNotification() {\r\n return React.useContext(NotificationContext)\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { getVisualViewport, useVisualViewport } from '../../hooks/useVisualViewport'\r\nimport { NotificationContext, NotificationOptions, NotificationPosition } from './hooks'\r\n\r\ninterface NotificationState {\r\n element: JSX.Element\r\n options: Partial\r\n}\r\n\r\nexport function NotificationWrapper(props: React.PropsWithChildren) {\r\n const [isOpen, setIsOpen] = React.useState(false)\r\n const [notification, setNotification] = React.useState(null)\r\n const { viewport, setViewport } = useVisualViewport({ enabled: !!notification })\r\n\r\n const context = React.useRef({\r\n show: (element: JSX.Element, options: Partial = {}) => {\r\n setViewport(() => getVisualViewport(window.visualViewport))\r\n setNotification({ element, options })\r\n setIsOpen(true)\r\n },\r\n hide: () => setIsOpen(false),\r\n })\r\n\r\n const positionClass = React.useMemo(() => {\r\n const { position = NotificationPosition.BottomLeft } = notification?.options ?? {}\r\n return {\r\n '[--inset-t:1rem] items-start pt-inset-top': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.TopRight,\r\n ].includes(position),\r\n '[--inset-r:1rem] justify-end landscape-secondary:pr-inset-right': [\r\n NotificationPosition.TopRight,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-b:1rem] items-end pb-inset-bottom': [\r\n NotificationPosition.BottomLeft,\r\n NotificationPosition.BottomRight,\r\n ].includes(position),\r\n '[--inset-l:1rem] justify-start landscape-primary:pl-inset-left': [\r\n NotificationPosition.TopLeft,\r\n NotificationPosition.BottomLeft,\r\n ].includes(position),\r\n }\r\n }, [notification?.options])\r\n\r\n const WrapperComponent = React.useMemo(\r\n () => (notification?.options.inline ? React.Fragment : Ariakit.Portal),\r\n [notification?.options.inline]\r\n )\r\n\r\n return (\r\n \r\n {props.children}\r\n {isOpen && (\r\n \r\n \r\n {notification?.element}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import * as React from 'react'\r\n\r\nimport { NotificationContextType, useNotification } from './hooks'\r\n\r\nexport function withNotificationContext(\r\n WrappedComponent: React.ComponentType\r\n) {\r\n const displayName = WrappedComponent.displayName ?? WrappedComponent.name ?? 'Component'\r\n const WithNotificationContext = (props: Omit) => {\r\n const notification = useNotification()\r\n return \r\n }\r\n\r\n WithNotificationContext.displayName = `withNotificationContext(${displayName})`\r\n\r\n return WithNotificationContext\r\n}\r\n","import * as Ariakit from '@ariakit/react'\r\nimport classnames from 'classnames'\r\nimport * as React from 'react'\r\n\r\nimport { Button } from '../button'\r\nimport { useNotification } from './hooks'\r\n\r\ninterface NotificationProps {\r\n className?: string\r\n /**\r\n * Default button text\r\n * @default Close\r\n */\r\n closeText?: string\r\n\r\n /**\r\n * Custom buttons. Overrides `closeText`\r\n */\r\n actions?: JSX.Element\r\n\r\n /**\r\n * When set, the notification will automatically close\r\n */\r\n timeoutInMs?: number\r\n}\r\n\r\nexport function Notification({\r\n className,\r\n closeText = 'Close',\r\n actions,\r\n timeoutInMs,\r\n children,\r\n}: React.PropsWithChildren) {\r\n const notification = useNotification()\r\n\r\n React.useEffect(() => {\r\n let timeoutId: number\r\n if (timeoutInMs) {\r\n timeoutId = window.setTimeout(() => {\r\n notification.hide()\r\n }, timeoutInMs)\r\n }\r\n\r\n return () => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId)\r\n }\r\n }\r\n }, [notification, timeoutInMs])\r\n\r\n return (\r\n \r\n
{children}
\r\n
\r\n {actions ?? (\r\n \r\n )}\r\n
\r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\n\r\ninterface SpinnerProps {\r\n /**\r\n * Spinner as progress bar\r\n * @default false\r\n */\r\n isProgressBar?: boolean\r\n\r\n /**\r\n * Progress number in percent\r\n * @default 0\r\n */\r\n progress?: number\r\n\r\n /**\r\n * Spinner box width\r\n *\r\n * @default 28\r\n */\r\n width?: number\r\n}\r\n\r\nexport function Spinner({ isProgressBar = false, progress = 0, width = 28 }: SpinnerProps) {\r\n const radius = (3 * width) / 7\r\n const strokeWidth = radius / 3\r\n const circleXY = radius + strokeWidth / 2\r\n const circumference = radius * 2 * Math.PI\r\n\r\n return (\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n","import classnames from 'classnames'\r\nimport React, { ComponentProps, ElementType, HTMLProps, PropsWithChildren, ReactNode } from 'react'\r\n\r\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6\r\n\r\ninterface HeadingProps extends HTMLProps {\r\n /**\r\n * Heading level\r\n */\r\n level: HeadingLevel\r\n}\r\n\r\nfunction getHeadingElement(level: HeadingLevel) {\r\n switch (level) {\r\n case 1:\r\n return 'h1'\r\n case 2:\r\n return 'h2'\r\n case 3:\r\n return 'h3'\r\n case 4:\r\n return 'h4'\r\n case 5:\r\n return 'h5'\r\n default:\r\n return 'h6'\r\n }\r\n}\r\n\r\nexport function Heading({ level, children, ...props }: PropsWithChildren) {\r\n return React.createElement(\r\n getHeadingElement(level),\r\n {\r\n ...props,\r\n className: classnames(props.className, 'font-bold', {\r\n 'text-3xl': level === 1,\r\n 'text-2xl': level === 2,\r\n 'text-xl': level === 3,\r\n // We don't want to set any specific fontsize because it's used e.g. in DialogHeader\r\n // where it uses font-size: inherit; and is different on old/redesign versions\r\n '': level === 4,\r\n 'text-sm': level === 5,\r\n 'text-2xs': level === 6,\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface ParagraphProps extends Omit>, 'size' | 'as'> {\r\n /**\r\n * Determines which element the text should render to\r\n *\r\n * @default p\r\n */\r\n as?: ElementType\r\n\r\n /**\r\n * Font size for the paragraph\r\n * - tiny - 10px\r\n * - small - 12px\r\n * - default - 14px\r\n * - medium - 16px\r\n * - large - 18px\r\n *\r\n * @default default\r\n */\r\n size?: 'tiny' | 'small' | 'default' | 'medium' | 'large'\r\n\r\n /**\r\n * Paragraph font weight\r\n */\r\n medium?: boolean\r\n}\r\n\r\nexport function Paragraph({\r\n as = 'p',\r\n size = 'default',\r\n medium,\r\n children,\r\n ...props\r\n}: PropsWithChildren>) {\r\n return React.createElement(\r\n as,\r\n {\r\n ...props,\r\n className: classnames(props.className, {\r\n 'font-medium': medium,\r\n 'text-lg': size === 'large',\r\n 'text-sm': size === 'default',\r\n 'text-2xs': size === 'small',\r\n 'text-3xs': size === 'tiny',\r\n }),\r\n },\r\n children\r\n )\r\n}\r\n\r\ninterface LabelProps extends Omit, 'title'> {\r\n title?: ReactNode\r\n titleClassName?: string\r\n isHorizontal?: boolean\r\n}\r\n\r\nexport function Label({ title, titleClassName, isHorizontal, children, ...props }: PropsWithChildren) {\r\n return (\r\n \r\n )\r\n}\r\n","export const CRYPTO_TICKERS = [\r\n 'BTCUSD',\r\n 'LTCUSD',\r\n 'ETHUSD',\r\n 'XRPUSD',\r\n 'BCHUSD',\r\n 'BTCEUR',\r\n 'LTCEUR',\r\n 'ETHEUR',\r\n 'XRPEUR',\r\n 'BCHEUR',\r\n 'LTCBTC',\r\n 'ETHBTC',\r\n 'XRPBTC',\r\n 'BCHBTC',\r\n]\r\n\r\n// Keep in sync with the copy in Charts repo - app/constants/common.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 enum SpecificChartFunctionality {\r\n default = 'default',\r\n quotePage = 'quotePage',\r\n quotePerf = 'quotePerf',\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","import { createContext, useContext } from 'react'\r\n\r\nexport const SETTINGS_CONTEXT_DEFAULT = {\r\n versionImages: 0,\r\n nodeChartsDomain: '',\r\n hasUserPremium: false,\r\n name: '',\r\n email: '',\r\n hasDarkTheme: false,\r\n}\r\n\r\nexport const SettingsContext = createContext(SETTINGS_CONTEXT_DEFAULT)\r\n\r\nexport function useSettings() {\r\n return useContext(SettingsContext)\r\n}\r\n","import * as React from 'react'\r\nimport { ReactNode } from 'react'\r\nimport { useLoaderData } from 'react-router-dom'\r\n\r\nexport type CachedLoaderDataContextType = ReturnType\r\n\r\nexport const CachedLoaderDataContext = React.createContext<{\r\n data: any\r\n isCached: boolean\r\n} | null>(null)\r\n\r\nexport function useCachedLoaderData() {\r\n const context = React.useContext<{ data: DataType; isCached: boolean } | null>(CachedLoaderDataContext)\r\n\r\n if (context === null) {\r\n throw new Error(\r\n 'Error! Extracting context without wrapping your component with the CachedLoaderDataContextProvider'\r\n )\r\n }\r\n\r\n return context\r\n}\r\n\r\ninterface CachedLoaderDataContextProviderProps {\r\n children: ReactNode\r\n isNullValidData?: boolean\r\n}\r\nexport function CachedLoaderDataContextProvider({\r\n children,\r\n isNullValidData = false,\r\n}: CachedLoaderDataContextProviderProps) {\r\n const loaderData = useLoaderData() as DataType\r\n const dataCacheRef = React.useRef(loaderData)\r\n\r\n const value = React.useMemo(() => {\r\n if (loaderData !== undefined && (loaderData !== null || isNullValidData)) {\r\n dataCacheRef.current = loaderData\r\n }\r\n return { data: dataCacheRef.current, isCached: !loaderData }\r\n }, [loaderData, isNullValidData])\r\n\r\n return {children}\r\n}\r\n","import throttle from 'lodash.throttle'\r\nimport * as React from 'react'\r\n\r\nexport function getVisualViewport(visualViewport: VisualViewport | null) {\r\n const width = visualViewport?.width ?? window.innerWidth\r\n const height = visualViewport?.height ?? window.innerHeight\r\n const scale = visualViewport?.scale ?? 1\r\n\r\n return {\r\n top: visualViewport?.offsetTop ?? 0,\r\n left: visualViewport?.offsetLeft ?? 0,\r\n scale: Math.round((1 / scale) * 100) / 100,\r\n width: Math.round(width * scale),\r\n height: Math.round(height * scale),\r\n unscaledWidth: width,\r\n unscaledHeight: height,\r\n }\r\n}\r\n\r\nexport function useVisualViewport({ enabled = true, onScroll = true }: { enabled?: boolean; onScroll?: boolean } = {}) {\r\n const [viewport, setViewport] = React.useState(getVisualViewport(window.visualViewport))\r\n\r\n React.useEffect(() => {\r\n if (!enabled) return\r\n\r\n const handleChange = throttle((ev: Event) => {\r\n const viewport = ev.currentTarget as VisualViewport\r\n if (viewport) {\r\n setViewport(() => getVisualViewport(viewport))\r\n }\r\n }, 50)\r\n\r\n window.visualViewport?.addEventListener('resize', handleChange)\r\n if (onScroll) window.visualViewport?.addEventListener('scroll', handleChange)\r\n handleChange({ currentTarget: window.visualViewport } as Event)\r\n\r\n return () => {\r\n window.visualViewport?.removeEventListener('resize', handleChange)\r\n window.visualViewport?.removeEventListener('scroll', handleChange)\r\n }\r\n }, [enabled, onScroll])\r\n\r\n return React.useMemo(() => ({ viewport, setViewport }), [viewport])\r\n}\r\n","import React from 'react'\r\nimport { LoaderFunctionArgs, ShouldRevalidateFunction } from 'react-router-dom'\r\n\r\nimport { lazyLoadComponent, shouldRevalidateOnQueryChange } from './util'\r\n\r\nenum QuoteRoutes {\r\n OptionsChain = 'oc',\r\n Revenue = 'rv',\r\n}\r\n\r\nconst getOptionsBundle = () => import(/* webpackChunkName: \"options\" */ './modules/options')\r\nconst OptionsRoute = lazyLoadComponent({\r\n chunkName: 'options',\r\n load: getOptionsBundle,\r\n})\r\nconst getRevenueBundle = () => import(/* webpackChunkName: \"revenue\" */ './modules/revenue')\r\nconst RevenueRoute = lazyLoadComponent({\r\n chunkName: 'revenue',\r\n load: getRevenueBundle,\r\n})\r\n\r\nexport function getQuoteRouteLoader(args: LoaderFunctionArgs) {\r\n const params = new URLSearchParams(args.request.url)\r\n const route = params.get('ty') as QuoteRoutes\r\n\r\n switch (route) {\r\n case QuoteRoutes.OptionsChain:\r\n return getOptionsBundle().then((value) => value.loader(args))\r\n case QuoteRoutes.Revenue:\r\n return getRevenueBundle().then((value) => value.loader())\r\n\r\n default:\r\n return () => {}\r\n }\r\n}\r\n\r\nexport function getShouldRevalidateQuoteRoute(): ShouldRevalidateFunction {\r\n return (args) => {\r\n const route = args.currentUrl.searchParams.get('ty') as QuoteRoutes\r\n\r\n switch (route) {\r\n case QuoteRoutes.OptionsChain:\r\n return shouldRevalidateOnQueryChange(args, ['e', 's', 'ov'])\r\n\r\n default:\r\n return false\r\n }\r\n }\r\n}\r\n\r\nconst quoteRouteSearchParams = new URLSearchParams(window.location.search)\r\nconst quoteRouteType = quoteRouteSearchParams.get('ty') as QuoteRoutes\r\n\r\nexport default function QuoteRoutesSwitch() {\r\n switch (quoteRouteType) {\r\n case QuoteRoutes.OptionsChain:\r\n return \r\n case QuoteRoutes.Revenue:\r\n return \r\n\r\n default:\r\n return null\r\n }\r\n}\r\n","import '../app/shared/sentry/init'\r\n\r\nimport { Suspense } from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport { ErrorBoundary } from 'react-error-boundary'\r\nimport { Outlet, RouterProvider, ScrollRestoration, createBrowserRouter } from 'react-router-dom'\r\n\r\nimport '../../styles/charts.css'\r\nimport '../../styles/modal.css'\r\nimport '../../styles/tailwind.css'\r\nimport '../../styles/timeframe-bar.css'\r\nimport QuoteRouteSwitch, { getQuoteRouteLoader, getShouldRevalidateQuoteRoute } from './QuoteRoutesSwitch'\r\nimport { DefaultErrorBoundary, RouterErrorElement } from './components/error-view'\r\nimport { Loading, LoadingScreen } from './components/loading'\r\nimport { NotificationWrapper } from './components/notification'\r\nimport { SettingsContext } from './context'\r\nimport { CachedLoaderDataContextProvider } from './hooks/useCachedLoaderData'\r\nimport { lazyLoadComponent, revalidateOnQueryChange } from './util'\r\n\r\nconst ChartsRoute = lazyLoadComponent({\r\n chunkName: 'charts',\r\n load: () => import(/* webpackChunkName: \"charts\" */ './modules/charts'),\r\n})\r\n\r\nconst getPortfolioBundle = () => import(/* webpackChunkName: \"portfolio\" */ './modules/portfolio')\r\nconst PortfolioViewRoute = lazyLoadComponent({\r\n chunkName: 'portfolio',\r\n load: () => getPortfolioBundle().then((mod) => mod.portfolioView),\r\n})\r\nconst PortfolioCreateRoute = lazyLoadComponent({\r\n chunkName: 'portfolio',\r\n load: () => getPortfolioBundle().then((mod) => mod.portfolioEmpty),\r\n})\r\n\r\nconst getPortfolioEditBundle = () =>\r\n import(/* webpackChunkName: \"portfolio-edit\" */ './modules/portfolio/routes/PortfolioBulkEdit')\r\nconst PortfolioEditRoute = lazyLoadComponent({\r\n chunkName: 'portfolio-edit',\r\n load: getPortfolioEditBundle,\r\n})\r\n\r\nconst getSaveToPortfolioBundle = () => import(/* webpackChunkName: \"save-to-portfolio\" */ './modules/save-to-portfolio')\r\nconst SaveToPortfolioRoute = lazyLoadComponent({\r\n chunkName: 'save-to-portfolio',\r\n load: getSaveToPortfolioBundle,\r\n})\r\n\r\nconst getCreateAlertBundle = () => import(/* webpackChunkName: \"create-alert\" */ './modules/create-alert')\r\nconst CreateAlertRoute = lazyLoadComponent({\r\n chunkName: 'create-alert',\r\n load: getCreateAlertBundle,\r\n})\r\n\r\nconst router = createBrowserRouter([\r\n {\r\n path: '/',\r\n element: ,\r\n errorElement: ,\r\n children: [\r\n {\r\n path: '/charts',\r\n element: (\r\n }>\r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/portfolio.ashx',\r\n loader: (args) => getPortfolioBundle().then((value) => value.portfolioView.loader(args)),\r\n action: (args) => getPortfolioBundle().then((value) => value.portfolioView.action(args)),\r\n shouldRevalidate: revalidateOnQueryChange(['pid']),\r\n element: (\r\n }>\r\n \r\n \r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/create_new_portfolio.ashx',\r\n loader: () => getPortfolioBundle().then((value) => value.portfolioEmpty.loader()),\r\n action: (args) => getPortfolioBundle().then((value) => value.portfolioEmpty.action(args)),\r\n element: (\r\n }>\r\n \r\n \r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/portfolio_edit.ashx',\r\n loader: (args) => getPortfolioEditBundle().then((value) => value.loader(args)),\r\n action: (args) => getPortfolioEditBundle().then((value) => value.action(args)),\r\n element: (\r\n }>\r\n \r\n \r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/quote.ashx',\r\n loader: getQuoteRouteLoader,\r\n shouldRevalidate: getShouldRevalidateQuoteRoute(),\r\n element: (\r\n }>\r\n \r\n \r\n \r\n {/**\r\n * We precompute the element height on the backend so that the content under\r\n * options doesn’t jump when options render, so we can put restore scroll here.\r\n */}\r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/save_to_portfolio.ashx',\r\n loader: () => getSaveToPortfolioBundle(),\r\n element: (\r\n }>\r\n \r\n \r\n ),\r\n },\r\n {\r\n path: '/create_alert.ashx',\r\n loader: () => getCreateAlertBundle(),\r\n element: (\r\n }>\r\n \r\n \r\n ),\r\n },\r\n ],\r\n },\r\n])\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n)\r\n","import * as Sentry from '@sentry/browser'\r\n\r\nimport { PortfolioDefinition } from '../modules/portfolio/types'\r\n\r\n// Keep in sync with ContentType in https://github.com/finvizhq/charts/blob/master/app/utils/fetch_api.ts\r\n// START\r\nexport enum ContentType {\r\n ApplicationJson = 'application/json',\r\n ApplicationJsonUTF = 'application/json; charset=utf-8', // WriteAsJsonAsync\r\n FormUrlEncoded = 'application/x-www-form-urlencoded',\r\n Html = 'text/html; charset=utf-8',\r\n}\r\n\r\nfunction parseResponseForContentType(response: string, contentType: ContentType) {\r\n switch (contentType) {\r\n case ContentType.ApplicationJson:\r\n case ContentType.ApplicationJsonUTF:\r\n case ContentType.FormUrlEncoded:\r\n return JSON.parse(response)\r\n default:\r\n return response\r\n }\r\n}\r\n// END\r\n\r\nexport class ThrowableError extends Error {\r\n status: number\r\n isServerError = false\r\n body: unknown\r\n extra: Record = {}\r\n\r\n constructor(status: number, message = 'ThrowableError', body = '', extra: Record = {}) {\r\n super(`${status} ${message}`)\r\n this.status = status\r\n this.isServerError = status >= 500\r\n this.body = body\r\n this.extra = extra\r\n }\r\n}\r\n\r\nexport interface CancelablePromise extends Promise {\r\n cancel?: () => void\r\n}\r\n\r\n/**\r\n * General api fetch utility which returns a cancelable promise\r\n */\r\nexport function apiRequest(\r\n url: string,\r\n { query, headers = {}, ...options }: RequestInit & { query?: Record } = {},\r\n throwOnAllErrors = false\r\n): CancelablePromise {\r\n const controller = 'AbortController' in window ? new AbortController() : undefined\r\n const requestUrl = query ? `${url}?${new URLSearchParams(query)}` : url\r\n const contentType: ContentType = (headers as any)['Content-Type'] ?? ContentType.ApplicationJson\r\n\r\n const requestOptions = {\r\n ...options,\r\n headers: {\r\n 'Content-Type': contentType,\r\n ...headers,\r\n },\r\n }\r\n const request = fetch(requestUrl, { ...requestOptions, signal: controller?.signal })\r\n\r\n const cancelableRequest: CancelablePromise = request\r\n .then(async (response) => {\r\n const textResponse = await response.text()\r\n const responseContentType: ContentType = (response.headers.get('Content-Type') as any) ?? ContentType.Html\r\n\r\n try {\r\n const parsedResponse = parseResponseForContentType(textResponse, responseContentType)\r\n if (!response.ok || response.status >= 500) {\r\n throw new ThrowableError(response.status, response.statusText, parsedResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n\r\n return parsedResponse\r\n } catch (error: any) {\r\n if (error instanceof ThrowableError) {\r\n throw error\r\n }\r\n throw new ThrowableError(response.status, error.message, textResponse, {\r\n rayId: response.headers.get('cf-ray'),\r\n })\r\n }\r\n })\r\n .catch((error: ThrowableError) => {\r\n if (error.status >= 500) {\r\n Sentry.withScope((scope) => {\r\n scope.setContext('Cloudflare', error.extra)\r\n\r\n if (error.status === 500) {\r\n Sentry.captureException(error)\r\n } else {\r\n Sentry.captureMessage(`${error.status} ${error.message}`)\r\n }\r\n })\r\n }\r\n if (throwOnAllErrors) {\r\n throw error\r\n }\r\n })\r\n\r\n if (controller) {\r\n cancelableRequest.cancel = () => controller.abort()\r\n }\r\n\r\n return cancelableRequest\r\n}\r\n\r\nexport interface SearchApiResult {\r\n ticker: string\r\n company: string\r\n exchange: string\r\n}\r\n\r\nexport function searchApiRequest(input = '') {\r\n return apiRequest('/api/suggestions.ashx', { query: { input } }, true)\r\n}\r\n\r\nexport function portfoliosRequest() {\r\n return apiRequest<{ portfolios: PortfolioDefinition[] }>('/api/portfolio_data.ashx', {\r\n query: {\r\n fields: 'portfolios',\r\n },\r\n })\r\n}\r\n\r\nexport function lastCloseRequest(ticker: string) {\r\n return apiRequest('/request_quote.ashx', {\r\n query: {\r\n t: ticker,\r\n },\r\n })\r\n}\r\n\r\ninterface PortfolioLimitResult {\r\n transactions: number\r\n limitTransactions: number\r\n}\r\n\r\nexport function portfolioLimitRequest(portfolioId: number) {\r\n return apiRequest('/api/portfolio_data.ashx', {\r\n query: {\r\n pid: portfolioId,\r\n fields: 'transactions,limitTransactions',\r\n },\r\n })\r\n}\r\n\r\nexport function setCookieRequest(name: string, value?: unknown) {\r\n return apiRequest(\r\n '/api/set_cookie.ashx',\r\n {\r\n query: {\r\n cookie: name,\r\n ...(value !== undefined && {\r\n value: value,\r\n }),\r\n },\r\n },\r\n true\r\n )\r\n}\r\n","import * as pathToRegexp from 'path-to-regexp'\r\n\r\nimport { cleanTicker } from '../util'\r\n\r\n/**\r\n * Compile route path by applying parameters to it\r\n *\r\n * @example\r\n * // Outputs /route/1?query=foo\r\n * compilePath('/route/:id?query=:query', { id: 1, query: 'foo' })\r\n */\r\nfunction compilePath(\r\n path: string,\r\n params?: Record,\r\n options?: pathToRegexp.ParseOptions & pathToRegexp.TokensToFunctionOptions\r\n) {\r\n return pathToRegexp.compile(path, options)(params)\r\n}\r\n\r\nexport const path = {\r\n home: '/',\r\n news: '/news.ashx',\r\n screener: '/screener.ashx',\r\n charts: '/charts',\r\n groups: '/groups.ashx',\r\n portfolio: '/portfolio.ashx',\r\n insider: '/insidertrading.ashx',\r\n elite: '/elite.ashx',\r\n search: '/search.ashx\\\\?p=:ticker?',\r\n quote: '/quote.ashx\\\\?t=:ticker',\r\n contact: '/contact.ashx',\r\n\r\n alerts: '/alerts.ashx',\r\n help: '/help/screener.ashx',\r\n account: '/myaccount.ashx',\r\n login: '/login.ashx',\r\n logout: '/logout.ashx',\r\n\r\n // Maps\r\n maps: '/map.ashx',\r\n bubbles: '/bubbles.ashx',\r\n\r\n // Futures\r\n futures: '/futures.ashx',\r\n futuresPerf: '/futures_performance.ashx',\r\n futuresCharts: '/futures_charts.ashx',\r\n futuresChartDetail: '/futures_charts.ashx\\\\?t=:ticker',\r\n\r\n // Forex\r\n forex: '/forex.ashx',\r\n forexPerf: '/forex_performance.ashx',\r\n forexCharts: '/forex_charts.ashx',\r\n forexChartDetail: '/forex_charts.ashx\\\\?t=:ticker',\r\n\r\n // Crypto\r\n crypto: '/crypto.ashx',\r\n cryptoPerf: '/crypto_performance.ashx',\r\n cryptoCharts: '/crypto_charts.ashx',\r\n cryptoChartDetail: '/crypto_charts.ashx\\\\?t=:ticker',\r\n\r\n // Backtsest\r\n backtests: '/backtests.ashx',\r\n backtestCreate: '/backtest_create.ashx',\r\n backtestDetail: '/backtest_detail.ashx\\\\?id=:backtestId',\r\n backtestPresets: 'backtests.ashx\\\\?presets=1',\r\n}\r\n\r\nexport const link = {\r\n toHome: () => path.home,\r\n toNews: () => path.news,\r\n toScreener: () => path.screener,\r\n toCharts: () => path.charts,\r\n toGroups: () => path.groups,\r\n toPortfolio: () => path.portfolio,\r\n toInsider: () => path.insider,\r\n toElite: () => path.elite,\r\n toSearch: (ticker: string) => compilePath(path.search, { ticker }, { validate: false }),\r\n toQuote: (ticker: string) => compilePath(path.quote, { ticker }),\r\n toContact: () => path.contact,\r\n\r\n toAlerts: () => path.alerts,\r\n toHelp: () => path.help,\r\n toAccount: () => path.account,\r\n toLogin: () => path.login,\r\n toLogout: () => path.logout,\r\n\r\n toMaps: () => path.maps,\r\n toBubbles: () => path.bubbles,\r\n\r\n toFutures: () => path.futures,\r\n toFuturesPerf: () => path.futuresPerf,\r\n toFuturesCharts: () => path.futuresCharts,\r\n toFuturesChartDetail: (ticker: string) => compilePath(path.futuresChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toForex: () => path.forex,\r\n toForexPerf: () => path.forexPerf,\r\n toForexCharts: () => path.forexCharts,\r\n toForexChartDetail: (ticker: string) => compilePath(path.forexChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toCrypto: () => path.crypto,\r\n toCryptoPerf: () => path.cryptoPerf,\r\n toCryptoCharts: () => path.cryptoCharts,\r\n toCryptoChartDetail: (ticker: string) => compilePath(path.cryptoChartDetail, { ticker: cleanTicker(ticker) }),\r\n\r\n toBacktests: () => path.backtests,\r\n toBacktestCreate: () => path.backtestCreate,\r\n toBacktestDetail: (backtestId: string | number) => compilePath(path.backtestDetail, { backtestId }),\r\n toBacktestPresets: () => path.backtestPresets,\r\n}\r\n","export enum Instrument {\r\n Stock = 'stock',\r\n Forex = 'forex',\r\n Crypto = 'crypto',\r\n Futures = 'futures',\r\n MarketSentiment = 'market_sentiment',\r\n Group = 'group',\r\n}\r\n\r\nexport type RecordType = Record\r\n\r\nexport type PartialBy = Omit & Partial>\r\n\r\nexport type NullableNumbers = { [K in keyof Obj]: Obj[K] extends number ? number | null : Obj[K] }\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 type SortableValue = string | null | number | Date\r\nexport type SortDirectionValue = 1 | -1\r\n","import isPlainObject from 'lodash.isplainobject'\r\nimport { ComponentType, LazyExoticComponent, lazy } from 'react'\r\nimport { ShouldRevalidateFunction, ShouldRevalidateFunctionArgs } from 'react-router-dom'\r\n\r\nimport { getCookie } from '../app/shared/cookie'\r\nimport { parseInitData } from '../app/shared/utils'\r\nimport { CRYPTO_TICKERS } from './constants'\r\nimport { Instrument, SortDirectionValue, SortableValue } from './types'\r\nimport { RecordType } from './types'\r\n\r\n/**\r\n * Function which wraps React.lazy and checks whether a chunk is preloaded\r\n * from async-manifest. If yes, kick in the promise resolve early so we can\r\n * instantly render the component\r\n */\r\nexport function lazyLoadComponent({\r\n chunkName,\r\n load,\r\n}: {\r\n chunkName: string\r\n load: () => Promise<{ default: ComponentType }>\r\n}): LazyExoticComponent> {\r\n // Resolve earlier if prefetch element is present\r\n const hasPreloadElement = document.querySelector(`[data-chunk-id=${chunkName}]`)\r\n\r\n if (hasPreloadElement) {\r\n const componentLoader = load()\r\n\r\n return lazy(() => componentLoader)\r\n }\r\n\r\n return lazy(load)\r\n}\r\n\r\nconst isObject = (value: any): value is RecordType => isPlainObject(value)\r\n\r\n/**\r\n * Parse text as JSON\r\n */\r\nexport function parseAsJSON(value: unknown | Shape): Shape | undefined {\r\n if (isObject(value)) {\r\n return value as Shape\r\n }\r\n\r\n let parsedValue\r\n try {\r\n if (typeof value === 'string') {\r\n parsedValue = JSON.parse(value)\r\n }\r\n } catch (e) {\r\n return\r\n }\r\n return parsedValue\r\n}\r\n\r\n/**\r\n * remove @ symbol from a ticker\r\n */\r\nexport function cleanTicker(ticker: string) {\r\n return ticker.startsWith('@') ? ticker.substring(1) : ticker\r\n}\r\n\r\n/**\r\n * Get instrument for a ticker.\r\n *\r\n * - If ticker doesn’t start with `@` - stock\r\n * - Otherwise\r\n * - one of `CRYPTO_TICKERS` - crypto\r\n * - has length of 6 - forex\r\n * - none of above - future\r\n *\r\n * NOTE: counterpart in charts 'charts/app/utils/chart.js'\r\n */\r\n\r\nexport function getInstrumentForTicker(ticker: string): Instrument {\r\n if (!ticker?.startsWith('@')) return Instrument.Stock\r\n\r\n const cleanedTicker = cleanTicker(ticker)\r\n\r\n if (CRYPTO_TICKERS.includes(cleanedTicker.toUpperCase())) return Instrument.Crypto\r\n if (cleanedTicker.length === 6) return Instrument.Forex\r\n\r\n return Instrument.Futures\r\n}\r\n\r\n/**\r\n * Async load Resize observer polyfill when we need it\r\n */\r\nlet resizeObserverPolyfill: typeof window.ResizeObserver\r\nexport async function loadResizeObserverPolyfill() {\r\n if (typeof window.ResizeObserver === 'undefined') {\r\n const polyfill = await import('resize-observer-polyfill')\r\n resizeObserverPolyfill = polyfill.default\r\n window.ResizeObserver = resizeObserverPolyfill\r\n return resizeObserverPolyfill as typeof window.ResizeObserver\r\n }\r\n}\r\n\r\nexport async function getIsBrave() {\r\n return (navigator.brave && (await navigator.brave.isBrave())) || false\r\n}\r\n\r\nexport function hasDarkModeFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('dark:1')\r\n}\r\n\r\nexport function hasRedesignFeature() {\r\n const ff = getCookie('featureFlags')\r\n return ff.includes('redesign:1')\r\n}\r\n\r\nexport function isRedesignFeatureEnabled() {\r\n return hasRedesignFeature() || hasDarkModeFeature()\r\n}\r\n\r\nexport function isDarkModeFeatureEnabled() {\r\n const theme = getCookie('chartsTheme')\r\n return isRedesignFeatureEnabled() && theme.includes('dark')\r\n}\r\n\r\nexport enum ChildPosition {\r\n topLeft,\r\n topRight,\r\n bottomLeft,\r\n bottomRight,\r\n center,\r\n topCenter,\r\n rightCenter,\r\n bottomCenter,\r\n leftCenter,\r\n}\r\n\r\nexport function getFlexAlignClasses(position: ChildPosition) {\r\n return {\r\n 'justify-start': [ChildPosition.topLeft, ChildPosition.bottomLeft, ChildPosition.leftCenter].includes(position),\r\n 'justify-center': [ChildPosition.center, ChildPosition.topCenter, ChildPosition.bottomCenter].includes(position),\r\n 'justify-end': [ChildPosition.topRight, ChildPosition.bottomRight, ChildPosition.rightCenter].includes(position),\r\n 'items-start': [ChildPosition.topLeft, ChildPosition.topRight, ChildPosition.topCenter].includes(position),\r\n 'items-center': [ChildPosition.center, ChildPosition.rightCenter, ChildPosition.leftCenter].includes(position),\r\n 'items-end': [ChildPosition.bottomLeft, ChildPosition.bottomRight, ChildPosition.bottomCenter].includes(position),\r\n }\r\n}\r\n\r\ninterface NumberFormatOptions {\r\n fractions: number\r\n showPlusSign: boolean\r\n defaultValue: string\r\n}\r\n\r\nconst intlCache: { [key: number]: Intl.NumberFormat } = {}\r\nfunction getIntl(fractions: number) {\r\n if (!intlCache[fractions])\r\n intlCache[fractions] = new Intl.NumberFormat('en-US', {\r\n minimumFractionDigits: fractions,\r\n maximumFractionDigits: fractions,\r\n })\r\n return intlCache[fractions]\r\n}\r\n\r\nexport function shortFormatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n let num = value\r\n if (num === undefined || num === null || !Number.isFinite(num)) return defaultValue\r\n\r\n let suffix = ''\r\n const absValue = Math.abs(num)\r\n if (absValue >= 1e9) {\r\n num /= 1e9\r\n suffix = 'B'\r\n } else if (absValue >= 1e6) {\r\n num /= 1e6\r\n suffix = 'M'\r\n } else if (absValue >= 1000) {\r\n num /= 1000\r\n suffix = 'K'\r\n }\r\n\r\n const formatted = getIntl(fractions).format(num)\r\n\r\n return (showPlusSign && num > 0 ? '+' : '') + formatted + suffix\r\n}\r\n\r\nexport function formatNumber(\r\n value: number | null | undefined,\r\n { fractions = 2, showPlusSign = false, defaultValue = '-' }: Partial = {}\r\n) {\r\n if (value === undefined || value === null) return defaultValue\r\n\r\n const fixedValue = value.toFixed(fractions)\r\n const prefix = showPlusSign && value > 0 ? '+' : ''\r\n\r\n if (parseFloat(fixedValue) === 0 && value !== 0) {\r\n return {prefix + fixedValue}\r\n }\r\n\r\n const formatted = getIntl(fractions).format(value)\r\n\r\n return prefix + formatted\r\n}\r\n\r\nexport interface SortByColumnOptions {\r\n /**\r\n * Change order of `null` values.\r\n * - `false` Force sort null as first (asc) and last (desc)\r\n * - `true` Always sort null as last regardless of order\r\n * @default false\r\n */\r\n sortNullAsLast?: boolean\r\n\r\n /**\r\n * When true, null values will not be treated as special values\r\n * @default false\r\n */\r\n ignoreNullForComparison?: boolean\r\n}\r\n\r\nexport function sortByColumn(\r\n options: SortByColumnOptions & {\r\n a: ItemType\r\n b: ItemType\r\n direction: SortDirectionValue\r\n valueGetter?: (row: ItemType) => SortableValue\r\n }\r\n) {\r\n const valueA = options.valueGetter?.(options.a)\r\n const valueB = options.valueGetter?.(options.b)\r\n // Compare as strings\r\n if (typeof valueA === 'string' && typeof valueB === 'string') return valueA.localeCompare(valueB) * options.direction\r\n\r\n // Always sort null last if enabled\r\n if (options.sortNullAsLast && valueA === null) return Infinity\r\n if (options.sortNullAsLast && valueB === null) return -Infinity\r\n\r\n // Sort null first/last depending on direction\r\n if (!options.ignoreNullForComparison && valueA === null) return -options.direction\r\n if (!options.ignoreNullForComparison && valueB === null) return options.direction\r\n\r\n // Compare as numbers\r\n return (Number(valueA) - Number(valueB)) * options.direction\r\n}\r\n\r\nexport function moveItemInArray(arr: ItemType[], sourceIndex: number, destinationIndex: number) {\r\n // make sure sourceIndex and destinationIndex are inside of arr\r\n const from = Math.max(0, Math.min(sourceIndex, arr.length - 1))\r\n const to = Math.min(arr.length - 1, Math.max(destinationIndex, 0))\r\n\r\n const items = [...arr]\r\n const [removed] = items.splice(from, 1)\r\n items.splice(to, 0, removed)\r\n\r\n return items\r\n}\r\n\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/**\r\n * This fn creates a revalidator rule which always revalidates loader when the\r\n * specified keys change but ignores changes to other keys. It also allows\r\n * `revalidator.revalidate` to work even if the query didn’t\r\n */\r\nexport function revalidateOnQueryChange(keys: string[]): ShouldRevalidateFunction {\r\n return (args) => {\r\n const prevParams = args.currentUrl.searchParams\r\n const nextParams = args.nextUrl.searchParams\r\n const requiredChanged = keys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n const otherQueryKeys = [...prevParams.keys(), ...nextParams.keys()].filter(\r\n (key, index, arr) => !keys.includes(key) && arr.indexOf(key) === index\r\n )\r\n const otherChanged = otherQueryKeys.some((key) => prevParams.get(key) !== nextParams.get(key))\r\n\r\n if (!requiredChanged && otherChanged) {\r\n return false\r\n }\r\n\r\n return args.defaultShouldRevalidate\r\n }\r\n}\r\n\r\n/**\r\n * This fn does the same as `revalidateOnQueryChange`\r\n * except you need to provide `ShouldRevalidateFunctionArgs` manually\r\n */\r\nexport function shouldRevalidateOnQueryChange(args: ShouldRevalidateFunctionArgs, keys: string[]) {\r\n return revalidateOnQueryChange(keys)(args)\r\n}\r\n\r\nexport function parseRouteInitData({\r\n elementId = 'route-init-data',\r\n fallback,\r\n removeElement = true,\r\n}: { elementId?: string; fallback?: DataType; removeElement?: boolean } = {}): DataType | null {\r\n const element = document.getElementById(elementId)\r\n let initialData = fallback\r\n\r\n if (!element) return fallback ?? null\r\n\r\n try {\r\n const parsedData = parseInitData(elementId)\r\n if (removeElement) element.remove()\r\n\r\n if (parsedData) initialData = parsedData\r\n } catch {\r\n initialData = fallback\r\n }\r\n\r\n return initialData ?? null\r\n}\r\n"],"names":["decodeQueryString","vars","arguments","length","undefined","window","location","search","substring","split","obj","forEach","pair","delimiterPos","indexOf","key","decodeURIComponent","value","encodeQueryString","values","whitelistedValues","Object","keys","reduce","prev","includes","encodeURIComponent","getParsedCookies","cookieName","parseCookies","document","cookie","map","cookieString","acc","v","trim","getCookie","name","re","RegExp","replace","setCookie","expires","toUTCString","test","hostname","sentryOptions","dsn","allowUrls","release","FinvizSentrySettings","sendDefaultPii","integrations","dedupeIntegration","extraErrorDataIntegration","httpClientIntegration","ignoreErrors","Sentry","beforeSend","event","id","String","_window$FinvizSetting","_window$FinvizSetting2","dpr","devicePixelRatio","redesign","FinvizSettings","hasRedesignEnabled","dark","hasDarkTheme","innerWidth","innerHeight","captureException","captureMessage","withScope","formatDateToStringUS","date","toLocaleDateString","day","month","year","parseInitData","elementId","initDataElement","getElementById","JSON","parse","textContent","e","getSidebarFromCookie","chartsUrl","decodedCookie","sidebar","BUTTON_DEFAULT_ELEMENT","BUTTON_BASE_CLASS","BUTTON_FOCUS_STYLES","ButtonSize","ButtonPadding","ButtonAlign","ButtonSquareSize","ButtonRounding","ButtonTheme","getButtonTheme","theme","active","light","button","classnames","lightTransparent","blue","violet","blueHover","red","headerItem","icon","menuItem","menuItemTransparent","menuItemDark","opacity","outline","chip","chipTransparent","link","tab","ButtonComponent","_ref","ref","as","asComponent","size","rounding","focusRing","appearance","align","padding","contentClass","leftContent","rightContent","className","children","props","isSquare","buttonTheme","React","buttonPadding","buttonSize","buttonRounding","hasIcons","_jsxs","_Fragment","_jsx","isValidIconName","Icon","left","center","xxsmall","xsmall","none","small","regular","medium","large","Button","Delayed","delay","timeout","throwOnTimeout","delayComponent","timeoutComponent","visible","setVisible","hasTimedOut","setHasTimedOut","visibilityTimeout","setTimeout","failedTimeout","Error","clearTimeout","ErrorView","title","message","showContact","showRefresh","Heading","level","Paragraph","href","toContact","origin","pathname","DefaultErrorBoundary","_ref2","error","useEffect","console","stringify","RouterErrorElement","useRouteError","width","height","iconList","fileName","filter","Boolean","join","concat","versionImages","Component","root","chartLayouts","chartTools","chartTypes","add","arrowDownShort","arrowForward","arrowUpShort","briefcase","calendar","caretDown","caretLeft","caretRight","caretUp","caretVertical","chartBar","chartBubble","chartPie","chartTable","chartTreemap","chevronDown","chevronRight","close","darkMode","diamondOutlined","done","drag","draw","empty","exitFullscreen","flash","fullscreen","gesture","gift","hamburger","help","idea","ideaLoad","ideaSave","info","interval","lightMode","lock","lockOpened","menuClose","minus","more","note","palette","profile","publish","refresh","remove","restore","settings","settingsWheel","share","signOut","star","starOutlined","switchHorizontal","switchVertical","tabKey","template","trashCan","trendingDown","trendingUp","triangle","triangleOutlineDown","triangleOutlineUp","warning","layout1h1v","layout1h2v","layout1h3v","layout1l2r","layout1t2b","layout2h1v","layout2h2v","layout3h1v","layout3h2v","drawingActionDelete","drawingSettingAutosaveOff","drawingSettingAutosaveOn","drawingSettingAutosaveSaving","drawingSettingDrawingMode","drawingSettingDrawingModeActive","drawingSettingHide","drawingSettingLock","drawingSettingPreserveDrawings","drawingSettingPreserveDrawingsActive","drawingSettingShow","drawingSettingUnlock","toolArrow","toolBrush","toolCallout","toolCurve","toolElliottWave","toolEllipse","toolExpand","toolFibonacci","toolLine","toolMeasure","toolMidLineH","toolMidLineV","toolMouse","toolPitchfork","toolPolygon","toolPosition","toolRect","toolRectRotated","toolText","toolTriangle","toolXABCD","candleBarBasic","candleBarHeikinAshi","candleBarHollow","lineChartType","ohlcChartType","Loading","Spinner","LoadingScreen","NotificationPosition","NotificationContext","show","hide","useNotification","NotificationWrapper","isOpen","setIsOpen","notification","setNotification","viewport","setViewport","useVisualViewport","enabled","context","element","options","getVisualViewport","visualViewport","positionClass","_notification$options","position","BottomLeft","TopLeft","TopRight","BottomRight","WrapperComponent","inline","Ariakit","Provider","current","role","unmountOnHide","open","onClose","modal","backdrop","focusable","hideOnEscape","hideOnInteractOutside","autoFocusOnShow","autoFocusOnHide","style","transform","top","scale","willChange","withNotificationContext","WrappedComponent","_WrappedComponent$dis","displayName","WithNotificationContext","notificationContext","Notification","closeText","actions","timeoutInMs","timeoutId","isProgressBar","progress","radius","strokeWidth","circleXY","circumference","Math","PI","viewBox","xmlns","cx","cy","r","strokeDasharray","strokeDashoffset","strokeLinecap","getHeadingElement","Label","_ref3","titleClassName","isHorizontal","CRYPTO_TICKERS","TIMEFRAME","SpecificChartFunctionality","SETTINGS_CONTEXT_DEFAULT","nodeChartsDomain","hasUserPremium","email","SettingsContext","createContext","useSettings","useContext","CachedLoaderDataContext","useCachedLoaderData","CachedLoaderDataContextProvider","isNullValidData","loaderData","useLoaderData","dataCacheRef","data","isCached","_visualViewport$width","_visualViewport$heigh","_visualViewport$scale","_visualViewport$offse","_visualViewport$offse2","offsetTop","offsetLeft","round","unscaledWidth","unscaledHeight","onScroll","_window$visualViewpor","_window$visualViewpor2","handleChange","throttle","ev","currentTarget","addEventListener","_window$visualViewpor3","_window$visualViewpor4","removeEventListener","QuoteRoutes","getOptionsBundle","OptionsRoute","lazyLoadComponent","chunkName","load","getRevenueBundle","RevenueRoute","quoteRouteType","URLSearchParams","get","QuoteRoutesSwitch","OptionsChain","Revenue","ChartsRoute","getPortfolioBundle","PortfolioViewRoute","then","mod","portfolioView","PortfolioCreateRoute","portfolioEmpty","getPortfolioEditBundle","PortfolioEditRoute","getSaveToPortfolioBundle","SaveToPortfolioRoute","getCreateAlertBundle","CreateAlertRoute","router","createBrowserRouter","path","Outlet","errorElement","Suspense","fallback","loader","args","action","shouldRevalidate","revalidateOnQueryChange","request","url","currentUrl","searchParams","shouldRevalidateOnQueryChange","QuoteRouteSwitch","ScrollRestoration","ReactDOM","ErrorBoundary","FallbackComponent","RouterProvider","ContentType","ThrowableError","constructor","status","body","extra","super","_defineProperty","this","isServerError","apiRequest","_ContentType","query","headers","throwOnAllErrors","controller","AbortController","requestUrl","requestOptions","ApplicationJson","cancelableRequest","fetch","signal","async","textResponse","response","text","responseContentType","Html","parsedResponse","contentType","ApplicationJsonUTF","FormUrlEncoded","parseResponseForContentType","ok","statusText","rayId","catch","scope","setContext","cancel","abort","searchApiRequest","input","portfoliosRequest","fields","lastCloseRequest","ticker","t","portfolioLimitRequest","portfolioId","pid","setCookieRequest","compilePath","params","pathToRegexp","toHome","toNews","toScreener","toCharts","toGroups","toPortfolio","toInsider","toElite","toSearch","validate","toQuote","toAlerts","toHelp","toAccount","toLogin","toLogout","toMaps","toBubbles","toFutures","toFuturesPerf","toFuturesCharts","toFuturesChartDetail","cleanTicker","toForex","toForexPerf","toForexCharts","toForexChartDetail","toCrypto","toCryptoPerf","toCryptoCharts","toCryptoChartDetail","toBacktests","toBacktestCreate","toBacktestDetail","backtestId","toBacktestPresets","Instrument","DateRangeType","querySelector","componentLoader","lazy","startsWith","getInstrumentForTicker","Stock","cleanedTicker","toUpperCase","Crypto","Forex","Futures","resizeObserverPolyfill","loadResizeObserverPolyfill","ResizeObserver","polyfill","default","getIsBrave","navigator","brave","isBrave","ChildPosition","getFlexAlignClasses","topLeft","bottomLeft","leftCenter","topCenter","bottomCenter","topRight","bottomRight","rightCenter","intlCache","getIntl","fractions","Intl","NumberFormat","minimumFractionDigits","maximumFractionDigits","shortFormatNumber","showPlusSign","defaultValue","num","Number","isFinite","suffix","absValue","abs","format","formatNumber","fixedValue","toFixed","prefix","parseFloat","toString","sortByColumn","_options$valueGetter","_options$valueGetter2","valueA","valueGetter","call","a","valueB","b","localeCompare","direction","sortNullAsLast","Infinity","ignoreNullForComparison","moveItemInArray","arr","sourceIndex","destinationIndex","from","max","min","to","items","removed","splice","getUuid","_window$crypto$random","_window$crypto","_window$crypto$random2","crypto","randomUUID","c","getRandomValues","Uint8Array","prevParams","nextParams","nextUrl","requiredChanged","some","otherChanged","index","defaultShouldRevalidate","parseRouteInitData","_initialData","removeElement","initialData","parsedData"],"sourceRoot":""}