{ "version": 3, "sources": ["../../../app/utils/currency.ts", "../../../app/elemason/utils/product.ts", "../../../app/analytics/product/product.ts", "../../../app/hooks/window/useOnWindowScroll.ts", "../../../app/hooks/window/useWindowSize.ts", "../../../app/hooks/window/useWindowScrollY.ts", "../../../app/contexts/toast/ToastContext.tsx", "../../../app/contexts/toast/Toast.tsx", "../../../app/contexts/toast/useToastContextValue.ts", "../../../app/contexts/toast/ToastProvider.tsx"], "sourcesContent": ["import { CurrencyCode } from '~/typings/models';\n\n// TODO: Refactor this as needed when different locales are required.\n// `en-IN` is used for now.\nconst toCurrency = (amount: number, code: CurrencyCode = CurrencyCode.INR) =>\n (+amount).toLocaleString('en-IN', {\n currency: code,\n style: 'currency',\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n currencyDisplay: 'symbol'\n });\n\nexport { toCurrency };\n", "import { StockStatus } from '~/typings/models';\nimport { toCurrency } from '~/utils/currency';\n\nimport type { ProductPricingConfig } from '~/elemason/typings';\nimport type { ProductVariant, SpendableCoins } from '~/typings/models';\nimport type { Money } from '~/typings/models/Money';\nimport type { Maybe } from '~/typings/utils';\n\n// TODO: Move this file to common utils module instead of elemason utils.\n\nconst isOutOfStock = (stockStatus: StockStatus): boolean =>\n stockStatus === StockStatus.OUT_OF_STOCK;\n\nconst isProductOOS = (variants: ProductVariant[]): boolean =>\n variants.every((variant) => isOutOfStock(variant.stockStatus));\n\n// Temp hack to hide variant selection when for a category that can have only\n// only one variant.\nconst isDefaultVariant = ({\n basisAttr1Name,\n}: Pick): boolean =>\n basisAttr1Name.toLowerCase() === 'title';\n\nconst getDiscountText = (\n variant: Pick<\n ProductVariant,\n 'mrp' | 'price' | 'discountPercentage' | 'additionalFields'\n >,\n config?: ProductPricingConfig\n): Maybe => {\n const { mrp, price, discountPercentage } = variant;\n const amount = Math.floor(mrp.amount - price.amount);\n\n if (amount === 0 || !discountPercentage) {\n return null;\n }\n const isAmount = config?.discount?.format === 'amount';\n\n // TODO: Use discount text template.\n if (isAmount) {\n return `${toCurrency(amount, mrp.currencyCode)} OFF`;\n }\n\n return `${Math.floor(discountPercentage)}% OFF`;\n};\n\nconst getCoinsText = (price: Money, coins: SpendableCoins) => {\n if (price.amount - coins.currentlyApplicable.fiat.amount === 0) {\n return coins.currentlyApplicable.coins;\n }\n\n return `${toCurrency(\n price.amount - coins.currentlyApplicable.fiat.amount,\n price.currencyCode\n )} + ${coins.currentlyApplicable.coins}`;\n};\n\nexport {\n getCoinsText,\n getDiscountText,\n isDefaultVariant,\n isOutOfStock,\n isProductOOS,\n};\n", "import { track } from '~/analytics/utils';\nimport { isOutOfStock } from '~/elemason/utils';\n\nimport type { ProductEventNames } from './event';\nimport type {\n AnalyticsProductEventPayload,\n AnalyticsProductImpressionPayload,\n} from './product.types';\nimport { Logger } from '~/logger';\n\n\nconst toProductImpressionPayload = ({\n index,\n product,\n variant,\n searchParams,\n}: AnalyticsProductImpressionPayload) => {\n const auxVariant =\n variant ??\n product.variants!.find((v) => isOutOfStock(v.stockStatus)) ??\n product.variants![0];\n return {\n index,\n productId: product.simpleId,\n productGroupId: null,\n productHandle: product.slug,\n itemId: auxVariant.sku,\n currency: auxVariant.currency,\n discount: auxVariant.mrp.amount - auxVariant.price.amount,\n itemBrand: product.brand,\n itemCategory: product.category,\n mrp: auxVariant.mrp.amount,\n sellingPrice: auxVariant.price.amount,\n productTitle: product.title,\n productVariant: auxVariant.basisAttr1Display,\n itemVariant: auxVariant.title,\n page: searchParams ? (searchParams.page as string) : undefined,\n searchParams,\n };\n};\n\nconst trackProductEvent = (\n event: ProductEventNames,\n payload: AnalyticsProductEventPayload\n) => {\n try {\n const { product, variant, ...rest } = payload;\n track(event, {\n ...toProductImpressionPayload({ product, variant }),\n ...rest,\n });\n } catch (error) {\n Logger.error('[trackProductEvent]: Unable to track product event', error);\n }\n};\n\nexport { toProductImpressionPayload, trackProductEvent };\n", "import { debounce } from 'lodash-es';\nimport { useEffect, useRef } from 'react';\nimport { useClientLayoutEffect } from '~/hooks/common';\n\nconst useOnWindowScroll = (callback: EventListener, debounceMs = 50) => {\n const cbRef = useRef(callback);\n\n useClientLayoutEffect(() => {\n cbRef.current = callback;\n }, [callback, cbRef]);\n\n useEffect(() => {\n const onScroll = debounce((...args) => {\n cbRef.current(...args);\n }, debounceMs);\n\n window.addEventListener('scroll', onScroll);\n return () => {\n window.removeEventListener('scroll', onScroll);\n };\n }, [debounceMs]);\n};\n\nexport default useOnWindowScroll;\n", "import { useState } from 'react';\nimport { useClientLayoutEffect } from '~/hooks/common';\n\nimport type { WindowSize } from '~/typings/styles';\n\nconst useWindowSize = (): WindowSize => {\n // TODO: Initial width and height are set to negative that is causing flicker\n // cause component are using these values. We window object is not available\n // during SSR because of that we can't use any reliable value. Figure out\n // a reliable way to solve this problem.\n const [size, setSize] = useState({ width: -1, height: -1 });\n\n useClientLayoutEffect(() => {\n const onResize = () => {\n setSize({ width: window.innerWidth, height: window.innerHeight });\n };\n\n onResize();\n window.addEventListener('resize', onResize);\n\n return () => {\n window.removeEventListener('resize', onResize);\n };\n }, [setSize]);\n\n return size;\n};\n\nexport default useWindowSize;\n", "import { useCallback, useState } from 'react';\nimport useOnWindowScroll from './useOnWindowScroll';\n\nconst useWindowScrollY = (debounceMs = 200) => {\n const [scrollY, setScrollY] = useState(0);\n\n const onScroll: EventListener = useCallback(() => {\n setScrollY(window.scrollY);\n }, [setScrollY]);\n\n useOnWindowScroll(onScroll, debounceMs);\n return scrollY;\n};\n\nexport default useWindowScrollY;\n", "import { createContext } from '~/utils/react';\n\nimport type { ToastContextType } from './ToastContext.types';\n\n\nconst errorMessage =\n 'useToastContext must be inside a ToastProvider with a value';\n\nconst name = 'ToastContext';\n\nconst [ToastProvider, useToastContext, ToastContext] =\n createContext({ errorMessage, name });\n\nexport { ToastContext, ToastProvider, useToastContext };\n", "import {\n ToastProvider as RdxToastProvider,\n ToastAction,\n ToastDescription,\n ToastViewport\n} from '@radix-ui/react-toast';\nimport clsx from 'clsx';\nimport { useToastContext } from './ToastContext';\nimport { useRootContext } from '~/contexts/root';\nimport { Box, Button, HStack, ToastRoot, Typography } from '~/uikit/components';\n\nimport type { FC } from 'react';\nimport type { ToastProps } from './ToastContext.types';\n\n// TODO: Refactor this whole component and make it more generic.\nconst Toast: FC = () => {\n const { isMobile } = useRootContext();\n const { isOpen, onClose, message, onAction, duration } = useToastContext();\n\n return (\n \n \n \n \n \n {/* \n TODO: Using style cause typography component is using twMerge\n internally to apply classes because of that text-white overrides\n all the other text classes.\n */}\n \n {message}\n \n \n \n\n {onAction ? (\n \n \n Retry\n \n \n ) : null}\n \n \n \n \n );\n};\n\nexport default Toast;\n", "import { useCallback, useMemo, useState } from 'react';\n\nimport type { ToastContextType, ToastOptions } from './ToastContext.types';\n\n// TODO: Refactor this entire hook. We should have two hooks\n// 1. One responsible for creating context value\n// 2. Responsible for exposing necessary values to context consumer. Something\n// like useToast({duration: 1000})\nconst useToastContextValue = (): ToastContextType => {\n // TODO: Use reducer.\n const [isOpen, setIsOpen] = useState(false);\n const [options, setToastOptions] = useState();\n const onClose = useCallback(() => setIsOpen(false), [setIsOpen]);\n const showToast = useCallback(\n (message: string, options: Omit = {}) => {\n setIsOpen(true);\n setToastOptions({ ...options, message });\n },\n [setToastOptions, setIsOpen]\n );\n\n const dismissToast = useCallback(() => {\n setIsOpen(false);\n setToastOptions({ message: '' });\n }, [setToastOptions, setIsOpen]);\n\n return useMemo(\n () => ({ isOpen, onClose, showToast, dismissToast, ...options }),\n [options, isOpen, onClose, showToast, dismissToast]\n );\n};\n\nexport default useToastContextValue;\n", "import Toast from './Toast';\nimport { ToastProvider } from './ToastContext';\nimport useToastContextValue from './useToastContextValue';\n\nimport type { ToastProviderWrapperProps } from './ToastContext.types';\nimport type { FC } from 'react';\n\nconst ToastProviderWrapper: FC = ({ children }) => {\n const value = useToastContextValue();\n return (\n \n {children}\n \n \n );\n};\n\nexport default ToastProviderWrapper;\n"], "mappings": "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", "names": ["toCurrency", "amount", "code", "isOutOfStock", "stockStatus", "isProductOOS", "variants", "variant", "isDefaultVariant", "basisAttr1Name", "getDiscountText", "config", "mrp", "price", "discountPercentage", "amount", "toCurrency", "getCoinsText", "coins", "toProductImpressionPayload", "index", "product", "variant", "searchParams", "auxVariant", "v", "isOutOfStock", "trackProductEvent", "event", "payload", "rest", "track", "error", "Logger", "import_react", "useOnWindowScroll", "callback", "debounceMs", "cbRef", "useClientLayoutEffect_default", "onScroll", "debounce_default", "args", "useOnWindowScroll_default", "import_react", "useWindowSize", "size", "setSize", "useClientLayoutEffect_default", "onResize", "useWindowSize_default", "import_react", "useWindowScrollY", "debounceMs", "scrollY", "setScrollY", "onScroll", "useOnWindowScroll_default", "useWindowScrollY_default", "errorMessage", "name", "ToastProvider", "useToastContext", "ToastContext", "context_default", "import_jsx_runtime", "Toast", "isMobile", "useRootContext", "isOpen", "onClose", "message", "onAction", "duration", "useToastContext", "$054eb8030ebde76e$export$f5d03d415824e0e", "$054eb8030ebde76e$export$be92b6f5f03c0fe9", "clsx_m_default", "HStack_default", "$054eb8030ebde76e$export$ecddd96c53621d9a", "Box_default", "Typography_default", "$054eb8030ebde76e$export$3019feecfda683d2", "Button_default", "$054eb8030ebde76e$export$6192c2425ecfd989", "Toast_default", "import_react", "useToastContextValue", "isOpen", "setIsOpen", "options", "setToastOptions", "onClose", "showToast", "message", "dismissToast", "useToastContextValue_default", "import_jsx_runtime", "ToastProviderWrapper", "children", "value", "useToastContextValue_default", "ToastProvider", "Toast_default", "ToastProvider_default"] }