{"version":3,"file":"find-my-sofa.js","names":[],"sources":["../resources/javascript/find-my-sofa.js"],"sourcesContent":["import { delegateEvent } from './util/events';\nimport { dataLayerPush } from './util/tracking';\n\n// Constants\nconst RESULTS_REDIRECT_DURATION = 3000;\nconst CALCULATING_CHECK_DELAY = 5000;\n\n// State management\nlet hasCalledSearchAPI = false;\n\nfunction normalizeQuizPath(value) {\n    if (Array.isArray(value)) return value;\n    if (typeof value !== 'string') return [];\n\n    const trimmed = value.trim();\n    if (!trimmed) return [];\n\n    try {\n        const parsed = JSON.parse(trimmed);\n        if (Array.isArray(parsed)) return parsed;\n        if (typeof parsed === 'string') return parsed ? [parsed] : [];\n    } catch (e) {}\n\n    if (trimmed.includes(' > ')) {\n        return trimmed\n            .split(' > ')\n            .map(part => part.trim())\n            .filter(Boolean);\n    }\n\n    return [trimmed];\n}\n\n/* ========================================================\n * EVENT HANDLERS\n * ====================================================== */\n\n/**\n * Handle answer button clicks\n */\ndelegateEvent(\n    document,\n    'click',\n    '.find-my-sofa-content button',\n    handleAnswerClick\n);\n\n/**\n * Handle results page buttons (submit/skip)\n */\ndelegateEvent(document, 'click', '[data-show-results]', handleResultsAction);\n\n/**\n * Handle form submit (Enter key in email input)\n */\ndelegateEvent(\n    document,\n    'submit',\n    '[data-results-step=\"email\"] form',\n    handleEmailFormSubmit\n);\n\n/**\n * Handle close/exit button\n */\ndelegateEvent(document, 'click', '.find-my-sofa__close', handleCloseClick);\n\n/**\n * Handle Breadcrumb back button Navigation\n */\ndelegateEvent(\n    document,\n    'click',\n    '[data-breadcrumb-back]',\n    handleCrumbBackClick\n);\n\n/**\n * Handle email input validation\n */\ndelegateEvent(document, 'input', '#email', handleEmailInput);\n\n/* ========================================================\n * HANDLER IMPLEMENTATIONS\n * ====================================================== */\n\nfunction handleAnswerClick(e) {\n    const button = e.target.closest('button');\n    const parent = button.closest('[data-find-my-sofa-target]');\n\n    if (!parent) return;\n\n    const target = JSON.parse(parent.dataset.findMySofaTarget);\n    const nextSection = document.querySelector(\n        `#section_${target.step}_${target.question}`\n    );\n\n    if (!nextSection) {\n        return;\n    }\n\n    navigateToSection(nextSection, target);\n\n    // Auto-redirect to results after calculating screen\n    if (target.step === 4 && target.question === 0) {\n        setTimeout(() => {\n            const resultsSection = document.querySelector(\n                `#section_${target.step}_${target.question + 1}`\n            );\n            if (resultsSection) {\n                navigateToSection(resultsSection, target);\n            }\n        }, RESULTS_REDIRECT_DURATION);\n    }\n}\n\nfunction handleResultsAction(e) {\n    e.preventDefault();\n    const button = e.target.closest('[data-show-results]');\n    const action = button.dataset.showResults;\n    const resultsId = getResultsIdFromUrl();\n    const container = document.querySelector('[data-results-step=\"email\"]');\n    const quizRunId = parseInt(container?.dataset.quizRunId, 10) || 0;\n    const quizPath = normalizeQuizPath(container?.dataset.quizPath);\n\n    dataLayerPush({\n        event: 'email_results_sofa_quiz',\n        quiz_run_id: quizRunId,\n        quiz_stage: 'Results',\n        quiz_step: 'Email',\n        quiz_value: action === 'submit' ? 'View my matches' : 'No thanks, skip',\n        quiz_path: quizPath,\n    });\n\n    if (action === 'submit') {\n        submitEmailAndRedirect(resultsId);\n    } else if (action === 'skip') {\n        redirectToResultsListing(resultsId);\n    }\n}\n\nfunction handleEmailFormSubmit(e) {\n    e.preventDefault();\n    const submitButton = document.querySelector('[data-show-results=\"submit\"]');\n    submitButton?.click();\n}\n\nfunction handleCloseClick(e) {\n    e.preventDefault();\n\n    if (\n        confirm(\n            'Are you sure you want to exit the quiz? Your progress will be lost.'\n        )\n    ) {\n        const cancelUrl = '/quiz/cancel';\n        window.location.href = window.location.origin + cancelUrl;\n    }\n}\n\nfunction handleCrumbBackClick(e) {\n    e.preventDefault();\n    const link = e.target.closest('[data-breadcrumb-back]');\n    const url = link.getAttribute('href');\n\n    if (\n        confirm('Are you sure you want to go back? Your progress will be lost.')\n    ) {\n        window.location.href = url;\n    }\n}\n\n/* ========================================================\n * NAVIGATION FUNCTIONS\n * ====================================================== */\n\nfunction navigateToSection(section, target) {\n    const container = document.querySelector('.find-my-sofa__content');\n    const root = getRootElement();\n\n    if (!container || !root) return;\n\n    container.innerHTML = section.innerHTML;\n    root.dataset.step = target.step;\n\n    updateBackButtonVisibility(target);\n    checkForLoadingScreen(target);\n}\n\nfunction updateBackButtonVisibility(target) {\n    const root = getRootElement();\n    if (!root) return;\n\n    if ((target.step > 1 && target.step < 4) || target.question > 0) {\n        root.dataset.showBack = true;\n    } else {\n        delete root.dataset.showBack;\n    }\n}\n\nfunction handleEmailInput(e) {\n    const emailInput = e.target;\n    const form = emailInput.closest('.find-my-sofa-form');\n\n    if (!form) return;\n\n    const isValid =\n        emailInput.value.includes('@') && emailInput.value.trim().length > 2;\n\n    form.classList.toggle('has-valid-email', isValid);\n}\n\n/* ========================================================\n * RESULTS & EMAIL FUNCTIONS\n * ====================================================== */\n\nfunction submitEmailAndRedirect(resultsId) {\n    const emailInput = document.querySelector('#email');\n    const optOutInput = document.querySelector('#customer_optout_email');\n    const email = emailInput?.value;\n    const optOut = optOutInput?.checked;\n\n    if (!email || !email.includes('@')) {\n        return;\n    }\n\n    if (!optOut) {\n        const container = document.querySelector('[data-results-step=\"email\"]');\n        const quizRunId = parseInt(container?.dataset.quizRunId, 10) || 0;\n        const quizPath = normalizeQuizPath(container?.dataset.quizPath);\n\n        dataLayerPush({\n            event: 'email_opt_in_sofa_quiz',\n            quiz_run_id: quizRunId,\n            quiz_stage: 'Results',\n            quiz_step: 'Email',\n            quiz_path: quizPath,\n        });\n    }\n\n    // Get quiz slug from URL (e.g., /quiz/sofa-quiz/results/... -> sofa-quiz)\n    const pathParts = window.location.pathname.split('/');\n    const quizIndex = pathParts.indexOf('quiz');\n    const quizSlug = quizIndex !== -1 ? pathParts[quizIndex + 1] : null;\n\n    if (!quizSlug) {\n        redirectToResultsListing(resultsId);\n        return;\n    }\n\n    const formData = new FormData();\n    formData.append('email', email);\n    formData.append('customer_optout_email', optOut ? '1' : '0');\n\n    fetch(`/quiz/${quizSlug}/quiz-results-email`, {\n        method: 'POST',\n        headers: { 'X-Requested-With': 'XMLHttpRequest' },\n        body: formData,\n    })\n        .then(response => response.json())\n        .finally(() => {\n            redirectToResultsListing(resultsId);\n        });\n}\n\nfunction redirectToResultsListing(resultsId) {\n    window.location.href = `/quiz/results-listing/${resultsId}`;\n}\n\nfunction getResultsIdFromUrl() {\n    const pathParts = window.location.pathname.split('/');\n    return pathParts[pathParts.length - 1];\n}\n\n/* ========================================================\n * CALCULATING & LOADING SCREEN\n * ====================================================== */\n\nfunction checkForLoadingScreen(target) {\n    const content = document.querySelector('.find-my-sofa__content');\n    if (!content) return;\n\n    const currentElement = content.querySelector(\n        '[data-find-my-sofa-step][data-find-my-sofa-question]'\n    );\n    const backButton = document.querySelector('[data-hide-on-loading]');\n\n    if (!currentElement) return;\n\n    const isLoadingScreen = currentElement.classList.contains(\n        'find-my-sofa-loading'\n    );\n\n    if (isLoadingScreen) {\n        hideElement(backButton);\n        triggerSearchAPI();\n    } else {\n        showElement(backButton);\n    }\n}\n\nfunction triggerSearchAPI() {\n    if (hasCalledSearchAPI) return;\n\n    hasCalledSearchAPI = true;\n\n    const quizPath = window.location.pathname;\n    const searchUrl = `${quizPath}/search`;\n\n    fetch(searchUrl)\n        .then(response => response.json())\n        .then(data => {\n            if (data.redirect) {\n                window.location.href = `${quizPath}/results`;\n            }\n        })\n        .catch(() => {});\n}\n\nasync function checkCalculatingStatus(quizUrl) {\n    await sleep(CALCULATING_CHECK_DELAY);\n\n    try {\n        const response = await fetch(`/quiz/${quizUrl}/calculating`, {\n            method: 'POST',\n            headers: { 'X-Requested-With': 'XMLHttpRequest' },\n        });\n\n        const data = await response.json();\n\n        if (data.payload?.success === true) {\n            window.location.href = `/quiz/${quizUrl}/results/${data.payload.results_id}`;\n        }\n\n        if (data.payload?.success === false) {\n            window.location.href = `/quiz/${quizUrl}/start`;\n        }\n    } catch (error) {}\n}\n\n/* ========================================================\n * UTILITY FUNCTIONS\n * ====================================================== */\n\nfunction getRootElement() {\n    return document.querySelector('.find-my-sofa');\n}\n\nfunction hideElement(element) {\n    if (element) element.style.display = 'none';\n}\n\nfunction showElement(element) {\n    if (element) element.style.display = '';\n}\n\nfunction sleep(ms) {\n    return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/* ========================================================\n * INITIALIZATION\n * ====================================================== */\n\n// Auto-trigger calculating check if on calculating page\nconst calculatingElement = document.querySelector('[data-calculating]');\nif (calculatingElement) {\n    const pathParts = window.location.pathname.split('/');\n    const quizUrlIndex = pathParts.indexOf('quiz');\n\n    if (quizUrlIndex !== -1 && pathParts[quizUrlIndex + 1]) {\n        const quizUrl = pathParts[quizUrlIndex + 1];\n        checkCalculatingStatus(quizUrl);\n    }\n}\n\n/* ========================================================\n * GA4 QUIZ TRACKING\n * ====================================================== */\n\n/**\n * Track start_sofa_quiz — click on \"Get started\"\n */\ndelegateEvent(document, 'click', '[data-track=\"start-sofa-quiz\"]', () => {\n    dataLayerPush({\n        event: 'start_sofa_quiz',\n    });\n});\n\n/**\n * Track stage_sofa_quiz — page load on category or question pages\n */\nconst stageElement = document.querySelector('[data-quiz-stage]');\nif (stageElement) {\n    dataLayerPush({\n        event: 'stage_sofa_quiz',\n        quiz_run_id: parseInt(stageElement.dataset.quizRunId, 10) || 0,\n        quiz_stage: stageElement.dataset.quizStage,\n        quiz_step: stageElement.dataset.quizStep,\n    });\n}\n\n/**\n * Track selection_sofa_quiz — click on answer button\n */\ndelegateEvent(\n    document,\n    'click',\n    '[data-quiz-form] button[name=\"answerId\"]',\n    (e, button) => {\n        const form = document.querySelector('[data-quiz-form]');\n        if (!form) return;\n\n        const labelEl = button.querySelector('.find-my-sofa-answer__content');\n        const value = labelEl\n            ? labelEl.childNodes[0].textContent.trim()\n            : button.textContent.trim();\n\n        dataLayerPush({\n            event: 'selection_sofa_quiz',\n            quiz_run_id: parseInt(form.dataset.quizRunId, 10) || 0,\n            quiz_stage: form.dataset.quizStage,\n            quiz_step: form.dataset.quizStep,\n            quiz_value: value,\n        });\n    }\n);\n\n/**\n * Track sofa_quiz_recommendation — page load on results listing\n */\nconst recommendationScript = document.querySelector(\n    'script[data-quiz-recommendation]'\n);\nif (recommendationScript) {\n    try {\n        const data = JSON.parse(recommendationScript.textContent);\n        const quizPath = normalizeQuizPath(data.quiz_path);\n        dataLayerPush({\n            event: 'sofa_quiz_recommendation',\n            quiz_run_id: data.quiz_run_id,\n            quiz_stage: 'Results',\n            quiz_step: 'Sofa recommendation',\n            quiz_path: quizPath,\n            ecommerce: {\n                items: data.items,\n            },\n        });\n    } catch (e) {\n        /* malformed tracking data */\n    }\n}\n\n/**\n * Track sofa_quiz_results_interaction — click on results page elements\n */\nfunction handleQuizResultsInteraction(e, link) {\n    const container = document.querySelector('.js-quiz-results_listing');\n    if (!container) return;\n\n    const quizPath = normalizeQuizPath(container.dataset.quizPath);\n    dataLayerPush({\n        event: 'sofa_quiz_results_interaction',\n        quiz_run_id: parseInt(container.dataset.quizRunId, 10) || 0,\n        quiz_stage: 'Results',\n        quiz_step: 'Sofa recommendation',\n        quiz_value: link.textContent.trim(),\n        quiz_path: quizPath,\n    });\n}\n\ndelegateEvent(\n    document,\n    'click',\n    '.js-quiz-results_listing a.button',\n    handleQuizResultsInteraction\n);\ndelegateEvent(\n    document,\n    'click',\n    '.js-quiz-results_listing button.button',\n    handleQuizResultsInteraction\n);\n\n/**\n * Track sofa_quiz_results_interaction — shortlist button on results page\n */\ndelegateEvent(\n    document,\n    'click',\n    '.js-quiz-results_listing [data-shortlist-action]',\n    (e, button) => {\n        const container = document.querySelector('.js-quiz-results_listing');\n        if (!container) return;\n\n        const action =\n            button.dataset.shortlistAction === 'add'\n                ? 'Add to shortlist'\n                : 'Remove from shortlist';\n        const quizPath = normalizeQuizPath(container.dataset.quizPath);\n\n        dataLayerPush({\n            event: 'sofa_quiz_results_interaction',\n            quiz_run_id: parseInt(container.dataset.quizRunId, 10) || 0,\n            quiz_stage: 'Results',\n            quiz_step: 'Sofa recommendation',\n            quiz_value: action,\n            quiz_path: quizPath,\n        });\n    }\n);\n"],"mappings":"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"}