{ "version": 3, "sources": ["../../../app/hooks/fetchers/useCollectionsFetcher/useCollectionsFetcher.ts", "../../../app/elemason/utils/search.ts", "../../../app/hooks/fetchers/useCollectionsFetcher/index.ts", "../../../app/hooks/fetchers/useCollectionFetcher/useCollectionFetcher.ts", "../../../app/hooks/fetchers/useCollectionFetcher/index.ts", "../../../app/hooks/fetchers/useAddToCartFetcher/useAddToCartFetcher.ts", "../../../app/hooks/fetchers/useAddToCartFetcher/index.ts", "../../../app/hooks/fetchers/userOrdersFetcher/useOrdersFetcher.ts", "../../../app/hooks/fetchers/userOrdersFetcher/index.ts", "../../../app/hooks/fetchers/useRemoveFromWishlistFetcher/useRemoveFromWishlist.ts", "../../../app/hooks/fetchers/useRemoveFromWishlistFetcher/index.ts", "../../../app/hooks/fetchers/useLookFetcher/useLookFetcher.ts", "../../../app/hooks/fetchers/useLookFetcher/index.ts", "../../../app/hooks/fetchers/usePageFetcher/usePageFetcher.ts", "../../../app/hooks/fetchers/usePageFetcher/index.ts", "../../../app/hooks/fetchers/useProductsFetcher/useProductsFetcher.ts", "../../../app/hooks/fetchers/useProductsFetcher/index.ts", "../../../app/hooks/fetchers/useCartFetcher/useCartFetcher.ts", "../../../app/hooks/fetchers/useCartFetcher/index.ts", "../../../app/hooks/fetchers/useCartLineFetcher/useCartLineFetcher.ts", "../../../app/hooks/fetchers/useCartLineFetcher/index.ts", "../../../app/hooks/fetchers/useAddressesFetcher/useAddressesFetcher.ts", "../../../app/hooks/fetchers/useAddressesFetcher/index.ts", "../../../app/hooks/fetchers/useOrderRequestReasonsFetcher/useOrderRequestReasonsFetcher.ts", "../../../app/hooks/fetchers/useOrderRequestReasonsFetcher/index.ts", "../../../app/hooks/fetchers/useProductFetcher/useProductFetcher.ts", "../../../app/hooks/fetchers/useProductFetcher/index.ts", "../../../app/hooks/fetchers/useCartLiteFetcher/useCartLiteFetcher.ts", "../../../app/hooks/fetchers/useCartLiteFetcher/index.ts", "../../../app/hooks/fetchers/useAddToWishlistFetcher/useAddToWishlist.ts", "../../../app/hooks/fetchers/useAddToWishlistFetcher/index.ts", "../../../app/hooks/fetchers/useExpressCheckoutFetcher/useExpressCheckoutFetcher.tsx", "../../../app/hooks/fetchers/useExpressCheckoutFetcher/index.ts", "../../../app/hooks/fetchers/useLooksFetcher/useLooksFetcher.ts", "../../../app/hooks/fetchers/useLooksFetcher/index.ts", "../../../app/hooks/fetchers/search/useSearchFacetsFetcher.ts", "../../../app/hooks/fetchers/country/useCountriesFetcher.ts", "../../../app/hooks/fetchers/country/useCountryFetcher.ts"], "sourcesContent": ["import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { flattenSource } from '~/elemason/utils';\nimport { isLoading } from '~/utils/remix';\nimport { stringify } from '~/utils/url';\n\nimport type { CollectionsApiRouteLoaderResponse } from '~/typings/remix';\nimport type { SearchQuerySource } from '~/typings/models';\n\nconst PER_PAGE = 10;\n\nconst useCollectionsFetcher = (\n source: SearchQuerySource,\n perPage = PER_PAGE\n) => {\n const {\n data: fetcherData,\n state,\n load: fetchCollections,\n } = useFetcher>();\n\n const [collections, setCollections] = useState([]);\n const hasMoreRef = useRef(true);\n\n const page = fetcherData?.data?.page ?? 1;\n\n const load = useCallback(\n (page = 1) => {\n if (!hasMoreRef.current) {\n return;\n }\n const params = { ...flattenSource(source), page, perPage };\n const url = stringify('/api/collections', params);\n fetchCollections(url);\n },\n [fetchCollections, source, hasMoreRef, perPage]\n );\n\n useEffect(() => load(), [load]);\n\n // TODO: Create a hook for pagination that have will have support for everything\n // we need for infinite scroll.\n useEffect(() => {\n const hits = fetcherData?.data?.hits;\n if (!hits) {\n return;\n }\n hasMoreRef.current = hits.length === PER_PAGE;\n setCollections((collections) => [...collections, ...(hits as T[])]);\n }, [setCollections, hasMoreRef, fetcherData]);\n\n return { collections, load, page, isLoading: isLoading(state) };\n};\n\nexport default useCollectionsFetcher;\n", "\nimport { ActionType, type NavigationAction } from '~/typings/action';\nimport {\n SearchFacetControlType,\n type SearchFacet,\n type SearchQuerySource,\n} from '~/typings/models';\nimport { stringify } from '~/utils/url';\n\nimport type { Optional } from '~/typings/utils';\n\nconst flattenSource = (source: SearchQuerySource) => ({\n collection: source.collection,\n ...(source.query as object),\n});\n\nconst toNavAction = (\n source?: SearchQuerySource,\n pathname = '/pages/search'\n): Optional => {\n if (!source) {\n return;\n }\n return {\n type: ActionType.NAVIGATION,\n payload: { pathname, ...(source.query as object) },\n };\n};\n\nconst toNavUrl = (params: SearchQuerySource, pathname = '/pages/search') =>\n stringify(pathname, (params.query ?? {}) as object);\n\nconst isRangeControl = (facet: SearchFacet) =>\n facet.controlType === SearchFacetControlType.RANGE;\n\nconst isCheckboxControl = (facet: SearchFacet) =>\n facet.controlType === SearchFacetControlType.CHECKBOX;\n\nexport {\n flattenSource,\n isCheckboxControl,\n isRangeControl,\n toNavAction,\n toNavUrl,\n};\n", "import useCollectionsFetcher from './useCollectionsFetcher';\n\nexport default useCollectionsFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useEffect } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { CollectionSlugApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst useCollectionFetcher = (slug: string) => {\n const {\n data: fetcherData,\n state,\n load,\n } = useFetcher();\n\n const collection = fetcherData?.data?.collection ?? null;\n\n useEffect(() => {\n const url = `/api/collections/${slug}`;\n load(url);\n }, [load, slug]);\n\n return { collection, isLoading: isLoading(state) };\n};\n\nexport default useCollectionFetcher;\n", "import useCollectionFetcher from './useCollectionFetcher';\n\nexport default useCollectionFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { isSubmitting } from '~/utils/remix';\n\nimport type { SubmitOptions } from '@remix-run/react';\nimport type { UserCartLinesApiRouteActionResponse } from '~/typings/remix';\n\n\nconst options: SubmitOptions = {\n method: 'POST',\n action: '/api/user/cart/lines',\n};\n\nconst useAddToCartFetcher = () => {\n const {\n submit: fetcherSubmit,\n data,\n state,\n } = useFetcher();\n\n const addToCart = useCallback(\n (variantId: string, quantity = 1) => {\n // form data doesn't support array of object. :|\n const payload = { lines: JSON.stringify([{ quantity, variantId }]) };\n fetcherSubmit(payload, options);\n },\n [fetcherSubmit]\n );\n\n const addToCartMultiple = useCallback(\n (lineItems: { variantId: string; quantity?: number }[]) => {\n const payload = { lines: JSON.stringify(lineItems) };\n fetcherSubmit(payload, options);\n },\n [fetcherSubmit]\n );\n\n return {\n data,\n addToCart,\n addToCartMultiple,\n isSubmitting: isSubmitting(state),\n };\n};\n\nexport default useAddToCartFetcher;\n", "import useAddToCartFetcher from './useAddToCartFetcher';\n\nexport default useAddToCartFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { isLoading } from '~/utils/remix';\nimport { stringify } from '~/utils/url';\n\nimport type { PaginatedOrders } from '~/typings/models';\nimport type { OrdersApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/user/orders';\n\nconst PAGE_SIZE = 10;\n\nconst toOrders = (orders: PaginatedOrders) =>\n orders.edges.map(({ node }) => node);\n\nconst useOrdersFetcher = (initialData: PaginatedOrders) => {\n const {\n data: fetcherData,\n state,\n load: fetcherLoad,\n } = useFetcher();\n\n const pageInfoRef = useRef(initialData.pageInfo);\n\n const loadMoreOrders = useCallback(\n (first: number = PAGE_SIZE) => {\n const pageInfo = pageInfoRef.current;\n if (!pageInfo.hasNextPage) {\n return;\n }\n\n const path = stringify(url, { after: pageInfo.endCursor, first });\n fetcherLoad(path);\n },\n [fetcherLoad, pageInfoRef]\n );\n\n const [orders, setOrders] = useState(() => toOrders(initialData));\n\n useEffect(() => {\n const data = fetcherData?.data;\n if (!data) {\n return;\n }\n\n // TODO: check for errors from fetcher data and display toast.\n\n const paginatedOrder = data.orders;\n pageInfoRef.current = paginatedOrder.pageInfo;\n setOrders((orders) => [...orders, ...toOrders(data.orders)]);\n }, [fetcherData, setOrders, pageInfoRef]);\n\n return {\n orders,\n loadMoreOrders,\n hasMoreOrders: pageInfoRef.current.hasNextPage,\n isLoading: isLoading(state),\n };\n};\n\nexport default useOrdersFetcher;\n", "import useOrdersFetcher from './useOrdersFetcher';\n\nexport default useOrdersFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { isSubmitting } from '~/utils/remix';\n\nimport type { SubmitOptions } from '@remix-run/react';\nimport type { UserWishlistRemoveProductApiRouteActionResponse } from '~/typings/remix';\n\n\nconst options: SubmitOptions = {\n method: 'DELETE',\n action: '/api/user/wishlist/product',\n};\n\nconst useRemoveFromWishlist = () => {\n const {\n submit: fetcherSubmit,\n data,\n state,\n } = useFetcher();\n\n const removeFromWishlist = useCallback(\n (productId: number) => {\n fetcherSubmit({ productId }, options);\n },\n [fetcherSubmit]\n );\n\n return {\n data,\n removeFromWishlist,\n isSubmitting: isSubmitting(state),\n };\n};\n\nexport default useRemoveFromWishlist;\n", "import useRemoveFromWishlist from './useRemoveFromWishlist';\n\nexport default useRemoveFromWishlist;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { Look } from '~/typings/models';\nimport type { LookSlugApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst useLookFetcher = (slug: string) => {\n const {\n data: fetcherData,\n state,\n load: fetchLook,\n } = useFetcher();\n\n const [look, setLook] = useState();\n const hasMoreRef = useRef(true);\n\n const page = fetcherData?.data?.look ?? 1;\n\n const load = useCallback(() => {\n if (!hasMoreRef.current) {\n return;\n }\n fetchLook(`/api/looks/${slug}`);\n }, [fetchLook, slug, hasMoreRef]);\n\n useEffect(() => {\n slug && load();\n }, [load, slug]);\n\n useEffect(() => {\n const look = fetcherData?.data?.look;\n if (!look) {\n return;\n }\n setLook(look);\n }, [setLook, fetcherData]);\n\n return {\n look,\n page,\n load,\n isLoading: isLoading(state),\n };\n};\n\nexport default useLookFetcher;\n", "import useLookFetcher from './useLookFetcher';\n\nexport default useLookFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useState } from 'react';\nimport { stringify } from '~/utils/url';\n\nimport type { Page as PageType } from '~/elemason/typings';\nimport type { Optional } from '~/typings/utils';\nimport type { UsePageFetcherArgs } from './usePageFetcher.types';\n\n\nconst usePageFetcher = ({\n page: initialPage,\n slug = '/',\n}: UsePageFetcherArgs) => {\n const [page, setPage] = useState>(initialPage);\n const { data: fetcherData, state, load } = useFetcher();\n\n const next = useCallback(() => {\n if (state !== 'idle') {\n return;\n }\n const url = stringify(slug, { per_page: 20 });\n load(url);\n }, [load, state, slug]);\n\n const nPage = fetcherData?.page;\n\n useEffect(() => {\n if (nPage) {\n setPage((prevValue) => {\n const prevBlocks = prevValue?.blocks ?? [];\n return {\n ...prevValue,\n ...nPage,\n blocks: [...prevBlocks, ...nPage.blocks],\n };\n });\n }\n }, [nPage, setPage]);\n\n useEffect(() => {\n setPage(initialPage);\n }, [initialPage])\n\n return { data: page, next };\n};\n\nexport default usePageFetcher;\n", "import usePageFetcher from './usePageFetcher';\n\nexport default usePageFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { useClientLayoutEffect } from '~/hooks/common';\nimport { isLoading } from '~/utils/remix';\nimport { stringify } from '~/utils/url';\nimport { isEmpty, isNil, uniqBy } from 'lodash-es';\n\nimport type { Product, SearchParams } from '~/typings/models';\nimport type { ProductSearchApiRouteLoaderResponse } from '~/typings/remix';\nimport type { ProductsFetcherInitialData } from './useProductsFetcher.types';\n\nconst getUrl = (payload: SearchParams, endPoint?: string): string => {\n const url = endPoint ?? '/api/product/search';\n return stringify(url, payload);\n};\n\nconst PER_PAGE = 20;\n\n// In v2, we have separate end points to fetch products for a collection details page\n// and end point to fetch product for a plp.\nconst useProductsFetcher = (\n searchParams: SearchParams,\n initialData?: ProductsFetcherInitialData\n) => {\n const {\n data: fetcherData,\n state: fetcherState,\n load\n } = useFetcher();\n const endPoint = initialData?.endPoint;\n\n // TODO: We can have an initial state from backend.\n const [products, setProducts] = useState(\n () => initialData?.products ?? []\n );\n\n const paramsRef = useRef(searchParams);\n const count = fetcherData?.data?.found ?? initialData?.count ?? 0;\n const currentPage = fetcherData?.data?.page ?? initialData?.page ?? 0;\n const [hasMore, setHasMore] = useState(products.length < count);\n\n const loadProducts = useCallback(\n (page = 1, perPage?: number) => {\n const params = paramsRef.current;\n const fPerPage = perPage ?? params.perPage ?? PER_PAGE;\n const url = getUrl({ ...params, page, perPage: fPerPage }, endPoint);\n load(url);\n },\n [load, paramsRef, endPoint]\n );\n\n useClientLayoutEffect(() => {\n paramsRef.current = searchParams;\n }, [paramsRef, searchParams]);\n\n useEffect(() => {\n const hits = fetcherData?.data?.hits;\n if (isNil(hits)) {\n return;\n }\n\n setHasMore(hits.length !== 0);\n if (isEmpty(hits)) {\n return;\n }\n setProducts(\n products => uniqBy([...products, ...hits], p => p.id) as Product[]\n );\n }, [fetcherData?.data]);\n\n return {\n count,\n hasMore,\n products,\n loadProducts,\n page: currentPage,\n isLoading: isLoading(fetcherState)\n } as const;\n};\n\nexport default useProductsFetcher;\n", "import useProductsFetcher from './useProductsFetcher';\n\nexport default useProductsFetcher;\n", "import { useFetcher, useFetchers } from '@remix-run/react';\nimport { useEffect, useState } from 'react';\nimport { isLoading, isSubmitting } from '~/utils/remix';\n\nimport type { Fetcher } from '@remix-run/react';\nimport type { Cart } from '~/typings/models';\nimport type { UserCartApiRouteLoaderResponse } from '~/typings/remix';\nimport type { Maybe } from '~/typings/utils';\n\n\nconst url = '/api/user/cart';\n\n// The latency from shopify's cart API is 600ms. That means for any cart interaction\n// if backend takes 300ms, the cart refresh(loaders) will take at least 900ms. 900ms\n// is a perceivable details. To avoid this, we do not revalidate cart loaders. Since,\n// all cart actions, returns the latest cart anyways, we leverage it as is. Remix has\n// useFetchers https://remix.run/docs/en/main/hooks/use-fetchers that tell us inflight\n// fetchers that other part of the applications can use. We leverage the same to\n// to update the cart, since any part of the cart can update it. eg. line items,\n// coupons, remove cart line, etc. All of this should go away when the performance\n// of cart API is improved. Presently, we only use loading state from fetcher cause\n// when action fetchers are done, they only contain data. There's no way to add id\n// and timestamp to a fetcher to figure out which fetchers data is latest.\nconst useCartFetchersState = () => {\n const fetchers = useFetchers();\n\n const fetcher = fetchers.find((fetcher) => {\n const { formAction: action } = fetcher;\n return action ? action.startsWith(url) : false;\n }) as Maybe>;\n\n return fetcher;\n};\n\nconst useCartFetcher = () => {\n const [cart, setCart] = useState>(null);\n const cartFetcher = useFetcher();\n\n const { load: loadCart } = cartFetcher;\n\n const latestFetcher = useCartFetchersState();\n\n const auxState = latestFetcher?.state ?? cartFetcher.state;\n\n useEffect(() => {\n if (latestFetcher?.data?.data) {\n setCart(latestFetcher?.data?.data);\n }\n }, [setCart, latestFetcher?.data?.data]);\n\n useEffect(() => {\n loadCart(url);\n }, [loadCart]);\n\n return {\n cart: cart ?? cartFetcher.data?.data ?? null,\n isLoading: isLoading(auxState) || isSubmitting(auxState),\n };\n};\n\nexport default useCartFetcher;\n", "import useCartFetcher from './useCartFetcher';\n\nexport default useCartFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { isSubmitting } from '~/utils/remix';\n\nimport type { CartLine, CartUpdateLinePayload } from '~/typings/models';\nimport type { UserCartLinesApiRouteActionResponse } from '~/typings/remix';\n\n\nconst url = '/api/user/cart/lines';\n\nconst useCartLineFetcher = () => {\n const {\n submit: fetcherSubmit,\n data,\n state,\n } = useFetcher();\n\n const removeLine = useCallback(\n (line: CartLine) => {\n // form data doesn't support array of object. :|\n const payload = { lineIds: JSON.stringify([line.id]) };\n fetcherSubmit(payload, { method: 'DELETE', action: url });\n },\n [fetcherSubmit]\n );\n\n const updateLine = useCallback(\n (line: CartUpdateLinePayload) => {\n // form data doesn't support array of object. :|\n const payload = { lines: JSON.stringify([line]) };\n fetcherSubmit(payload, { method: 'PATCH', action: url });\n },\n [fetcherSubmit]\n );\n\n return {\n data,\n removeLine,\n updateLine,\n isSubmitting: isSubmitting(state),\n };\n};\n\nexport default useCartLineFetcher;\n", "import useCartLineFetcher from './useCartLineFetcher';\n\nexport default useCartLineFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useEffect } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { AccountAddressesApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/user/addresses';\n\nconst useAddressesFetcher = () => {\n const {\n state,\n data: fetcherData,\n load,\n } = useFetcher();\n\n const addresses = fetcherData?.data?.addresses ?? [];\n\n useEffect(() => {\n load(url);\n }, [load]);\n\n return { addresses, isLoading: isLoading(state) };\n};\n\nexport default useAddressesFetcher;\n", "import useAddressesFetcher from './useAddressesFetcher';\n\nexport default useAddressesFetcher;\n", "import { useFetcher, useParams } from '@remix-run/react';\nimport { useEffect } from 'react';\nimport { stringify, toEncodedIds } from '~/utils/url';\n\nimport type { OrderLineRequests, OrderRequestType } from '~/typings/models';\nimport type { OrderRequestReasonsApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/user/orders';\n\nconst useOrderRequestReasonsFetcher = (\n orderRequests: OrderLineRequests,\n requestType: OrderRequestType\n) => {\n const { data: fetcherData, load } =\n useFetcher();\n\n const { orderId, itemId } = useParams();\n\n const reasons = fetcherData?.data?.reasons ?? [];\n const exchangeOptions = fetcherData?.data?.exchangeOptions ?? [];\n\n useEffect(() => {\n const [lineItem] = orderRequests.lineItems;\n // TODO: Get rid of encoding when backend sends url friendly ids.\n const ids = toEncodedIds({ orderId, itemId });\n const path = stringify(\n `${url}/${ids.orderId}/${ids.itemId}/request/reasons`,\n {\n lineItemId: lineItem.lineItemId,\n sessionId: orderRequests.sessionId,\n requestType,\n }\n );\n load(path);\n }, [load, orderRequests, orderId, itemId, requestType]);\n\n return { reasons, exchangeOptions };\n};\n\nexport default useOrderRequestReasonsFetcher;\n", "import useOrderRequestReasonsFetcher from './useOrderRequestReasonsFetcher';\n\nexport default useOrderRequestReasonsFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { ProductSlugApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/product';\n\nconst useProductFetcher = (slug: string, immediate = true) => {\n const {\n load,\n state,\n data: fetcherData,\n } = useFetcher();\n\n const product = fetcherData?.data ?? null;\n const immediateRef = useRef(immediate);\n\n const loadProduct = useCallback(() => {\n if (slug) {\n const path = `${url}/${slug}`;\n load(path);\n }\n }, [load, slug]);\n\n useEffect(() => {\n if (!immediateRef.current) {\n return;\n }\n loadProduct();\n }, [immediateRef, loadProduct]);\n\n return { product, loadProduct, isLoading: isLoading(state) };\n};\n\nexport default useProductFetcher;\n", "import useProductFetcher from './useProductFetcher';\n\nexport default useProductFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useEffect } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { UserCartLiteApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/user/cart/lite';\n\nconst useCartLiteFetcher = () => {\n const {\n load: loadCart,\n data: fetcherData,\n state,\n } = useFetcher();\n\n const cart = fetcherData?.data ?? null;\n\n useEffect(() => {\n loadCart(url);\n }, [loadCart]);\n\n return {\n cart,\n isLoading: isLoading(state),\n };\n};\n\nexport default useCartLiteFetcher;\n", "import useCartLiteFetcher from './useCartLiteFetcher';\n\nexport default useCartLiteFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { isSubmitting } from '~/utils/remix';\n\nimport type { SubmitOptions } from '@remix-run/react';\nimport type { UserWishlistAddProductApiRouteActionResponse } from '~/typings/remix';\n\n\nconst options: SubmitOptions = {\n method: 'POST',\n action: '/api/user/wishlist/product',\n};\n\nconst useAddToWishlist = () => {\n const {\n submit: fetcherSubmit,\n data,\n state,\n } = useFetcher();\n\n const addToWishlist = useCallback(\n (productId: number) => {\n fetcherSubmit({ productId }, options);\n },\n [fetcherSubmit]\n );\n\n return {\n data,\n addToWishlist,\n isSubmitting: isSubmitting(state),\n };\n};\n\nexport default useAddToWishlist;\n", "import useAddToWishlist from './useAddToWishlist';\n\nexport default useAddToWishlist;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { getAnalyticsProperties } from '~/analytics/utils';\nimport { isSubmitting } from '~/utils/remix';\nimport { isIndianUser } from '~/utils/device';\n\nimport type { SubmitOptions } from '@remix-run/react';\nimport type { ProductVariant } from '~/typings/models';\nimport type { UserCartLinesApiRouteActionResponse } from '~/typings/remix';\n\nconst options: SubmitOptions = {\n method: 'POST',\n action: '/api/user/cart/express-checkout'\n};\n\nconst useExpressCheckoutFetcher = () => {\n const {\n submit: fetcherSubmit,\n data,\n state\n } = useFetcher();\n\n const expressCheckout = useCallback(\n async ({ globalId }: { globalId: ProductVariant['globalId'] }) => {\n const attributes = await getAnalyticsProperties(500);\n const payload = {\n // form data doesn't support object. :|\n attributes: JSON.stringify([\n ...attributes,\n {\n key: 'checkoutPartner',\n value: isIndianUser() ? 'SHIPROCKET' : 'SHOPIFY'\n }\n ]),\n variantId: globalId\n };\n fetcherSubmit(payload, options);\n },\n [fetcherSubmit]\n );\n\n return {\n data,\n expressCheckout,\n isSubmitting: isSubmitting(state)\n };\n};\n\nexport default useExpressCheckoutFetcher;\n", "import useExpressCheckoutFetcher from './useExpressCheckoutFetcher';\n\nexport default useExpressCheckoutFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { flattenSource } from '~/elemason/utils';\nimport { isLoading } from '~/utils/remix';\nimport { stringify } from '~/utils/url';\n\nimport type { LooksApiRouteLoaderResponse } from '~/typings/remix';\nimport type { LookTypesense, SearchParams } from '~/typings/models';\n\nconst PER_PAGE = 5;\n\nconst useLooksFetcher = (query: SearchParams) => {\n const {\n data: fetcherData,\n state,\n load: fetchLooks,\n } = useFetcher();\n\n const [looks, setLooks] = useState([]);\n const hasMoreRef = useRef(true);\n\n const page = fetcherData?.data?.page ?? 1;\n\n const load = useCallback(\n (page = 1) => {\n if (!hasMoreRef.current) {\n return;\n }\n\n const params = {\n ...flattenSource({ query, collection: 'looks' }),\n page,\n per_page: PER_PAGE,\n };\n const url = stringify('/api/collections', params);\n fetchLooks(url);\n },\n [fetchLooks, query, hasMoreRef]\n );\n\n useEffect(() => load(), [load]);\n\n useEffect(() => {\n const hits = fetcherData?.data?.hits;\n if (!hits) {\n return;\n }\n hasMoreRef.current = hits.length === PER_PAGE;\n setLooks((looks) => [...looks, ...(hits as LookTypesense[])]);\n }, [setLooks, hasMoreRef, fetcherData]);\n\n return {\n page,\n load,\n looks,\n isLoading: isLoading(state),\n };\n};\n\nexport default useLooksFetcher;\n", "import useLooksFetcher from './useLooksFetcher';\n\nexport default useLooksFetcher;\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { isLoading, isSubmitting } from '~/utils/remix';\nimport { toUrlPath } from '~/utils/url';\n\nimport type {\n SearchFacetConfigWithValues,\n SearchFacetResult,\n SearchFacetValue,\n SearchFilter,\n} from '~/typings/models';\nimport type { SearchFacetsApiRouteLoaderResponse } from '~/typings/remix';\nimport type { Maybe } from '~/typings/utils';\nimport { keyBy } from 'lodash-es';\n\n\nconst useFacets = (\n data?: SearchFacetsApiRouteLoaderResponse['data']\n): {\n facets: SearchFacetConfigWithValues[];\n sortFacet: Maybe;\n} =>\n useMemo(() => {\n if (!data) {\n return { facets: [], sortFacet: null };\n }\n\n const { searchConfig, facets } = data;\n const configs = [...searchConfig.config.facetConfig.options].sort(\n (facetA, facetB) =>\n facetA.displaySequenceIndex - facetB.displaySequenceIndex\n );\n\n const results = keyBy(facets, 'fieldName');\n\n return {\n // sort is an static facet. We don't need to handle it manually.\n sortFacet: { ...searchConfig.config.sortConfig, values: [] },\n facets: configs.map((config) => {\n const values: SearchFacetValue[] = results[config.name]?.values ?? [];\n return { ...config, values };\n }),\n };\n }, [data]);\n\nconst useSearchFacetsFetcher = (url: string) => {\n const {\n data: fetcherData,\n state,\n load: fetcherLoad,\n submit: fetcherSubmit,\n } = useFetcher();\n\n const urlRef = useRef(url);\n\n // @ts-ignore\n const { facets, sortFacet } = useFacets(fetcherData?.data);\n const searchConfig = fetcherData?.data?.searchConfig ?? null;\n\n const { appliedFilters = [], appliedSortBy = null } = fetcherData?.data ?? {};\n\n const loadFacets = useCallback(\n () => fetcherLoad(urlRef.current),\n [fetcherLoad, urlRef]\n );\n\n const resetFacets = useCallback(() => {\n const formData = new FormData();\n formData.set('intent', 'reset');\n fetcherSubmit(formData, { action: urlRef.current, method: 'POST' });\n }, [fetcherSubmit, urlRef]);\n\n const previewFacets = useCallback(\n (filters: SearchFilter[]) => {\n const formData = new FormData();\n formData.set('intent', 'preview');\n formData.set('filters', JSON.stringify(filters));\n fetcherSubmit(formData, { action: urlRef.current, method: 'POST' });\n },\n [fetcherSubmit, urlRef]\n );\n\n useEffect(() => {\n urlRef.current = url;\n }, [url, urlRef]);\n\n // TODO: Search flow has become insanely complex. We need to refactor/rewrite\n // it properly. Since we have gradually did many changes to it because of that\n // it has lead to massive boilerplate. for example, following hook does\n // a bunch of things in terms of url. When we go to a search page, we already\n // have some params with us. As user interacts with facets, we need to\n // discard older params and user news ones.\n useEffect(() => {\n const executedQuery = fetcherData?.data?.executedQuery;\n if (!executedQuery) {\n return;\n }\n const endPoint = new URL(urlRef.current, window.location.origin);\n const searchParams = new URLSearchParams(endPoint.searchParams);\n for (const key of Object.keys(executedQuery)) {\n if (searchParams.has(key)) {\n searchParams.delete(key);\n }\n const value = executedQuery[key as keyof typeof executedQuery];\n searchParams.set(key, JSON.stringify(value));\n }\n // these query is only for facets. So we don't care about pagination for this.\n searchParams.delete('page');\n searchParams.delete('perPage');\n const nEndPoint = toUrlPath(endPoint.pathname, searchParams.toString());\n urlRef.current = nEndPoint;\n }, [fetcherData, urlRef]);\n\n return {\n urlRef,\n appliedFilters,\n isLoading: isLoading(state),\n isSubmitting: isSubmitting(state),\n facets,\n sortFacet,\n searchConfig,\n appliedSortBy,\n loadFacets,\n resetFacets,\n previewFacets,\n };\n};\n\nexport { useSearchFacetsFetcher };\n", "import { useFetcher } from '@remix-run/react';\nimport { useEffect } from 'react';\nimport { isLoading } from '~/utils/remix';\n\nimport type { CountryApiRouteLoaderResponse } from '~/typings/remix';\n\n\nconst url = '/api/country';\n\nconst useCountriesFetcher = () => {\n const {\n state,\n data: fetcherData,\n load,\n } = useFetcher();\n\n const countries = fetcherData?.data?.countries ?? [];\n\n useEffect(() => {\n load(url);\n }, [load]);\n\n return { countries, isLoading: isLoading(state) };\n};\n\nexport { useCountriesFetcher };\n", "import { useFetcher } from '@remix-run/react';\nimport { useCallback } from 'react';\nimport { isLoading } from '~/utils/remix';\nimport { populate } from '~/utils/string';\n\nimport type { CountryCodeApiRouteLoaderResponse } from '~/typings/remix';\n\nconst endpoint = '/api/country/{code}';\n\nconst useCountryFetcher = () => {\n const {\n state,\n data: fetcherData,\n load,\n } = useFetcher();\n\n const country = fetcherData?.data?.country ?? null;\n\n const loadCountry = useCallback(\n (code: string) => {\n const url = populate(endpoint, { code });\n load(url);\n },\n [load]\n );\n\n return { country, loadCountry, isLoading: isLoading(state) };\n};\n\nexport { useCountryFetcher };\n"], "mappings": "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", "names": ["import_react", "flattenSource", "source", "toNavAction", "pathname", "toNavUrl", "params", "stringify", "isRangeControl", "facet", "isCheckboxControl", "PER_PAGE", "useCollectionsFetcher", "source", "perPage", "fetcherData", "state", "fetchCollections", "useFetcher", "collections", "setCollections", "hasMoreRef", "page", "load", "params", "flattenSource", "url", "stringify", "hits", "isLoading", "useCollectionsFetcher_default", "useCollectionsFetcher_default", "import_react", "useCollectionFetcher", "slug", "fetcherData", "state", "load", "useFetcher", "collection", "url", "isLoading", "useCollectionFetcher_default", "useCollectionFetcher_default", "import_react", "options", "useAddToCartFetcher", "fetcherSubmit", "data", "state", "useFetcher", "addToCart", "variantId", "quantity", "payload", "addToCartMultiple", "lineItems", "isSubmitting", "useAddToCartFetcher_default", "useAddToCartFetcher_default", "import_react", "url", "PAGE_SIZE", "toOrders", "orders", "node", "useOrdersFetcher", "initialData", "fetcherData", "state", "fetcherLoad", "useFetcher", "pageInfoRef", "loadMoreOrders", "first", "pageInfo", "path", "stringify", "setOrders", "data", "paginatedOrder", "isLoading", "useOrdersFetcher_default", "userOrdersFetcher_default", "useOrdersFetcher_default", "import_react", "options", "useRemoveFromWishlist", "fetcherSubmit", "data", "state", "useFetcher", "removeFromWishlist", "productId", "isSubmitting", "useRemoveFromWishlist_default", "useRemoveFromWishlistFetcher_default", "useRemoveFromWishlist_default", "import_react", "useLookFetcher", "slug", "fetcherData", "state", "fetchLook", "useFetcher", "look", "setLook", "hasMoreRef", "page", "load", "isLoading", "useLookFetcher_default", "useLookFetcher_default", "import_react", "usePageFetcher", "initialPage", "slug", "page", "setPage", "fetcherData", "state", "load", "useFetcher", "next", "url", "stringify", "nPage", "prevValue", "prevBlocks", "usePageFetcher_default", "usePageFetcher_default", "import_react", "getUrl", "payload", "endPoint", "stringify", "PER_PAGE", "useProductsFetcher", "searchParams", "initialData", "fetcherData", "fetcherState", "load", "useFetcher", "products", "setProducts", "paramsRef", "count", "currentPage", "hasMore", "setHasMore", "loadProducts", "page", "perPage", "params", "fPerPage", "url", "useClientLayoutEffect_default", "hits", "isNil_default", "isEmpty_default", "uniqBy_default", "p", "isLoading", "useProductsFetcher_default", "useProductsFetcher_default", "import_react", "url", "useCartFetchersState", "useFetchers", "fetcher", "action", "useCartFetcher", "cart", "setCart", "cartFetcher", "useFetcher", "loadCart", "latestFetcher", "auxState", "isLoading", "isSubmitting", "useCartFetcher_default", "useCartFetcher_default", "import_react", "url", "useCartLineFetcher", "fetcherSubmit", "data", "state", "useFetcher", "removeLine", "line", "payload", "updateLine", "isSubmitting", "useCartLineFetcher_default", "useCartLineFetcher_default", "import_react", "url", "useAddressesFetcher", "state", "fetcherData", "load", "useFetcher", "addresses", "isLoading", "useAddressesFetcher_default", "useAddressesFetcher_default", "import_react", "url", "useOrderRequestReasonsFetcher", "orderRequests", "requestType", "fetcherData", "load", "useFetcher", "orderId", "itemId", "useParams", "reasons", "exchangeOptions", "lineItem", "ids", "toEncodedIds", "path", "stringify", "useOrderRequestReasonsFetcher_default", "useOrderRequestReasonsFetcher_default", "import_react", "url", "useProductFetcher", "slug", "immediate", "load", "state", "fetcherData", "useFetcher", "product", "immediateRef", "loadProduct", "path", "isLoading", "useProductFetcher_default", "useProductFetcher_default", "import_react", "url", "useCartLiteFetcher", "loadCart", "fetcherData", "state", "useFetcher", "cart", "isLoading", "useCartLiteFetcher_default", "useCartLiteFetcher_default", "import_react", "options", "useAddToWishlist", "fetcherSubmit", "data", "state", "useFetcher", "addToWishlist", "productId", "isSubmitting", "useAddToWishlist_default", "useAddToWishlistFetcher_default", "useAddToWishlist_default", "import_react", "options", "useExpressCheckoutFetcher", "fetcherSubmit", "data", "state", "useFetcher", "expressCheckout", "globalId", "attributes", "getAnalyticsProperties", "payload", "isIndianUser", "isSubmitting", "useExpressCheckoutFetcher_default", "useExpressCheckoutFetcher_default", "import_react", "PER_PAGE", "useLooksFetcher", "query", "fetcherData", "state", "fetchLooks", "useFetcher", "looks", "setLooks", "hasMoreRef", "page", "load", "params", "flattenSource", "url", "stringify", "hits", "isLoading", "useLooksFetcher_default", "useLooksFetcher_default", "import_react", "useFacets", "data", "searchConfig", "facets", "configs", "facetA", "facetB", "results", "keyBy_default", "config", "values", "useSearchFacetsFetcher", "url", "fetcherData", "state", "fetcherLoad", "fetcherSubmit", "useFetcher", "urlRef", "sortFacet", "appliedFilters", "appliedSortBy", "loadFacets", "resetFacets", "formData", "previewFacets", "filters", "executedQuery", "endPoint", "searchParams", "key", "value", "nEndPoint", "toUrlPath", "isLoading", "isSubmitting", "import_react", "url", "useCountriesFetcher", "state", "fetcherData", "load", "useFetcher", "countries", "isLoading", "import_react", "endpoint", "useCountryFetcher", "state", "fetcherData", "load", "useFetcher", "country", "loadCountry", "code", "url", "populate", "isLoading"] }