{"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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"}