import React from "react"; import "./bundle.scss"; import { FilterGroup } from "./BundleBuilder/SortAndFilter"; interface ShopifyCurrency { rate: number; active: string; } declare global { interface Window { Shopify?: { currency?: ShopifyCurrency; shop?: string; }; } } type ProductImage = { url: string; height: number; width: number; altText?: string; }; type ProductFeaturedMedia = { alt: string; preview: { image: { url: string; height?: number; width?: number; altText: string; }; }; }; type ProductOption = { id: string; name: string; values: string[]; }; type CollectionNode = { node: { id: string; title: string; handle: string; }; }; export type VariantNode = { node: { id: string; price: string; compareAtPrice: string; title: string; displayName: string; image: ProductImage; availableForSale: boolean; inventoryQuantity: number; inventoryItem?: { tracked?: boolean; }; inventoryPolicy?: "deny" | "continue"; }; }; type SelectedVariantDetails = { id: string; price: string; compareAtPrice: string; title: string; displayName: string; image: ProductImage; availableForSale: boolean; inventoryQuantity: number; }; export type VariantOptions = { shop: string; options: { name: string; type: "text" | "image" | "color"; values: { name: string; value: string; }[]; }[]; createdAt: string; updatedAt: string; }; export type ProductDetails = { id: string; title: string; handle: string; featuredMedia: ProductFeaturedMedia; status: "active" | "archived" | "draft" | "unlisted" | ""; options: ProductOption[]; onlineStoreUrl: string; tracksInventory?: boolean; publishedAt?: string | null; collections: { edges: CollectionNode[]; }; variants: { edges: VariantNode[]; }; shop: string; metafield?: { key: string; namespace: string; ownerType: string; value: string; id: string; jsonValue: string[]; type: string; }; descriptionHtml: string; media: { edges: { node: { alt: string; preview: { image: { altText: string; width?: number; height?: number; url: string; }; }; image: { altText: string; height: number; width: number; url: string; }; }; }[]; }; selectedVariant?: SelectedVariantDetails; rating?: { averageRating: number; ratingCount: number; }; }; export type ProductData = { productId: string; variantIds: string[]; productDetails: ProductDetails; quantity?: number; }; type GeneralStyle = { primaryColor: string; primaryContrastColor: string; secondaryColor: string; secondaryContrastColor: string; imageAspectRatio: string; ctaBackgroundColor: string; ctaTextColor: string; ctaBorderColor: string; ctaShadowType: string; ctaPadding: string; ctaWidth: string; ctaBorderRadius: string; ctaHoverBackgroundColor: string; ctaHoverTextColor: string; customizeHoverState: boolean; checkoutPartner: string; redirectToPDP: boolean; restrictCOD: boolean; trackInventory: boolean; showOutOfStockProducts: boolean; showOutOfStockVariants?: boolean; outOfStockLabel: string; disabledButtonColor: string; storeCurrency: string; currencySymbol: string; discountPrefix: string; discountSuffix: string; addOrderTags: boolean; addOrderNotes: boolean; variantTitleSuffix: boolean; titleLength: string; showDecimalsInBundlePricing?: boolean; showPaymentIcons?: boolean; atcLoaderType?: "spinner" | "animated"; }; type VolumeStyle = { addtoCartMethod: string; titleFontSize: string; subtitleFontSize: string; titleBackgroundColor: string; titleTextColor: string; verticalMargin: string; sectionBackgroundColor: string; cardStyle: string; discountBadgeVisibility: string; tierPriceType: "none" | "unit-price" | "tier-price"; allowVariantSelection: string; variantSelectorType: string; ctaTitle: string; bundleRedirection: string; discountBadgeDisplay: string; discountDisplayType: string; freebieDisplayType?: "compact" | "detailed"; showVariantOptionsLabel: boolean; }; type ComboStyle = { productTitleFontSize: string; productDescriptionFontSize: string; descriptionTextColor: string; titleTextColor: string; verticalMargin: string; infoAlignment: string; ctaTitle: string; bundleRedirection: string; embedContentVisibility: boolean; mixAndMatchCardStyle: string; mixAndMatchVariantTypeSelector: string; comboCardStyle: string; comboVariantTypeSelector: string; selectedEmbedContentVisibilityOptions: string[]; subProductsSectionVisibility: boolean; subProductsImageVisibility: boolean; subProductsProductTitleVisibility: boolean; subProductsProductPriceVisibility: boolean; discountBadgeVisibility?: boolean; discountBadgeDisplay?: "discount-on-compare" | "discount-on-price"; discountDisplayType?: "percentage" | "amount"; comboProductRatingsDisplay?: string; mixAndMatchProductRatingsDisplay?: string; }; type ByobStyle = { titleFontSize: string; subtitleFontSize: string; titleBackgroundColor: string; titleTextColor: string; productTitleFontSize: string; showVariantTitleInCard: boolean; productVariantTitleType: "product-title" | "variant-title" | "variant-display-name"; productTitleWrapLines: string; productCardDetailsAlignment: "left" | "center" | "right"; sectionBackgroundColor: string; lazyLoadWidget: string; listingsGap: string; footerMargin: string; borderRadius: string; borderColor: string; cardBackgroundColor: string; shadowType: string; addToBundleCTAText: string; checkoutCTAText: string; variantSelectorType: string; primaryVariant: string; productsPriceVisibility: boolean; compareAtPriceVisibility: boolean; selectedProductsVisibility: boolean; bundleRedirection: string; enableConfetti: boolean; selectedItemVisibility: boolean; productTiersVisibility: boolean; tierNavigation: boolean; enableProductCategories: boolean; productCardCategoryVisibility: string; categoryFilterOnPage: string; productFiltersDisplay: "none" | "drawer" | "sidebar"; filtersProvider: "based-on-products-data" | "search-and-discovery-app-sync"; selectedFilterOptions: string[]; productRatingsDisplay?: string; discountBadgeVisibility?: boolean; discountBadgeDisplay?: "discount-on-compare" | "discount-on-price"; discountDisplayType?: string; fetchAllProductsAtOnce?: boolean; }; type FixedStyle = { titleFontSize: string; subtitleFontSize: string; titleBackgroundColor: string; titleTextColor: string; verticalMargin: string; sectionBackgroundColor: string; borderRadius: string; borderColor: string; cardBackgroundColor: string; shadowType: string; infoAlignment: string; ctaTitle: string; bundleRedirection: string; cardLayoutStyle: string; variantSelectorType: string; productsPriceVisibility: boolean; compareAtPriceVisibility: boolean; discountBadgeVisibility?: boolean; discountDisplayType?: string; discountBadgeDisplay?: "discount-on-compare" | "discount-on-price"; productRatingsDisplay?: string; }; export type Customizations = { shop?: string; general: GeneralStyle; byob: ByobStyle; fixedBundle: FixedStyle; volumeBundle: VolumeStyle; comboBundle: ComboStyle; createdAt?: string; updatedAt?: string; }; export type ProductTier = { tier: number; title: string; minimumQuantity: number; isFixed?: boolean; isFreebieTier?: boolean; products: { productId: string; variantIds: string[]; }[]; }; export type BundlePayload = { _id: string; showIndividualProductSelector: boolean; title?: string; subtitle?: string; products: ProductData[]; freebieProducts?: ProductData[]; percentageOff?: number; dealAmount?: number; amountOff?: number; type: "fixed" | "builder" | "volume" | "mixAndMatch" | "" | "combo" | "collection"; minimumQuantity: number; maximumQuantity?: number | null; showProductDetailsInTracker: boolean; coverImageUrl?: string; mobileCoverImageUrl?: string; titleSectionTextColor?: string; titleSectionBackgroundColor?: string; dealTextColor?: string; showBorder?: boolean; hideProductDetails?: boolean; cornerRadiusType?: "medium" | "high" | ""; primaryBackgroundColorCta?: string; enableProgressBar?: boolean; enableSortAndFilter?: boolean; disableQuantitySelector?: boolean; disableInventoryTracking?: boolean; alignFixedBundleContent?: "left" | "right" | "center" | ""; imageAspectType?: "portrait" | "square" | ""; backgroundColorFixedBundleDiv?: string; canCustomizeFixedBundle?: boolean; primaryTextColorCta?: string; showVariants?: boolean; discountType?: string; showCta?: boolean; productCardBadgeText?: string; coverImageVerticalMargin?: string; builderTiers?: { type: string; offerTier?: { tier: number; minimumQuantity: number; discountValue: number; }[]; productTier?: ProductTier[]; }; volumeTiers?: { isDefault: unknown; tier: number; minimumQuantity: number; title: string; subtitle: string; badgeTitle: string; discountValue: number; imageUrl?: string; freebieProductIds?: string[]; }[]; mixAndMatchTiers?: { tier: number; title: string; products: { productId: string; variantIds: string[]; }[]; }[]; customizations: Customizations; variantOptions?: VariantOptions; storeCurrencyCode?: string; customStoreDetails?: { [key: string]: any; }; customProductsQuantity?: number | null; reviewRatingType?: "none" | "ratingOnly" | "ratingAndReviewCount"; appName?: string; workWithoutPagination?: boolean; pageHeader?: { title?: string; description?: string; customizePadding?: string; }; personalizedForm?: { title?: string; sections?: { title: string; type: "text" | "image"; fields: { title: string; }[]; }[]; }; categoryFilters?: Record | FilterGroup | FilterGroup[]; }; export type EventNameCustom = "byob_checkout_cta" | "byob_add_to_bundle" | "block_visibility" | "bundle_add_to_cart"; export type EventTypeCustom = "clicks" | "views"; export type AnalyticsEventParams = { eventNameCustom: EventNameCustom; eventTypeCustom: EventTypeCustom; data: any; }; export type CursorData = Record; export type BundleProps = { bundle: BundlePayload; addToCartFunction?: (selectedItemsSubtotal: number, variantIds?: string[], finalBundlePrice?: number, variantIdPriceMap?: { variantId: string; price: number; }[], properties?: Record, freebieProduct?: string[], isCheckout?: boolean) => Promise; addCustomBundleToCart?: (e: any, formProperties?: Record) => Promise; selectedItems?: { variantId: string; product: ProductDetails; quantity: number; }[]; setSelectedItems?: React.Dispatch>; bundleAddToCartLoading?: boolean; handleRemoveItem?: (variantId: string) => void; selectedItemsQuantity?: number; renderingOnPage?: boolean; bundleSubtotal?: { price: number; compareAtPrice: number; }; bundleHeaderBackgroundColor?: string; currentProductId?: string; dispatchAnalyticsEvent?: (params: AnalyticsEventParams) => void; fetchStoreDetails?: () => Promise; productsPagination?: { initialCursorData: CursorData; cursorData: CursorData; fetchFn: (filters?: any, bundleTier?: number, cursor?: string | null) => Promise; setCursorData: (cursorData: CursorData) => void; }; categoryFilters?: Record; }; export declare const currencyPrice: (price: number | string | undefined) => string | undefined; export declare const getCurrencySymbol: (genSymbol: string, _storeCurrencyCode?: string) => string; export declare const optimiseImage: (url: string, width?: number) => string; export declare const handleAddToBundle: (variantId: string, product: ProductDetails, quantity: number, selectedItems: { variantId: string; product: ProductDetails; quantity: number; tierIndex?: number | undefined; }[], setSelectedItems: React.Dispatch>, isFreebie?: boolean, tierIndex?: number) => void; declare const Bundle: React.FC; export default Bundle;