{"version":3,"sources":["FC_CartSubtotal.tsx"],"sourcesContent":["/*\n * Framer Commerce\n * Confidential and Proprietary - All Rights Reserved\n * Unauthorized use, reproduction, distribution, or disclosure of this\n * source code or any related information is strictly prohibited.\n *\n * This software is the exclusive property of Framer Commerce (\"Company\").\n * It is considered highly confidential and proprietary information.\n *\n * Any use, copying, modification, distribution, or sharing of this software,\n * in whole or in part, without the express written permission of the Company\n * is strictly prohibited and may result in legal action.\n *\n * DISCLAIMER: This software does not provide any express or\n * implied warranties, including, but not limited to, the implied warranties\n * of merchantability and fitness for a particular purpose. In no event shall\n * Framer Commerce be liable for any direct, indirect, incidental, special,\n * exemplary, or consequential damages (including, but not limited to, procurement\n * of substitute goods or services; loss of use, data, or profits; or business\n * interruption) however caused and on any theory of liability, whether in\n * contract, strict liability, or tort (including negligence or otherwise)\n * arising in any way out of the use of this software, even if advised of\n * the possibility of such damage.\n *\n * Any unauthorized possession, use, copying, distribution, or dissemination\n * of this software will be considered a breach of confidentiality and may\n * result in legal action.\n *\n * For inquiries, contact:\n * Framer Commerce\n * Email: hello@framercommerce.com\n *\n * © 2025 Butter Supply Inc. All Rights Reserved.\n */\n\nimport React, { useEffect, useMemo, useState, useCallback } from \"react\"\nimport ShopXCartSubtotal from \"https://framer.com/m/shopX-cartSubtotal-pv7y.js\"\nimport { addPropertyControls, ControlType } from \"framer\"\nimport { get } from \"lodash-es\"\nimport { formatPrice } from \"../utils/formatPrice_v2.ts\"\nimport { currencyMaps } from \"../utils/currencyMaps.ts\"\nimport { knownCurrenciesWithCodeAsSymbol } from \"../utils/currencyMaps.ts\"\nimport { getLocaleFromCountry } from \"../utils/locales.ts\"\nimport { RenderTarget } from \"framer\"\n\n// Extend Window interface\ndeclare global {\n    interface Window {\n        shopXtools?: {\n            cart?: any\n            fetchCart?: (cartId: string) => Promise<any>\n        }\n        __FcCurrencyConfigs?: {\n            currencyPosition?: string\n            currencySymbol?: string\n        }\n    }\n}\n\n// Helper function to check if a currency's symbol is the same as its code\nconst isCurrencySymbolSameAsCode = (currencyCode) => {\n    // For some currencies like CHF, the browser might use the code as the symbol\n    if (!currencyCode) return false\n\n    if (knownCurrenciesWithCodeAsSymbol.includes(currencyCode)) {\n        return true\n    }\n\n    try {\n        const formatted = new Intl.NumberFormat(undefined, {\n            style: \"currency\",\n            currency: currencyCode,\n            currencyDisplay: \"narrowSymbol\",\n        }).format(0)\n\n        // Remove digits, decimal points, and common formatting characters\n        const cleanFormatted = formatted.replace(/[0-9.,\\s]/g, \"\")\n\n        // Check if what remains is the currency code\n        return cleanFormatted === currencyCode\n    } catch (e) {\n        return false\n    }\n}\n\n/**\n * @framerDisableUnlink\n */\n\nexport default function FC_CartSubtotal(props) {\n    const {\n        format: {\n            showCurrency,\n            showSymbol,\n            showDecimals,\n            currencyCode: previewCurrencyCode,\n        } = {},\n    } = props\n\n    const [subtotal, setSubtotal] = useState(0)\n    const [cart, setCart] = useState(null)\n    const [selectedCurrency, setSelectedCurrency] = useState<string>(\"\")\n    const [selectedCountryCode, setSelectedCountryCode] = useState<string>(\"\")\n    const [selectedCountry, setSelectedCountry] = useState<string>(\"\")\n    const [currencyConfig, setCurrencyConfig] = useState(() => {\n        // Initialize with window values if available\n        if (typeof window !== \"undefined\") {\n            const position =\n                window?.__FcCurrencyConfigs?.currencyPosition || \"Before\"\n            const initialConfig = {\n                position: position,\n                showCode: position !== \"Hide\",\n                symbol: window?.__FcCurrencyConfigs?.currencySymbol || \"$\",\n            }\n            //console.log('Initial currency config state:', initialConfig, window?.__FcCurrencyConfigs);\n            return initialConfig\n        }\n        return {\n            position: \"Before\",\n            showCode: false,\n            symbol: \"$\",\n        }\n    })\n    const isBrowser = typeof window !== \"undefined\"\n\n    // Initialize currency from localStorage on page load\n    useEffect(() => {\n        if (!isBrowser) return\n\n        const storedCurrency = localStorage.getItem(\"selectedCurrency\")\n        const storedCountryCode = localStorage.getItem(\"selectedCountryCode\")\n        const storedCountry = localStorage.getItem(\"selectedCountry\")\n        setSelectedCurrency(storedCurrency || \"USD\")\n        setSelectedCountryCode(storedCountryCode || \"US\")\n        setSelectedCountry(storedCountry || \"United States\")\n\n        // console.log(\"[FC_CartSubtotal] Initial Currency State:\", {\n        //     currency: storedCurrency\n        // })\n    }, [isBrowser])\n\n    // Debug current currency config\n    // useEffect(() => {\n    //     console.log('Currency config changed:', currencyConfig);\n    // }, [currencyConfig]);\n\n    // Add currency settings listener\n    useEffect(() => {\n        if (!isBrowser) return\n\n        function updateCurrencyConfig(position, symbol) {\n            //console.log('Updating currency config with:', { position, symbol });\n            const newConfig = {\n                position: position || \"Before\",\n                showCode: position !== \"Hide\",\n                symbol: symbol || \"$\",\n            }\n            //console.log('New currency config:', newConfig);\n            setCurrencyConfig(newConfig)\n        }\n\n        // Handle currency settings updates\n        const handleCurrencySettingsUpdate = (e: CustomEvent) => {\n            //console.log('Currency update event received:', e.detail);\n            if (!e.detail?.current) {\n                //console.log('Invalid currency update event:', e);\n                return\n            }\n            updateCurrencyConfig(\n                e.detail.current.currencyPosition,\n                e.detail.current.currencySymbol\n            )\n        }\n\n        // Initial setup\n        const currentPosition = window.__FcCurrencyConfigs?.currencyPosition\n        const currentSymbol = window.__FcCurrencyConfigs?.currencySymbol\n        //console.log('Initial currency values:', { currentPosition, currentSymbol });\n        updateCurrencyConfig(currentPosition, currentSymbol)\n\n        // Add event listener\n        document.addEventListener(\n            \"currency__settings-updated\",\n            handleCurrencySettingsUpdate as EventListener\n        )\n        //console.log('Currency event listener added');\n\n        // Listen for currency changes\n        const handleCurrencyChange = (event) => {\n            //console.log(\"[FC_CartSubtotal] Currency Change Event:\", event.detail);\n            const { currency, countryCode, country } = event.detail\n            setSelectedCurrency(currency)\n            setSelectedCountryCode(countryCode)\n            setSelectedCountry(country)\n        }\n\n        window.addEventListener(\n            \"currency_changed\",\n            handleCurrencyChange as EventListener\n        )\n\n        return () => {\n            document.removeEventListener(\n                \"currency__settings-updated\",\n                handleCurrencySettingsUpdate as EventListener\n            )\n            window.removeEventListener(\n                \"currency_changed\",\n                handleCurrencyChange as EventListener\n            )\n            //console.log('Currency event listeners removed');\n        }\n    }, [isBrowser])\n\n    // // Cart calculation effect\n    useEffect(() => {\n        if (!isBrowser) return\n\n        const logCartDetails = () => {\n            const cart = get(window, \"shopXtools.cart\")\n            // Log the entire cart object\n            //console.log('Cart Data:', cart);\n\n            if (cart) {\n                setCart(cart)\n                // Log each line item in the cart\n                const cartItems = get(cart, \"lines.edges\", [])\n                // console.log(\n                //     'Cart Items:',\n                //     cartItems.map((edge) => {\n                //         const item = edge.node;\n                //         return {\n                //             title: get(item, 'merchandise.product.title', 'Unknown'),\n                //             variantId: get(item, 'merchandise.id', ''),\n                //             price: get(item, 'cost.totalAmount.amount') ||\n                //                    get(item, 'cost.subtotalAmount.amount') ||\n                //                    get(item, 'merchandise.price.amount', '0'),\n                //             quantity: get(item, 'quantity', 0),\n                //             currencyCode: get(item, 'cost.totalAmount.currencyCode') ||\n                //                           get(item, 'merchandise.price.currencyCode', 'USD'),\n                //         };\n                //     })\n                // );\n\n                // Log the subtotal\n                const subtotal = parseFloat(\n                    get(cart, \"cost.subtotalAmount.amount\", \"0\")\n                )\n                //console.log('Parsed Subtotal (to be set in state):', subtotal);\n                setSubtotal(subtotal)\n            } else {\n                console.log(\"No cart data available.\")\n            }\n        }\n\n        // Log cart details on load\n        logCartDetails()\n\n        // Re-log cart details on cart update events\n        window.addEventListener(\"shopXtools-cart-update\", logCartDetails)\n        return () =>\n            window.removeEventListener(\"shopXtools-cart-update\", logCartDetails)\n    }, [isBrowser])\n\n    const _currencyCode = useMemo(() => {\n        if (!isBrowser) return \"USD\"\n        // Try different paths to get currency code\n        const cartCurrencyCode = get(\n            window,\n            \"shopXtools.cart.cost.subtotalAmount.currencyCode\",\n            \"USD\"\n        )\n        //console.log('Currency Code in _currencyCode:', cartCurrencyCode);\n        return selectedCurrency || cartCurrencyCode\n    }, [isBrowser, cart, selectedCurrency])\n\n    const showMockValues = useMemo(\n        () =>\n            subtotal === 0 &&\n            isBrowser &&\n            window.location.origin.endsWith(\"framercanvas.com\"),\n        [subtotal, isBrowser]\n    )\n\n    // Common function to format price based on options\n    const formatPriceWithOptions = (numericPrice, currCode) => {\n        const symbolSameAsCode = isCurrencySymbolSameAsCode(currCode)\n\n        // Get locale from selected country code\n        const locale = getLocaleFromCountry(selectedCountryCode)\n\n        // Log browser user agent for debugging iOS-specific issues\n        // if (isBrowser) {\n        //     console.log(\"[FC_CartSubtotal] Format debug:\", {\n        //         userAgent: navigator.userAgent,\n        //         isCurrencySymbolSameAsCode: symbolSameAsCode,\n        //         currencyCode: currCode,\n        //         selectedCountryCode,\n        //         locale,\n        //         showSymbol,\n        //         showCurrency,\n        //         showDecimals,\n        //     })\n        // }\n\n        // Determine if we should show decimals based on the setting\n        const shouldShowDecimals = () => {\n            if (showDecimals === \"Always show\") return true\n            if (showDecimals === \"Never show\") return false\n            if (showDecimals === \"Hide when .00\") {\n                // Check if the decimal part is zero\n                return numericPrice % 1 !== 0\n            }\n            return true // Default fallback for boolean value\n        }\n\n        const decimalDigits = shouldShowDecimals() ? 2 : 0\n\n        // If showing neither symbol nor code, just format the number\n        if (!showSymbol && !showCurrency) {\n            const formattedNumber = new Intl.NumberFormat(locale, {\n                style: \"decimal\",\n                minimumFractionDigits: decimalDigits,\n                maximumFractionDigits: decimalDigits,\n            }).format(numericPrice)\n            //console.log('Formatted Number (No Symbol or Currency):', formattedNumber);\n            return formattedNumber\n        }\n\n        // Special case for USD to prevent \"US$\" display in Safari iOS\n        if (currCode === \"USD\" && showSymbol) {\n            // Check if running on iOS device\n            const isIOS =\n                isBrowser &&\n                /iPad|iPhone|iPod/.test(navigator.userAgent) &&\n                !window.MSStream\n\n            // Format USD manually to avoid the iOS \"US$\" prefix\n            if (isIOS) {\n                const number = new Intl.NumberFormat(locale, {\n                    style: \"decimal\",\n                    minimumFractionDigits: decimalDigits,\n                    maximumFractionDigits: decimalDigits,\n                }).format(numericPrice)\n\n                if (!showCurrency) {\n                    return `$${number}` // Just \"$50\" format\n                } else {\n                    return `$${number} USD` // \"$50 USD\" format\n                }\n            } else {\n                // For non-iOS devices, continue with normal formatting but use\n                // a more controlled approach to ensure consistency\n                if (!showCurrency) {\n                    return new Intl.NumberFormat(locale, {\n                        style: \"currency\",\n                        currency: \"USD\",\n                        minimumFractionDigits: decimalDigits,\n                        maximumFractionDigits: decimalDigits,\n                        currencyDisplay: \"narrowSymbol\",\n                    }).format(numericPrice)\n                } else {\n                    const withSymbol = new Intl.NumberFormat(locale, {\n                        style: \"currency\",\n                        currency: \"USD\",\n                        minimumFractionDigits: decimalDigits,\n                        maximumFractionDigits: decimalDigits,\n                        currencyDisplay: \"narrowSymbol\",\n                    }).format(numericPrice)\n                    return `${withSymbol} USD`\n                }\n            }\n        }\n\n        // For currencies where symbol is same as code (like CHF)\n        if (symbolSameAsCode) {\n            // If showing currency code, always use code-first format and ignore symbol\n            if (showCurrency && !showSymbol) {\n                const number = new Intl.NumberFormat(locale, {\n                    style: \"decimal\",\n                    minimumFractionDigits: decimalDigits,\n                    maximumFractionDigits: decimalDigits,\n                }).format(numericPrice)\n                const output = `${currCode} ${number}`\n                return output\n            }\n            if (showSymbol && !showCurrency) {\n                const number = new Intl.NumberFormat(locale, {\n                    style: \"decimal\",\n                    minimumFractionDigits: decimalDigits,\n                    maximumFractionDigits: decimalDigits,\n                }).format(numericPrice)\n                const output = `${currCode} ${number}`\n                return output\n            }\n            if (showCurrency && showSymbol) {\n                const number = new Intl.NumberFormat(locale, {\n                    style: \"decimal\",\n                    minimumFractionDigits: decimalDigits,\n                    maximumFractionDigits: decimalDigits,\n                }).format(numericPrice)\n                return `${currCode} ${number}`\n            }\n        }\n\n        // For currencies with distinct symbols (like USD with $)\n\n        // If showing only the code (no symbol)\n        if (!showSymbol && showCurrency) {\n            const number = new Intl.NumberFormat(locale, {\n                style: \"decimal\",\n                minimumFractionDigits: decimalDigits,\n                maximumFractionDigits: decimalDigits,\n            }).format(numericPrice)\n            // For normal currencies, show code after the number\n            return `${number} ${currCode}`\n        }\n\n        // If showing only the symbol (no code)\n        if (showSymbol && !showCurrency) {\n            return new Intl.NumberFormat(locale, {\n                style: \"currency\",\n                currency: currCode,\n                minimumFractionDigits: decimalDigits,\n                maximumFractionDigits: decimalDigits,\n                currencyDisplay: \"narrowSymbol\",\n            }).format(numericPrice)\n        }\n\n        // If showing both symbol and code\n        const withSymbol = new Intl.NumberFormat(locale, {\n            style: \"currency\",\n            currency: currCode,\n            minimumFractionDigits: decimalDigits,\n            maximumFractionDigits: decimalDigits,\n            currencyDisplay: \"narrowSymbol\",\n        }).format(numericPrice)\n        return `${withSymbol} ${currCode}`\n    }\n\n    const text = useMemo(() => {\n        if (!isBrowser) return \"\"\n\n        // For canvas view, handle the display options directly\n        if (RenderTarget.current() === RenderTarget.canvas || showMockValues) {\n            const mockAmount = 150.0\n            const currentCurrencyCode = previewCurrencyCode || \"USD\"\n\n            return formatPriceWithOptions(mockAmount, currentCurrencyCode)\n        }\n\n        // For live view, use the actual subtotal\n        return formatPriceWithOptions(subtotal, _currencyCode)\n    }, [\n        isBrowser,\n        showMockValues,\n        subtotal,\n        _currencyCode,\n        showCurrency,\n        showSymbol,\n        showDecimals,\n        previewCurrencyCode,\n        props.format,\n    ])\n\n    if (!isBrowser) {\n        return <div style={{ display: \"inline-flex\" }}></div>\n    }\n\n    // For debugging\n    // console.log('Rendering FC_CartSubtotal with:', {\n    //     subtotal,\n    //     text,\n    //     currencyConfig,\n    //     props\n    // })\n\n    // Render a basic div if ShopXCartSubtotal is not available\n    if (typeof ShopXCartSubtotal === \"undefined\") {\n        return (\n            <div style={{ width: \"100%\", textAlign: \"right\" }}>\n                <p style={{ ...props.font, color: props.color, margin: 0 }}>\n                    {text}\n                </p>\n            </div>\n        )\n    }\n\n    return (\n        <ShopXCartSubtotal\n            {...props}\n            text={\n                <p style={{ ...props.font, color: props.color, margin: 0 }}>\n                    {text}\n                </p>\n            }\n            style={{ width: \"100%\" }}\n        />\n    )\n}\n\nFC_CartSubtotal.defaultProps = {\n    format: {\n        showCurrency: false,\n        showSymbol: true,\n        currencyCode: \"USD\",\n        showDecimals: \"Always show\",\n    },\n}\n\naddPropertyControls(FC_CartSubtotal, {\n    format: {\n        type: ControlType.Object,\n        title: \"Format\",\n        controls: {\n            showSymbol: {\n                type: ControlType.Boolean,\n                title: \"Symbol\",\n                defaultValue: true,\n                enabledTitle: \"Show\",\n                disabledTitle: \"Hide\",\n                description: \"$, £, €, etc.\",\n            },\n            showCurrency: {\n                type: ControlType.Boolean,\n                title: \"Code\",\n                defaultValue: false,\n                enabledTitle: \"Show\",\n                disabledTitle: \"Hide\",\n                description: \"USD, EUR, CHF, etc.\",\n            },\n            showDecimals: {\n                type: ControlType.Enum,\n                title: \"Decimals\",\n                defaultValue: \"Always show\",\n                options: [\"Always show\", \"Never show\", \"Hide when .00\"],\n                optionTitles: [\"Always show\", \"Never show\", \"Hide when .00\"],\n                displaySegmentedControl: true,\n                segmentedControlDirection: \"vertical\",\n            },\n            currencyCode: {\n                type: ControlType.Enum,\n                title: \"Preview\",\n                defaultValue: \"USD\",\n                options: [\n                    \"USD\",\n                    \"EUR\",\n                    \"GBP\",\n                    \"CHF\",\n                    \"JPY\",\n                    \"CAD\",\n                    \"AUD\",\n                    \"CNY\",\n                    \"HKD\",\n                    \"NZD\",\n                    \"SEK\",\n                    \"KRW\",\n                    \"SGD\",\n                    \"NOK\",\n                    \"MXN\",\n                    \"INR\",\n                    \"RUB\",\n                    \"ZAR\",\n                    \"TRY\",\n                    \"BRL\",\n                    \"TWD\",\n                    \"DKK\",\n                    \"PLN\",\n                    \"THB\",\n                    \"IDR\",\n                    \"HUF\",\n                    \"CZK\",\n                    \"ILS\",\n                    \"CLP\",\n                    \"PHP\",\n                    \"AED\",\n                    \"COP\",\n                    \"SAR\",\n                    \"MYR\",\n                    \"RON\",\n                ],\n                description:\n                    \"Currency on your site is automatic, this is only shown in canvas preview.\",\n            },\n        },\n    },\n    font: {\n        type: ControlType.Font,\n        controls: \"extended\",\n        title: \"Font\",\n    },\n    color: {\n        type: ControlType.Color,\n        defaultValue: \"#000\",\n        title: \"Color\",\n    },\n})\n"],"names":[],"mappings":"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"}