{"version":3,"file":"client.mjs","mappings":"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","sources":["webpack://teaser_mobile-simonly/./app/teaser-utils.ts","webpack://teaser_mobile-simonly/./app/teaser-interfaces.ts","webpack://teaser_mobile-simonly/./app/teaser-service.ts","webpack://teaser_mobile-simonly/./app/teaser-controller.ts","webpack://teaser_mobile-simonly/./app/teaser.ts"],"sourcesContent":["export function appendQueryParams(base: string, params: Record<string, any>): string {\n    const queryParams = Object.entries(params).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join('&');\n    return base + (queryParams ? `?${queryParams}` : '');\n}\n\nexport function optionalCastToNumber(value: string): (string | number) {\n    const parsed = parseInt(value, 10);\n    return (value === parsed + '') ? parsed : value;\n}\n","// Filter-related types\nexport enum FilterName {\n    DataIncluded = 'data_included',\n    SelectContract = 'select_contract'\n}\n\nexport type FilterFormSelection = {\n    [key in FilterName]: string | null;\n};\n\n// Short Calculator types\nexport enum FieldTypeShortCalculator {\n    CurrentProvider = 'current_provider',\n    DataIncluded    = 'data_included',\n    DataSpeed       = 'data_speed',\n    MinutesIncluded = 'minutes_included',\n    SelectContract  = 'select_contract',\n    CurrentNetwork = 'current_network'\n}\n\nexport interface ShortCalculatorPriceInfoFilter {\n    minPriceText: string;\n    minPriceValue: number;\n    possibleResultCount: number;\n}\n\nexport interface ShortCalculatorElementFilter {\n    isSelected: boolean;\n    label: string;\n    prefixedLabel: string;\n    priceInfo: ShortCalculatorPriceInfoFilter;\n    value: string;\n}\n\nexport interface ShortCalculatorSelectFilterDataFilter {\n    defaultValue: string;\n    elements: ShortCalculatorElementFilter[];\n    selectedValue: string;\n}\n\nexport interface ShortCalculatorDefinitionDetailsFilter {\n    filterKey: FieldTypeShortCalculator;\n    label: string;\n    selectFilterData: ShortCalculatorSelectFilterDataFilter;\n    type: string;\n}\n\nexport interface ShortCalculatorDefinitionFilter {\n    definition: ShortCalculatorDefinitionDetailsFilter;\n    isDirty: boolean;\n    label: string;\n    staticLabel: string;\n    type: string;\n}\n\nexport interface FilterData {\n    filterSelection: FilterFormSelection;\n    filters: ShortCalculatorDefinitionFilter[];\n}\n","import {\n    FilterName,\n    FilterFormSelection,\n    FilterData,\n    ShortCalculatorDefinitionFilter,\n    FieldTypeShortCalculator\n} from './teaser-interfaces';\n\nexport class MobilfunkSimOnlyTeaserService {\n\n    private filters$: Promise<ShortCalculatorDefinitionFilter[]> | undefined;\n    private filterSelection: FilterFormSelection = {\n        [FilterName.DataIncluded]: '2000',\n        [FilterName.SelectContract]: '-24'\n    };\n\n    constructor(private host: string | null) {\n        this.filters$ = this.loadFilters();\n    }\n\n    public destroy(): void {}\n\n    public async loadFilterData(): Promise<FilterData> {\n        const filters = await (this.filters$ ?? this.loadFilters());\n        const initialSelection = this.buildInitialSelection(filters);\n        this.filterSelection = initialSelection;\n        return {\n            filterSelection: initialSelection,\n            filters\n        };\n    }\n\n    public patchFilterSelection<T extends FilterName>(filterKey: T, filterSelection: FilterFormSelection[T]): FilterFormSelection {\n        this.filterSelection = {...this.filterSelection, [filterKey]: filterSelection};\n        return this.filterSelection;\n    }\n\n    private async loadFilters(): Promise<ShortCalculatorDefinitionFilter[]> {\n        const base = this.host ? `https://${this.host}` : 'https://handytarife.check24.de';\n        const url = base + '/api/v1/desktop/result/filter/lp/sim?includePrices=0';\n\n        try {\n            const response = await fetch(url, {\n                credentials: 'include',\n                headers: {\n                    Accept: 'application/json'\n                }\n            });\n            if (!response.ok) {\n                throw new Error(`Failed to load filters: ${response.status}`);\n            }\n            const json = await response.json() as {definitions?: ShortCalculatorDefinitionFilter[]};\n            const filters = json.definitions;\n            return filters ?? [];\n        } catch (err) {\n            // eslint-disable-next-line no-console\n            console.error('[teaser] failed to fetch filters', err);\n            return [];\n        }\n    }\n\n    private buildInitialSelection(filters: ShortCalculatorDefinitionFilter[]): FilterFormSelection {\n        const filterSelection: Partial<FilterFormSelection> = {...this.filterSelection};\n        filters.forEach(item => {\n            if (item.definition.filterKey === FieldTypeShortCalculator.DataIncluded) {\n                filterSelection[FieldTypeShortCalculator.DataIncluded] =\n                    item.definition.selectFilterData.selectedValue ??\n                    item.definition.selectFilterData.defaultValue ??\n                    filterSelection[FieldTypeShortCalculator.DataIncluded];\n            }\n            if (item.definition.filterKey === FieldTypeShortCalculator.SelectContract) {\n                filterSelection[FieldTypeShortCalculator.SelectContract] =\n                    item.definition.selectFilterData.selectedValue ??\n                    item.definition.selectFilterData.defaultValue ??\n                    filterSelection[FieldTypeShortCalculator.SelectContract];\n            }\n        });\n        return filterSelection as FilterFormSelection;\n    }\n}\n","import {optionalCastToNumber, appendQueryParams} from './teaser-utils';\nimport {MobilfunkSimOnlyTeaserService} from './teaser-service';\nimport {\n    FilterData,\n    FilterName,\n    FilterFormSelection,\n    ShortCalculatorDefinitionFilter,\n    ShortCalculatorElementFilter\n} from './teaser-interfaces';\n \nexport class MobilfunkSimOnlyTeaserController {\n    private readonly sliderService = new MobilfunkSimOnlyTeaserService(this.host)\n    private filterData?: FilterData;\n    private filterListenersBound = false;\n\n    constructor(\n        private readonly shadowRoot: ShadowRoot,\n        private readonly host: string | null\n    ) {}\n\n    public destroy(): void {}\n\n    public init(): void {\n        this.initShortFilterTab();\n        this.loadAndRenderFilters();\n    }\n\n    private getElementById<T extends Element>(id: string): T | null {\n        return this.shadowRoot.getElementById(id) as T | null;\n    }\n\n    private patchFilterSelection(filterName: FilterName, selection: string): void {\n        const nextSelection = this.sliderService.patchFilterSelection(filterName, selection);\n        if (this.filterData) {\n            this.filterData.filterSelection = nextSelection;\n        }\n    }\n\n    private isSelected(filterData: FilterData, filterName: FilterName, value: string | number): boolean {\n        const selectedValue = filterData?.filterSelection?.[filterName];\n        if (!selectedValue) return false;\n        return optionalCastToNumber(selectedValue) === optionalCastToNumber(String(value));\n    }\n\n    private getFilterDefinitionElementOptions(\n        filterDefinitionElements: ShortCalculatorDefinitionFilter[],\n        filterName: FilterName\n    ): ShortCalculatorElementFilter[] {\n        return filterDefinitionElements\n            .filter(filter => filter.definition.filterKey === filterName as string)\n            .flatMap(filter => filter.definition.selectFilterData.elements);\n    }\n\n    private renderFilterOptions(filterData: FilterData): void {\n        const dataOptions = this.getFilterDefinitionElementOptions(filterData.filters, FilterName.DataIncluded) ?? [];\n        const contractOptions = this.getFilterDefinitionElementOptions(filterData.filters, FilterName.SelectContract) ?? [];\n\n        const dataOptionsHtml =\n            dataOptions\n                .map(option => `<option value=\"${option.value}\" ${this.isSelected(filterData, FilterName.DataIncluded, option.value) ? 'selected' : ''}>${option.prefixedLabel}</option>`)\n                .join('');\n\n        const contractOptionsHtml =\n            contractOptions\n                .map(option => `<option value=\"${option.value}\" ${this.isSelected(filterData, FilterName.SelectContract, option.value) ? 'selected' : ''}>${option.prefixedLabel}</option>`)\n                .join('');\n\n        const dataVolumeSelect = this.getElementById<HTMLSelectElement>('c24mfso-data-volume-select');\n        const contractDurationSelect = this.getElementById<HTMLSelectElement>('c24mfso-contract-duration-select');\n\n        if (!dataVolumeSelect || !contractDurationSelect) return;\n\n        dataVolumeSelect.innerHTML = dataOptionsHtml;\n        contractDurationSelect.innerHTML = contractOptionsHtml;\n\n        this.updateFilterValueDisplay(dataVolumeSelect, 'c24mfso-data-volume-value');\n        this.updateFilterValueDisplay(contractDurationSelect, 'c24mfso-contract-duration-value');\n\n        this.removeSkeletonStyling();\n    }\n\n    private removeSkeletonStyling(): void {\n        this.shadowRoot.querySelectorAll(\".skeleton\").forEach((element) => element.classList.remove(\"skeleton\"));\n        this.shadowRoot.querySelectorAll(\".skeleton-text\").forEach((element) => element.classList.remove(\"skeleton-text\"));\n        this.shadowRoot.querySelectorAll(\".skeleton-invisible\").forEach((element) => element.classList.remove(\"skeleton-invisible\"));\n        this.shadowRoot.querySelectorAll(\".skeleton-text-small\").forEach((element) => element.classList.remove(\"skeleton-text-small\"));\n    }\n\n    private updateFilterValueDisplay(selectElement: HTMLSelectElement, valueElementId: string): void {\n        const valueElement = this.getElementById<HTMLSpanElement>(valueElementId);\n        if (!valueElement || !selectElement) return;\n        valueElement.textContent = selectElement.options[selectElement.selectedIndex]?.text ?? '';\n    }\n\n    private getSubmitLink(filterSelection: FilterFormSelection): string {\n        const base = this.host ? `https://${this.host}` : 'https://handytarife.check24.de';\n        return `${base}/${appendQueryParams('vergleich', {\n            data_included: filterSelection[FilterName.DataIncluded],\n            select_contract: filterSelection[FilterName.SelectContract],\n            user_journey: 'comparison'\n        })}`;\n    }\n\n    private initSubmitLinkHandler(): void {\n        const submitLink = this.getElementById<HTMLAnchorElement>('c24mfso-submit-link');\n        const teaserLink = this.getElementById<HTMLAnchorElement>('c24mfso-teaser-link');\n        if (!submitLink) return;\n\n        submitLink.addEventListener('click', () => {\n            if (!window.dataLayer) window.dataLayer = [];\n            window.dataLayer.push({event: 'teaser_click', product: 'mobilfunk:simonly'});\n        });\n        if (teaserLink) {\n            teaserLink.addEventListener('click', () => {\n                if (!window.dataLayer) window.dataLayer = [];\n                window.dataLayer.push({event: 'teaser_click', product: 'mobilfunk:simonly'});\n            });\n        }\n\n        this.updateSubmitLink();\n    }\n\n    private initFilterSelectListeners(): void {\n        if (this.filterListenersBound) return;\n\n        const dataVolumeSelect = this.getElementById<HTMLSelectElement>('c24mfso-data-volume-select');\n        const contractDurationSelect = this.getElementById<HTMLSelectElement>('c24mfso-contract-duration-select');\n\n        if (!dataVolumeSelect || !contractDurationSelect) return;\n\n        dataVolumeSelect.addEventListener('change', (event) => {\n            const select = event.target as HTMLSelectElement;\n            this.patchFilterSelection(FilterName.DataIncluded, select.value);\n            this.updateFilterValueDisplay(select, 'c24mfso-data-volume-value');\n            this.updateSubmitLink();\n        });\n        contractDurationSelect.addEventListener('change', (event) => {\n            const select = event.target as HTMLSelectElement;\n            this.patchFilterSelection(FilterName.SelectContract, select.value);\n            this.updateFilterValueDisplay(select, 'c24mfso-contract-duration-value');\n            this.updateSubmitLink();\n        });\n\n        this.filterListenersBound = true;\n    }\n\n    private initShortFilterTab(): void {\n        const shortFilterTab = this.getElementById<HTMLAnchorElement>('c24mfso-short-filter-tab-inactive');\n        if (!shortFilterTab) return;\n        shortFilterTab.href = 'https://handyvertrag.check24.de';\n    }\n\n    private async loadAndRenderFilters(): Promise<void> {\n        this.filterData = await this.sliderService.loadFilterData();\n        this.renderFilterOptions(this.filterData);\n        this.initFilterSelectListeners();\n        this.initSubmitLinkHandler();\n    }\n\n    private updateSubmitLink(): void {\n        const target = this.getElementById<HTMLAnchorElement>('c24mfso-submit-link');\n        const teaserLink = this.getElementById<HTMLAnchorElement>('c24mfso-teaser-link');\n        if (!target || !this.filterData) return;\n        const href = this.getSubmitLink(this.filterData.filterSelection);\n        target.href = href;\n        if (teaserLink) {\n            teaserLink.href = href;\n        }\n    }\n}\n","import template from './teaser.html';\nimport {MobilfunkSimOnlyTeaserController} from './teaser-controller';\n\ntype BackgroundVariant = 'mobile' | 'desktop-small' | 'desktop' | 'desktop-too-large';\n\ninterface BackgroundStyle {\n    backgroundPosition: string;\n    backgroundSize: string;\n}\n\nexport class MobilfunkSimOnlyTeaser extends HTMLElement {\n    private controller?: MobilfunkSimOnlyTeaserController;\n    private shadow: ShadowRoot;\n\n    constructor() {\n        super();\n        this.shadow = this.attachShadow({mode: 'closed'});\n    }\n\n    connectedCallback(): void {\n        const isPreview = this.getAttribute('data-is-preview') === 'true';\n        var host = null;\n        if (isPreview && window) {\n            host = window.location.host;\n        }\n\n        this.shadow.innerHTML = template;\n        this.controller = new MobilfunkSimOnlyTeaserController(this.shadow, host);\n        this.controller.init();\n        this.setupResponsiveBackground();\n    }\n\n    updateBackground(variant: BackgroundVariant): void {\n        const variantStyles: Record<BackgroundVariant, BackgroundStyle> = {\n            'mobile': {\n                backgroundPosition: 'center top',\n                backgroundSize: 'auto 480px',\n            },\n            'desktop-small': {\n                backgroundPosition: 'calc(50% - 300px) top',\n                backgroundSize: 'cover'\n            },\n            'desktop': {\n                backgroundPosition: 'calc(50% - 130px) top',\n                backgroundSize: 'cover'\n            },\n            'desktop-too-large': {\n                backgroundPosition: 'calc(50% - 130px) center',\n                backgroundSize: '130%',\n            }\n        };\n\n        const productSlug = this.getAttribute('product-slug') ?? 'mobileservice_simonly';\n\n        this.dispatchEvent(new CustomEvent('c24-background-update', {\n            bubbles: true,\n            detail: {\n                productSlug: productSlug,\n                styles: variantStyles[variant]\n            }\n        }));\n    };\n\n    setupResponsiveBackground(): void {\n        if (!window) return;\n        const mobileQuery = window.matchMedia('(max-width: 768px)');\n        const desktopSmallQuery = window.matchMedia('(max-width: 960px)');\n        const desktopTooLargeQuery = window.matchMedia('(min-width: 1921px)');\n\n        const getVariant = (): BackgroundVariant => {\n            if (mobileQuery.matches) return 'mobile';\n            if (desktopSmallQuery.matches) return 'desktop-small';\n            if (desktopTooLargeQuery.matches) return 'desktop-too-large';\n            return 'desktop';\n        };\n\n        let currentVariant = getVariant();\n        this.updateBackground(currentVariant);\n\n        const onChange = () => {\n            const next = getVariant();\n            currentVariant = next;\n            this.updateBackground(currentVariant);\n        };\n\n        mobileQuery.addEventListener('change', onChange);\n        desktopSmallQuery.addEventListener('change', onChange);\n        desktopTooLargeQuery.addEventListener('change', onChange);\n\n        // force first update\n        onChange();\n        setTimeout(() => {\n            requestAnimationFrame(() => {\n                onChange();\n            });\n        }, 20);\n    }\n\n    disconnectedCallback(): void {\n        this.controller?.destroy();\n    }\n}\n\ncustomElements.define('mobileservice-simonly-teaser', MobilfunkSimOnlyTeaser);\n\nexport default MobilfunkSimOnlyTeaser;\n"],"names":["optionalCastToNumber","value","parsed","parseInt","FilterName","FieldTypeShortCalculator","MobilfunkSimOnlyTeaserService","constructor","host","filterSelection","DataIncluded","SelectContract","this","filters$","loadFilters","destroy","loadFilterData","filters","initialSelection","buildInitialSelection","patchFilterSelection","filterKey","url","response","fetch","credentials","headers","Accept","ok","Error","status","json","definitions","err","console","error","forEach","item","definition","selectFilterData","selectedValue","defaultValue","MobilfunkSimOnlyTeaserController","shadowRoot","sliderService","filterListenersBound","init","initShortFilterTab","loadAndRenderFilters","getElementById","id","filterName","selection","nextSelection","filterData","isSelected","String","getFilterDefinitionElementOptions","filterDefinitionElements","filter","flatMap","elements","renderFilterOptions","dataOptions","contractOptions","dataOptionsHtml","map","option","prefixedLabel","join","contractOptionsHtml","dataVolumeSelect","contractDurationSelect","innerHTML","updateFilterValueDisplay","removeSkeletonStyling","querySelectorAll","element","classList","remove","selectElement","valueElementId","valueElement","textContent","options","selectedIndex","text","getSubmitLink","base","params","queryParams","Object","entries","key","encodeURIComponent","appendQueryParams","data_included","select_contract","user_journey","initSubmitLinkHandler","submitLink","teaserLink","addEventListener","window","dataLayer","push","event","product","updateSubmitLink","initFilterSelectListeners","select","target","shortFilterTab","href","MobilfunkSimOnlyTeaser","HTMLElement","super","shadow","attachShadow","mode","connectedCallback","getAttribute","location","controller","setupResponsiveBackground","updateBackground","variant","productSlug","dispatchEvent","CustomEvent","bubbles","detail","styles","backgroundPosition","backgroundSize","mobileQuery","matchMedia","desktopSmallQuery","desktopTooLargeQuery","getVariant","matches","currentVariant","onChange","next","setTimeout","requestAnimationFrame","disconnectedCallback","customElements","define"],"ignoreList":[],"sourceRoot":""}