import ctEvents from 'ct-events'
import { updateAndSaveEl } from '../../../../static/js/frontend/header/render-loop'
import { responsiveClassesFor } from '../../../../static/js/customizer/sync/helpers'
import {
getRootSelectorFor,
assembleSelector,
mutateSelector,
} from '../../../../static/js/customizer/sync/helpers'
const svgs = {
'type-1':
'',
'type-2':
'',
'type-3':
'',
}
ctEvents.on(
'ct:header:sync:collect-variable-descriptors',
(variableDescriptors) => {
variableDescriptors['cart'] = ({ itemId }) => ({
cartIconSize: {
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '.ct-icon-container',
})
),
variable: 'icon-size',
responsive: true,
unit: 'px',
},
cartDropdownTopOffset: {
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '.ct-cart-content',
})
),
variable: 'dropdownTopOffset',
unit: 'px',
},
cartFontColor: [
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '.ct-cart-content',
})
),
variable: 'linkInitialColor',
type: 'color:default',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '.ct-cart-content',
})
),
variable: 'linkHoverColor',
type: 'color:hover',
responsive: true,
},
],
cartDropDownBackground: {
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '.ct-cart-content',
})
),
variable: 'backgroundColor',
type: 'color:default',
responsive: true,
},
headerCartMargin: {
selector: assembleSelector(getRootSelectorFor({ itemId })),
type: 'spacing',
variable: 'margin',
responsive: true,
important: true,
},
// default state
cartHeaderIconColor: [
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
})
),
variable: 'linkInitialColor',
type: 'color:default',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
})
),
variable: 'linkHoverColor',
type: 'color:hover',
responsive: true,
},
],
cartBadgeColor: [
{
selector: assembleSelector(getRootSelectorFor({ itemId })),
variable: 'cartBadgeBackground',
type: 'color:background',
responsive: true,
},
{
selector: assembleSelector(getRootSelectorFor({ itemId })),
variable: 'cartBadgeText',
type: 'color:text',
responsive: true,
},
],
// transparent state
transparentCartHeaderIconColor: [
{
selector: assembleSelector(
mutateSelector({
selector: mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
}),
operation: 'between',
to_add: '[data-transparent-row="yes"]',
})
),
variable: 'linkInitialColor',
type: 'color:default',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
}),
operation: 'between',
to_add: '[data-transparent-row="yes"]',
})
),
variable: 'linkHoverColor',
type: 'color:hover',
responsive: true,
},
],
transparentCartBadgeColor: [
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'between',
to_add: '[data-transparent-row="yes"]',
})
),
variable: 'cartBadgeBackground',
type: 'color:background',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'between',
to_add: '[data-transparent-row="yes"]',
})
),
variable: 'cartBadgeText',
type: 'color:text',
responsive: true,
},
],
// sticky state
stickyCartHeaderIconColor: [
{
selector: assembleSelector(
mutateSelector({
selector: mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
}),
operation: 'between',
to_add: '[data-sticky*="yes"]',
})
),
variable: 'linkInitialColor',
type: 'color:default',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'suffix',
to_add: '> a',
}),
operation: 'between',
to_add: '[data-sticky*="yes"]',
})
),
variable: 'linkHoverColor',
type: 'color:hover',
responsive: true,
},
],
stickyCartBadgeColor: [
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'between',
to_add: '[data-sticky*="yes"]',
})
),
variable: 'cartBadgeBackground',
type: 'color:background',
responsive: true,
},
{
selector: assembleSelector(
mutateSelector({
selector: getRootSelectorFor({ itemId }),
operation: 'between',
to_add: '[data-sticky*="yes"]',
})
),
variable: 'cartBadgeText',
type: 'color:text',
responsive: true,
},
],
})
}
)
ctEvents.on('ct:header:sync:item:cart', ({ optionId, optionValue, values }) => {
const selector = '[data-id="cart"]'
if (optionId === 'header_cart_visibility') {
updateAndSaveEl(selector, (el) =>
responsiveClassesFor({ ...optionValue, desktop: true }, el)
)
}
if (optionId === 'has_cart_subtotal') {
updateAndSaveEl(selector, (el) => {
;[...el.querySelectorAll('.ct-cart-total')].map((el) => el.remove())
if (optionValue === 'yes') {
const span = document.createElement('span')
span.innerHTML = el.dataset.subtotal
span.classList.add('ct-cart-total')
el.querySelector('a').prepend(span)
}
})
}
if (optionId === 'has_cart_badge') {
updateAndSaveEl(selector, (el) => {
el.firstElementChild.removeAttribute('data-skip-badge')
if (optionValue === 'yes') return
el.firstElementChild.dataset.skipBadge = ''
})
}
if (optionId === 'mini_cart_type') {
updateAndSaveEl(selector, (el) => {
el.querySelector('a > .ct-icon-container').innerHTML =
svgs[optionValue]
})
}
})