{"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\nexport interface PromoResponse {\n    shortText: string;\n}\n","import {\n    FilterName,\n    FilterFormSelection,\n    FilterData,\n    ShortCalculatorDefinitionFilter,\n    FieldTypeShortCalculator,\n    PromoResponse\n} from './teaser-interfaces';\n\nexport class MobilfunkSimOnlyTeaserService {\n\n    private promo$: Promise<PromoResponse> | undefined;\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        this.promo$ = this.loadPromo();\n    }\n\n    public destroy(): void {}\n\n    public async loadData(): Promise<{filterData: FilterData, promo: PromoResponse}> {\n        const filters = await (this.filters$ ?? this.loadFilters());\n        const promo = await (this.promo$ ?? this.loadPromo());\n\n        const initialSelection = this.buildInitialSelection(filters);\n        this.filterSelection = initialSelection;\n\n        return {\n            filterData: {\n                filterSelection: initialSelection,\n                filters\n            },\n            promo: promo\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 async loadPromo(): Promise<PromoResponse> {\n        const base = this.host ? `https://${this.host}` : 'https://handytarife.check24.de';\n        const url = base + '/api/v1/desktop/landing-page/promo/handytarife/widget';\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 promo: ${response.status}`);\n            }\n            const json = await response.json() as PromoResponse;\n            return json;\n        } catch (err) {\n            // eslint-disable-next-line no-console\n            console.error('[teaser] failed to fetch promo', err);\n            return { shortText: \"Nur für kurze Zeit\" };\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    PromoResponse\n} from './teaser-interfaces';\n \nexport class MobilfunkSimOnlyTeaserController {\n    private readonly sliderService = new MobilfunkSimOnlyTeaserService(this.host)\n    private data?: {filterData: FilterData, promo: PromoResponse};\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.loadAndDisplayFilters();\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.data) {\n            this.data.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 displayFilterOptions(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 loadAndDisplayFilters(): Promise<void> {\n        this.data = await this.sliderService.loadData();\n        this.displayFilterOptions(this.data.filterData);\n        this.displayPromo(this.data.promo);\n        this.initFilterSelectListeners();\n        this.initSubmitLinkHandler();\n    }\n\n    private displayPromo(promo: PromoResponse): void {\n        const target = this.getElementById<HTMLAnchorElement>('mfso-promo-text');\n        if (target) {\n            target.innerHTML = promo.shortText ?? \"\";\n        }\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.data) return;\n        const href = this.getSubmitLink(this.data.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\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    }\n\n    disconnectedCallback(): void {\n        this.controller?.destroy();\n    }\n}\n\ncustomElements.define('mobileservice-simonly-teaser-summerpromo', MobilfunkSimOnlyTeaser);\n\nexport default MobilfunkSimOnlyTeaser;\n"],"names":["optionalCastToNumber","value","parsed","parseInt","FilterName","FieldTypeShortCalculator","MobilfunkSimOnlyTeaserService","constructor","host","filterSelection","DataIncluded","SelectContract","this","filters$","loadFilters","promo$","loadPromo","destroy","loadData","filters","promo","initialSelection","buildInitialSelection","filterData","patchFilterSelection","filterKey","url","response","fetch","credentials","headers","Accept","ok","Error","status","json","definitions","err","console","error","shortText","forEach","item","definition","selectFilterData","selectedValue","defaultValue","MobilfunkSimOnlyTeaserController","shadowRoot","sliderService","filterListenersBound","init","initShortFilterTab","loadAndDisplayFilters","getElementById","id","filterName","selection","nextSelection","data","isSelected","String","getFilterDefinitionElementOptions","filterDefinitionElements","filter","flatMap","elements","displayFilterOptions","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","displayPromo","MobilfunkSimOnlyTeaser","HTMLElement","super","shadow","attachShadow","mode","connectedCallback","getAttribute","location","controller","disconnectedCallback","customElements","define"],"ignoreList":[],"sourceRoot":""}