{"version":3,"file":"CartLineQuantityAdjustButton.mjs","sources":["../../src/CartLineQuantityAdjustButton.tsx"],"sourcesContent":["import {useCallback} from 'react';\nimport {useCart} from './CartProvider.js';\nimport {useCartLine} from './CartLineProvider.js';\nimport {BaseButton, type BaseButtonProps} from './BaseButton.js';\nimport type {CartLineUpdateInput} from './storefront-api-types.js';\n\ninterface CartLineQuantityAdjustButtonBaseProps {\n  /** The adjustment for a cart line's quantity. Valid values: `increase` (default), `decrease`, or `remove`. */\n  adjust?: 'increase' | 'decrease' | 'remove';\n}\n\ntype CartLineQuantityAdjustButtonProps<\n  AsType extends React.ElementType = 'button',\n> = BaseButtonProps<AsType> & CartLineQuantityAdjustButtonBaseProps;\n\n/**\n * The `<CartLineQuantityAdjustButton />` component renders a button that adjusts the cart line's quantity when pressed.\n *\n * It must be a descendent of `<CartLineProvider/>` and `<CartProvider/>`.\n */\nexport function CartLineQuantityAdjustButton<\n  AsType extends React.ElementType = 'button',\n>(props: CartLineQuantityAdjustButtonProps<AsType>): JSX.Element {\n  const {status, linesRemove, linesUpdate} = useCart();\n  const cartLine = useCartLine();\n  const {children, adjust, onClick, ...passthroughProps} = props;\n\n  const handleAdjust = useCallback(() => {\n    if (adjust === 'remove') {\n      linesRemove([cartLine?.id ?? '']);\n      return;\n    }\n\n    const quantity =\n      adjust === 'decrease'\n        ? (cartLine?.quantity ?? 0) - 1\n        : (cartLine?.quantity ?? 0) + 1;\n\n    if (quantity <= 0) {\n      linesRemove([cartLine?.id ?? '']);\n      return;\n    }\n\n    const lineUpdate = {\n      id: cartLine?.id ?? '',\n      quantity,\n      attributes: (cartLine?.attributes ??\n        []) as CartLineUpdateInput['attributes'],\n    } satisfies CartLineUpdateInput;\n\n    linesUpdate([lineUpdate]);\n  }, [\n    adjust,\n    cartLine?.attributes,\n    cartLine?.id,\n    cartLine?.quantity,\n    linesRemove,\n    linesUpdate,\n  ]);\n\n  // Only certain 'as' types such as 'button' contain `disabled`\n  const disabledAttr = (passthroughProps as {disabled?: boolean}).disabled;\n\n  return (\n    <BaseButton\n      {...passthroughProps}\n      onClick={onClick}\n      defaultOnClick={handleAdjust}\n      disabled={\n        typeof disabledAttr !== 'undefined' ? disabledAttr : status !== 'idle'\n      }\n    >\n      {children}\n    </BaseButton>\n  );\n}\n"],"names":[],"mappings":";;;;;AAoBO,SAAS,6BAEd,OAA+D;AAC/D,QAAM,EAAC,QAAQ,aAAa,YAAA,IAAe,QAAA;AAC3C,QAAM,WAAW,YAAA;AACjB,QAAM,EAAC,UAAU,QAAQ,SAAS,GAAG,qBAAoB;AAEzD,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,WAAW,UAAU;AACvB,kBAAY,EAAC,qCAAU,OAAM,EAAE,CAAC;AAChC;AAAA,IACF;AAEA,UAAM,WACJ,WAAW,eACN,qCAAU,aAAY,KAAK,MAC3B,qCAAU,aAAY,KAAK;AAElC,QAAI,YAAY,GAAG;AACjB,kBAAY,EAAC,qCAAU,OAAM,EAAE,CAAC;AAChC;AAAA,IACF;AAEA,UAAM,aAAa;AAAA,MACjB,KAAI,qCAAU,OAAM;AAAA,MACpB;AAAA,MACA,aAAa,qCAAU,eACrB,CAAA;AAAA,IAAC;AAGL,gBAAY,CAAC,UAAU,CAAC;AAAA,EAC1B,GAAG;AAAA,IACD;AAAA,IACA,qCAAU;AAAA,IACV,qCAAU;AAAA,IACV,qCAAU;AAAA,IACV;AAAA,IACA;AAAA,EAAA,CACD;AAGD,QAAM,eAAgB,iBAA0C;AAEhE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,gBAAgB;AAAA,MAChB,UACE,OAAO,iBAAiB,cAAc,eAAe,WAAW;AAAA,MAGjE;AAAA,IAAA;AAAA,EAAA;AAGP;"}