@lockerverse/react 0.2.193 → 0.2.196

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/MIGRATIONS.md CHANGED
@@ -36,6 +36,33 @@ If it cannot be found, report that limit and use the baseline review below. Do n
36
36
  claim that every historical migration was applied. Read this file even if the
37
37
  version already matches: a previous upgrade may have missed host adoption steps.
38
38
 
39
+ ## 0.2.196 — save reusable payment methods
40
+
41
+ - **Affected:** React one-time payments, subscriptions, auction Buy Now, and
42
+ purchase recovery. Deferred Stripe Elements now requests `off_session` setup
43
+ so its configuration matches the backend PaymentIntent and saves supported
44
+ reusable methods, including Link, to the customer.
45
+ - **Required:** update the matching SDK/React packages and deploy the host with
46
+ the backend payment-saving change. No host prop changes are required.
47
+ - **Unchanged:** existing purchases are not converted into reusable methods.
48
+ Future charges can still require customer authentication. Methods without
49
+ off-session support cannot be made reusable by this setting.
50
+ - **Check:** in Stripe test mode, complete supported payment methods and verify
51
+ the successful PaymentIntent and customer payment-method attachment. Verify
52
+ auction Buy Now and purchase recovery with the same backend configuration.
53
+
54
+ ## 0.2.194 — sharper large auction gallery photos
55
+
56
+ - **Affected:** React auction item gallery responsive images.
57
+ - **Automatic:** the main gallery can select the existing 1920-pixel image
58
+ variant for large displays and high-density screens. Smaller variants remain
59
+ available; the browser selects a source for the rendered size and pixel ratio.
60
+ - **Required host changes:** upgrade Core and React together and deploy the host.
61
+ No integration code changes are required.
62
+ - **Unchanged:** image layout, thumbnails, full-screen viewer, and checkout.
63
+ - **Check:** inspect the selected image source in a wide embedded gallery on a
64
+ high-density screen. Confirm it can use the 1920-pixel variant without cropping.
65
+
39
66
  ## 0.2.193 — complete auction gallery photos
40
67
 
41
68
  - **Affected:** React auction item galleries and photo thumbnails.
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,i as n,l as r,n as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{n as c,t as l}from"./auction-image.js";import{a as u,i as d}from"./auction-payment.js";import{t as f}from"./auction-result2.js";import{t as p}from"./host-callback.js";import{ArrowRight as m,ChevronDown as h,ChevronLeft as g,ChevronRight as _,Clock3 as v,Gavel as y,Pause as b,Play as x,ShieldCheck as S,TimerReset as C,X as w}from"lucide-react";import{useCallback as T,useEffect as E,useId as D,useMemo as O,useRef as k,useState as A}from"react";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{getLockerverseAuctionMinimumBid as P}from"@lockerverse/sdk/auctions";import{Dialog as F}from"@base-ui/react/dialog";import I from"embla-carousel-autoplay";import L from"embla-carousel-react";const R=6e3;function z(e,t){let n=k(R),r=k(null),[i,a]=A(R),o=O(()=>I({delay:i,playOnInit:!1,stopOnFocusIn:!1,stopOnInteraction:!0,stopOnMouseEnter:!1}),[i]),[s,c]=L({duration:t?0:25,loop:!0},[o]),l=T(()=>{r.current&&(r.current.style.transform=`scaleX(${1-n.current/R})`)},[]),u=T(()=>{let e=o.timeUntilNext();e!==null&&(n.current=Math.max(1,Math.min(R,e))),o.stop(),l()},[o,l]),d=T(()=>{n.current=R,a(R),o.reset(),l()},[o,l]);return E(()=>{c&&(e?i===n.current?o.play():a(n.current):u())},[c,e,o,i,a,n,u]),E(()=>{if(!c)return;let t=0,r=()=>{let i=o.timeUntilNext();!e||i===null||(n.current=Math.max(0,Math.min(R,i)),l(),t=requestAnimationFrame(r))},i=()=>{cancelAnimationFrame(t),e&&(t=requestAnimationFrame(r))},a=()=>cancelAnimationFrame(t),s=()=>{e&&o.play()};return c.on(`select`,d).on(`reInit`,s).on(`autoplay:timerset`,i).on(`autoplay:timerstopped`,a),l(),i(),()=>{a(),c.off(`select`,d).off(`reInit`,s).off(`autoplay:timerset`,i).off(`autoplay:timerstopped`,a)}},[c,o,e,n,d,l]),{embla:c,freeze:u,progressRef:r,reset:d,viewportRef:s}}function B({photos:e,name:t,imageSizes:n=`(max-width: 1279px) 100vw, 45vw`,selected:r,paused:a=!1,photoButtonRef:o,onSelect:s,onExpand:c}){let u=k(null),d=k(null),f=k([]),[p,m]=A(!0),[h,v]=A(!1),[y,S]=A(!1),[C,w]=A(!1),[T,D]=A(!1),{ref:O,visible:P}=i(),[F,I]=A(!1),[L,R]=A(!0),B=k(null),V=`lockerverse-auction-gallery__control ${L||F||y?`is-visible`:``}`,H=()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>I(!1),2e3)},U=e=>{if(e.pointerType!==`mouse`){R(!0);return}I(!0),B.current&&clearTimeout(B.current),e.target instanceof Element&&e.target.closest(`[data-gallery-control]`)||H()};E(()=>{let e=window.matchMedia(`(hover: none), (pointer: coarse)`),t=()=>R(e.matches);return t(),e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t),clearTimeout(B.current??void 0)}},[]);let W=!(a||p||h||y||C||T)&&P,G=e.length,K=G?(r%G+G)%G:0,{viewportRef:q,embla:J,progressRef:Y,freeze:X,reset:Z}=z(W&&G>1,p);E(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>m(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),E(()=>{if(!J)return;let e=()=>s(J.selectedScrollSnap());return J.on(`select`,e).on(`reInit`,e),()=>{J.off(`select`,e).off(`reInit`,e)}},[J,s]),E(()=>{J&&J.selectedScrollSnap()!==K&&J.scrollTo(K,!0)},[J,K]),E(()=>{let e=()=>{document.hidden&&X()},t=()=>D(!1);return e(),document.addEventListener(`visibilitychange`,e,!0),window.addEventListener(`pointerup`,t),window.addEventListener(`pointercancel`,t),()=>{document.removeEventListener(`visibilitychange`,e,!0),window.removeEventListener(`pointerup`,t),window.removeEventListener(`pointercancel`,t)}},[X]);let Q=e=>{J?.scrollTo((e+G)%G,p),Z()};return E(()=>{let e=d.current;d.current=null,e&&document.activeElement===e&&O.current?.querySelector(`.lockerverse-auction-gallery__photo[tabindex="0"]`)?.focus({preventScroll:!0})},[K,O]),E(()=>{let e=u.current,t=f.current[K];if(!(e&&t))return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.left<n.left?e.scrollLeft-=n.left-r.left:r.right>n.right&&(e.scrollLeft+=r.right-n.right)},[K,G]),N(`section`,{"aria-label":`${t} photos`,className:`lockerverse-auction-gallery`,onBlurCapture:e=>{e.currentTarget.contains(e.relatedTarget)||S(!1)},onFocusCapture:e=>S(e.target.matches(`:focus-visible`)),onKeyDown:e=>{G<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),e.target instanceof HTMLButtonElement&&e.target.classList.contains(`lockerverse-auction-gallery__photo`)&&(d.current=e.target),Q(K+(e.key===`ArrowRight`?1:-1)))},onPointerEnter:e=>{e.pointerType===`mouse`&&v(!0)},onPointerLeave:e=>{e.pointerType===`mouse`&&v(!1)},ref:O,children:[G?N(`div`,{className:`lockerverse-auction-gallery__stage`,onPointerEnter:U,onPointerLeave:H,onPointerMove:U,children:[M(`div`,{className:`lockerverse-auction-gallery__viewport`,onPointerDownCapture:()=>{X(),D(!0)},ref:q,children:M(`div`,{className:`lockerverse-auction-gallery__track`,children:e.map((e,r)=>M(`div`,{"aria-hidden":r!==K,className:`lockerverse-auction-gallery__slide`,children:M(`button`,{"aria-label":`View photo ${r+1} of ${t} at full size`,className:`lockerverse-auction-gallery__photo`,onClick:()=>{c(r)},ref:r===K?o:void 0,tabIndex:r===K?0:-1,type:`button`,children:M(l,{alt:`${t}, ${r+1} of ${G}`,className:`lockerverse-auction-gallery__image`,draggable:!1,fetchPriority:r===0?`high`:`auto`,height:900,loading:r===K?`eager`:`lazy`,maxWidth:1280,sizes:r===K?n:`auto, ${n}`,src:e,width:1200})})},`${e}-${r}`))})}),G>1&&!p&&N(`div`,{className:`lockerverse-auction-gallery__rotation`,children:[M(`div`,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__progress-track`,children:M(`div`,{className:`lockerverse-auction-gallery__progress`,ref:Y,style:{transform:`scaleX(0)`}})}),M(`button`,{"aria-label":C?`Play photo rotation`:`Pause photo rotation`,className:`lockerverse-auction-gallery__play ${V}`,"data-gallery-control":!0,onClick:()=>w(e=>!e),title:C?`Play photo rotation`:`Pause photo rotation`,type:`button`,children:M(C?x:b,{"aria-hidden":`true`,size:13})})]}),G>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__previous ${V}`,"data-gallery-control":!0,onClick:()=>Q(K-1),type:`button`,children:M(g,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__next ${V}`,"data-gallery-control":!0,onClick:()=>Q(K+1),type:`button`,children:M(_,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})})]})]}):M(`div`,{className:`lockerverse-auction-gallery__empty`,children:`No photo available`}),G>1&&M(`section`,{"aria-label":`Choose a photo`,className:`lockerverse-auction-gallery__strip`,ref:u,children:M(`div`,{className:`lockerverse-auction-gallery__thumbnails`,children:e.map((e,t)=>M(`button`,{"aria-label":`Show photo ${t+1} of ${G}`,"aria-pressed":K===t,className:`lockerverse-auction-gallery__thumbnail ${K===t?`is-selected`:``}`,onClick:()=>Q(t),ref:e=>{f.current[t]=e},type:`button`,children:M(l,{alt:``,className:`lockerverse-auction-gallery__thumbnail-image`,height:66,loading:`lazy`,maxWidth:192,sizes:`88px`,src:e,width:88})},`${e}-${t}`))})})]})}function V({images:e,fallbackImage:t,name:n,imageSizes:r}){let i=[...new Set(e.filter(Boolean))];!i.length&&t&&i.push(t);let[a,o]=A(0),[s,c]=A(!1),u=k(null),d=k(null),f=i.length,p=f?(a%f+f)%f:0;return N(j,{children:[M(B,{imageSizes:r,name:n,onExpand:e=>{o(e),c(!0)},onSelect:o,paused:s,photoButtonRef:u,photos:i,selected:p}),f>0&&M(F.Root,{onOpenChange:c,open:s,children:N(F.Portal,{children:[M(F.Backdrop,{className:`lockerverse-auction-gallery__backdrop`}),N(F.Popup,{"aria-describedby":void 0,className:`lockerverse-auction-gallery__viewer`,finalFocus:u,onKeyDown:e=>{f<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),o((p+(e.key===`ArrowRight`?1:-1)+f)%f))},children:[N(F.Title,{className:`lockerverse-auction-gallery__sr-only`,children:[n,` · Photo `,p+1,` of `,f]}),N(`div`,{className:`lockerverse-auction-gallery__full-image`,onTouchCancel:()=>{d.current=null},onTouchEnd:e=>{let t=d.current;d.current=null;let n=e.changedTouches.item(0);if(!(t&&n)||f<2)return;let r=n.clientX-t.x,i=n.clientY-t.y;Math.abs(r)>=45&&Math.abs(r)>Math.abs(i)*1.3&&o((p+(r<0?1:-1)+f)%f)},onTouchMove:e=>{e.touches.length!==1&&(d.current=null)},onTouchStart:e=>{let t=e.touches.item(0);d.current=e.touches.length===1&&t?{x:t.clientX,y:t.clientY}:null},children:[M(l,{alt:`${n}, ${p+1} of ${f}`,height:900,maxWidth:1920,sizes:`100vw`,src:i[p],width:1200}),s&&f>1&&M(l,{alt:``,"aria-hidden":`true`,className:`lockerverse-auction-gallery__preload`,height:900,loading:`eager`,maxWidth:1920,sizes:`100vw`,src:i[(p+1)%f],width:1200})]}),M(F.Close,{"aria-label":`Close photo viewer`,className:`lockerverse-auction-gallery__viewer-close`,children:M(w,{"aria-hidden":`true`,size:22})}),f>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__viewer-previous`,onClick:()=>o((p-1+f)%f),type:`button`,children:M(g,{"aria-hidden":`true`,size:28})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__viewer-next`,onClick:()=>o((p+1)%f),type:`button`,children:M(_,{"aria-hidden":`true`,size:28})})]})]})]})})]})}const H={1:`h1`,2:`h2`};function U(e){return M(e===`Buy Now`?S:e===`Available`||e===`Increment`?C:y,{"aria-hidden":`true`,size:16})}function W(e,t){return e.saleMode===`buy_now`?[[`Buy Now`,n(e.buyNowPriceAmount??0)],[`Available`,e.availableQuantity===null?`Available`:String(e.availableQuantity)]]:t===`finished`?[[`Final bid`,e.maxBidAmount?n(e.maxBidAmount):`No bids`]]:[[`Current bid`,n(e.maxBidAmount??0)],[`Floor`,n(e.minBidAmount??0)],[`Increment`,n(e.bidIncrementAmount??100)]]}function G({auction:r,item:i,itemHeadingLevel:o=2,galleryImageSizes:c}){s(i.startAt??r.startAt,i.endAt??r.endAt);let[l,u]=A(!1),d=D(),f=e(r,i),p={active:`Closes`,draft:`Opens`,finished:`Closed`}[f],m=a(r,f,i),g=i.saleMode===`buy_now`,_=(i.description??``).trim().length>240,y=W(i,f),b=H[o];return N(`section`,{className:`lockerverse-auctions__item-summary`,children:[M(V,{fallbackImage:i.image??r.configuration.image??r.community?.banner??r.community?.thumbnail??null,imageSizes:c,images:i.images,name:i.name}),N(`div`,{className:`lockerverse-auctions__item-copy`,children:[M(b,{children:i.name}),i.description?N(`div`,{className:`lockerverse-auctions__item-description`,children:[M(t,{className:!l&&_?`lockerverse-auctions__description-clamped`:void 0,description:i.description,id:d}),_?N(`button`,{"aria-controls":d,"aria-expanded":l,className:`lockerverse-auctions__description-toggle`,onClick:()=>u(!l),type:`button`,children:[l?`Hide description`:`Read full description`,` `,M(h,{"aria-hidden":`true`,size:16,style:{transform:l?`rotate(180deg)`:void 0}})]}):null]}):null,N(`dl`,{className:`lockerverse-auctions__stat-panel`,children:[y.map(([e,t])=>N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[U(e),e]}),M(`dd`,{children:t})]},e)),N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[M(v,{"aria-hidden":`true`,size:16}),p]}),M(`dd`,{className:`lockerverse-auctions__stat-date`,children:m})]}),!g&&f===`finished`?N(`div`,{className:`lockerverse-auctions__stat-footer`,children:[N(`div`,{children:[M(`dt`,{children:`Floor`}),M(`dd`,{children:n(i.minBidAmount??0)})]}),N(`div`,{children:[M(`dt`,{children:`Bid increment`}),M(`dd`,{children:n(i.bidIncrementAmount??100)})]})]}):null]})]})]})}const K={1:`h2`,2:`h3`},q=/^\d+$/;function J(e,t){let r=Number(e),i=r*(t.buyNowPriceAmount??0);if(!(q.test(e)&&Number.isSafeInteger(i))||r<1)return`Enter a whole-number quantity.`;if(!t.additionalCharge)return`Total: ${n(i)}`;let a=t.additionalCharge.firstUnitAmountCents+t.additionalCharge.additionalUnitAmountCents*(r-1),o=i+a;return Number.isSafeInteger(o)?`Subtotal: ${n(i)} · ${t.additionalCharge.name}: ${n(a)} · Total: ${n(o)}`:`Enter a valid quantity.`}function Y(e,t,n){return String(e?t?t.quantity:1:t?t.amount/100:n)}function X(e,t){return o(e)?`This item is sold out.`:t===`draft`?`This item is not open yet.`:t===`finished`?e.saleMode===`buy_now`?`Purchases are closed for this item.`:`Bidding is closed for this item.`:`This item is not available.`}function Z(e,t,n){return o(t)?`All available quantities have been purchased.`:n===`draft`?`This item opens ${a(e,`draft`,t)}.`:t.saleMode===`buy_now`?`This item is no longer available to purchase.`:`Bidding has closed for this item.`}function Q(e,t,n,r){return{amount:t?0:Number(r)*100,includeServiceFee:n?n.includeServiceFee:e.serviceFeeEnabled&&e.serviceFeeDefaultChecked,quantity:t?Number(r):1}}function $({auction:t,item:i,initialSelection:a,onContinue:c,onError:l,onBack:f,backHref:p,itemHeadingLevel:h=2}){let g=K[h],_=i.saleMode===`buy_now`,v=Math.ceil(P(i)/100),[y,b]=A(Y(_,a,v)),[x,S]=A(null),C=D();s(i.startAt??t.startAt,i.endAt??t.endAt);let w=e(t,i),T=w===`active`&&!o(i)&&i.saleMode!==`hybrid`;function E(e){if(e.preventDefault(),!q.test(y)){S(_?`Enter a whole-number quantity.`:`Enter a whole-dollar bid amount.`);return}let n=Q(t,_,a,y),r=d(t,i,n);if(r){S(r),l(r);return}try{u(t,i,n)}catch{S(`Enter a valid amount or quantity.`);return}c(n)}return T?N(`form`,{className:`lockerverse-auctions__selection`,onSubmit:E,children:[M(ee,{buyNow:_,headingTag:g,item:i,minimum:v}),N(`div`,{className:`lockerverse-auctions__selection-body`,children:[N(`label`,{className:`lockerverse-auctions__field`,htmlFor:C,children:[_?`Quantity`:`Your bid amount`,N(`span`,{className:`lockerverse-auctions__amount-control`,children:[_?null:M(`span`,{"aria-hidden":`true`,children:`$`}),M(`input`,{"aria-describedby":`${C}-help`,"aria-invalid":!!x,autoComplete:`off`,id:C,inputMode:`numeric`,onChange:e=>{b(e.target.value),S(null)},placeholder:_?`1`:String(v),required:!0,value:y})]})]}),x?M(`p`,{role:`alert`,children:x}):null,M(`p`,{id:`${C}-help`,children:_?J(y,i):`Enter a whole-dollar bid of at least ${n(v*100)}. Bid increment: ${n(i.bidIncrementAmount??100)}.`}),M(te,{item:i}),N(`div`,{className:`lockerverse-auctions__selection-footer`,children:[M(`p`,{children:_?`Continuing moves you into secure checkout where your payment is processed immediately.`:`Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.`}),N(`button`,{className:`lockerverse-auctions__button`,disabled:!t.payment,type:`submit`,children:[_?`Continue to Checkout`:`Continue to Payment`,` `,M(m,{"aria-hidden":`true`,size:16})]})]}),t.payment?null:M(`p`,{role:`alert`,children:`Payments are not configured for this auction.`})]})]}):N(`div`,{className:`lockerverse-auctions__selection lockerverse-auctions__read-only`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Item status`}),M(g,{children:X(i,w)}),M(`p`,{children:Z(t,i,w)}),N(r,{className:`lockerverse-auctions__button`,href:p,onBack:f,children:[`Browse auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})}function ee({headingTag:e,item:t,buyNow:r,minimum:i}){return N(`div`,{className:`lockerverse-auctions__selection-header`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Step 1 of 2`}),M(e,{children:r?`Buy this item now.`:`Place your bid.`}),M(`p`,{children:r?`Choose how many you want, then complete the secure checkout.`:`Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.`}),N(`p`,{children:[r?`Price: `:`Minimum qualifying bid: `,M(`strong`,{children:n(r?t.buyNowPriceAmount??0:i*100)})]}),r&&t.availableQuantity!==null?N(`p`,{children:[t.availableQuantity,` available`]}):null,t.collectShippingAddress?M(`p`,{children:`The next step will also collect a delivery address for seller fulfillment.`}):null]})}function te({item:e}){return e.saleMode===`buy_now`||!e.additionalCharge?null:N(`p`,{children:[e.additionalCharge.name,`:`,` `,n(e.additionalCharge.firstUnitAmountCents),` will be added to your winning bid.`]})}function ne(e){let[t,n]=A(null),[r,i]=A(!1),a=!!(e.resumePurchase||e.interactionLocked);return E(()=>{let e=!0;return import(`./auction-payment-view.js`).then(({AuctionPayment:t})=>{e&&n(()=>t)},()=>{e&&i(!0)}),()=>{e=!1}},[]),t?M(t,{...e}):N(`div`,{children:[M(`p`,{role:r?`alert`:`status`,children:r?`Payment details could not load.`:`Loading secure payment details…`}),r&&a&&M(`p`,{children:`Your purchase status is not confirmed. Keep this page open and contact the auction organizer before you try another purchase.`}),a?null:M(`button`,{onClick:e.onBack,type:`button`,children:`Back to item`}),r&&!a&&M(`button`,{onClick:()=>window.location.reload(),type:`button`,children:`Reload page to try again`})]})}function re({buyNow:e}){return N(`div`,{className:`lockerverse-auctions__progress`,children:[N(`span`,{children:[M(e?S:y,{"aria-hidden":`true`,size:16}),e?`Choose quantity`:`Place bid`]}),N(`span`,{children:[M(S,{"aria-hidden":`true`,size:16}),e?`Pay securely`:`Secure card`]}),N(`span`,{children:[M(C,{"aria-hidden":`true`,size:16}),e?`Get confirmation`:`Wait for close`]})]})}function ie(e){let{auction:t,item:n,outcome:r}=e,i;return e.backHref?i={href:e.backHref,label:`View auction items`}:e.onBack&&(i={label:`View auction items`,onClick:e.onBack}),M(f,{auctionName:t.name,className:e.className,closesAtLabel:a(t,`active`,n),communityName:e.communityName??t.community?.name,focusHeading:!0,imageUrl:n.image??n.images[0]??t.configuration.image??void 0,itemName:n.name,outcome:r,primaryAction:e.returnToItemHref?{href:e.returnToItemHref,label:`Return to item`}:i,secondaryAction:e.returnToItemHref?i:void 0,style:{"--lockerverse-accent":t.community?.color??`#6f8f6d`,...e.style},theme:e.theme})}function ae(t){let{auction:n,itemId:i,resumePurchase:a,className:o,theme:c=`dark`,style:l}=t,u=k(null),[d,f]=A(n),h=k(n),_=d.items.find(e=>e.id===i)??a?.item;s(_?.startAt??d.startAt,_?.endAt??d.endAt);let[v,y]=A(()=>a?{amount:0,includeServiceFee:a.submission.includeServiceFee??!1,quantity:a.submission.quantity}:null),[b,x]=A(!!a),S=k(!0),C=k(t);C.current=t;let w=k(null),D=T(e=>{S.current&&x(e),w.current!==e&&(w.current=e,p(C.current.onInteractionLockChange,e))},[]),O=!!a;E(()=>(S.current=!0,D(O),()=>{S.current=!1}),[O,D]);let[j,P]=A({email:``,phone:``}),[F,I]=A(!!a),[L,R]=A(null),[z,B]=A(null);E(()=>{!(F||b||a)&&h.current!==n&&(h.current=n,f(n))},[n,F,b,a]);function V(e,t){D(!1),h.current=C.current.auction,f(e),y(null),I(!1),R(t)}function H(e){R(null),y(e),I(!0)}return _?z?M(ie,{...t,auction:d,item:_,outcome:z}):N(`section`,{className:[`lockerverse-auctions`,o].filter(Boolean).join(` `),"data-lockerverse-theme":c,ref:u,style:{"--lockerverse-accent":d.community?.color??`#6f8f6d`,...l},children:[b?null:N(r,{className:`lockerverse-auctions__back`,href:t.backHref,onBack:t.onBack,children:[M(g,{"aria-hidden":`true`,size:16}),` All items`]}),N(`div`,{className:`lockerverse-auctions__detail`,children:[M(G,{auction:d,galleryImageSizes:t.galleryImageSizes,item:_,itemHeadingLevel:t.itemHeadingLevel}),N(`div`,{className:`lockerverse-auctions__transaction`,children:[e(d,_)===`active`?M(re,{buyNow:_.saleMode===`buy_now`}):null,L?M(`p`,{className:`lockerverse-auctions__notice`,role:`alert`,children:L}):null,F&&v?M(ne,{...t,appearanceRoot:u,auction:d,communityName:t.communityName??d.community?.name,contact:j,interactionLocked:b,item:_,onBack:()=>I(!1),onContactChange:P,onIncludeServiceFeeChange:e=>y(t=>t&&{...t,includeServiceFee:d.serviceFeeEnabled&&e}),onInteractionLockChange:D,onResult:B,onReview:V,selection:v}):M($,{auction:d,backHref:t.backHref,initialSelection:v,item:_,itemHeadingLevel:t.itemHeadingLevel,onBack:t.onBack,onContinue:H,onError:R}),b?null:N(r,{className:`lockerverse-auctions__footer-back`,href:t.backHref,onBack:t.onBack,children:[`Back to auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})]})]}):N(`div`,{children:[M(`p`,{role:`alert`,children:`This auction item is no longer available.`}),M(r,{href:t.backHref,onBack:t.onBack,children:`Back to auction items`})]})}function oe(e){let t=k({auctionId:e.auction.id,client:e.client,itemId:e.itemId});if(t.current.client!==e.client||t.current.auctionId!==e.auction.id||t.current.itemId!==e.itemId)throw TypeError(`Auction item identity cannot change. Remount with a new React key.`);if(e.resumePurchase&&(e.resumePurchase.auctionId!==e.auction.id||e.resumePurchase.itemId!==e.itemId||e.resumePurchase.item.id!==e.itemId||e.resumePurchase.item.auctionId!==e.auction.id))throw TypeError(`The purchase recovery record belongs to a different auction item.`);return M(c.Provider,{value:e.auction.mediaBaseUrl,children:M(ae,{...e})})}export{oe as LockerverseAuctionItem};
1
+ import{a as e,c as t,i as n,l as r,n as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{n as c,t as l}from"./auction-image.js";import{a as u,i as d}from"./auction-payment.js";import{t as f}from"./auction-result2.js";import{t as p}from"./host-callback.js";import{ArrowRight as m,ChevronDown as h,ChevronLeft as g,ChevronRight as _,Clock3 as v,Gavel as y,Pause as b,Play as x,ShieldCheck as S,TimerReset as C,X as w}from"lucide-react";import{useCallback as T,useEffect as E,useId as D,useMemo as O,useRef as k,useState as A}from"react";import{Fragment as j,jsx as M,jsxs as N}from"react/jsx-runtime";import{getLockerverseAuctionMinimumBid as P}from"@lockerverse/sdk/auctions";import{Dialog as F}from"@base-ui/react/dialog";import I from"embla-carousel-autoplay";import L from"embla-carousel-react";const R=6e3;function z(e,t){let n=k(R),r=k(null),[i,a]=A(R),o=O(()=>I({delay:i,playOnInit:!1,stopOnFocusIn:!1,stopOnInteraction:!0,stopOnMouseEnter:!1}),[i]),[s,c]=L({duration:t?0:25,loop:!0},[o]),l=T(()=>{r.current&&(r.current.style.transform=`scaleX(${1-n.current/R})`)},[]),u=T(()=>{let e=o.timeUntilNext();e!==null&&(n.current=Math.max(1,Math.min(R,e))),o.stop(),l()},[o,l]),d=T(()=>{n.current=R,a(R),o.reset(),l()},[o,l]);return E(()=>{c&&(e?i===n.current?o.play():a(n.current):u())},[c,e,o,i,a,n,u]),E(()=>{if(!c)return;let t=0,r=()=>{let i=o.timeUntilNext();!e||i===null||(n.current=Math.max(0,Math.min(R,i)),l(),t=requestAnimationFrame(r))},i=()=>{cancelAnimationFrame(t),e&&(t=requestAnimationFrame(r))},a=()=>cancelAnimationFrame(t),s=()=>{e&&o.play()};return c.on(`select`,d).on(`reInit`,s).on(`autoplay:timerset`,i).on(`autoplay:timerstopped`,a),l(),i(),()=>{a(),c.off(`select`,d).off(`reInit`,s).off(`autoplay:timerset`,i).off(`autoplay:timerstopped`,a)}},[c,o,e,n,d,l]),{embla:c,freeze:u,progressRef:r,reset:d,viewportRef:s}}function B({photos:e,name:t,imageSizes:n=`(max-width: 1279px) 100vw, 45vw`,selected:r,paused:a=!1,photoButtonRef:o,onSelect:s,onExpand:c}){let u=k(null),d=k(null),f=k([]),[p,m]=A(!0),[h,v]=A(!1),[y,S]=A(!1),[C,w]=A(!1),[T,D]=A(!1),{ref:O,visible:P}=i(),[F,I]=A(!1),[L,R]=A(!0),B=k(null),V=`lockerverse-auction-gallery__control ${L||F||y?`is-visible`:``}`,H=()=>{B.current&&clearTimeout(B.current),B.current=setTimeout(()=>I(!1),2e3)},U=e=>{if(e.pointerType!==`mouse`){R(!0);return}I(!0),B.current&&clearTimeout(B.current),e.target instanceof Element&&e.target.closest(`[data-gallery-control]`)||H()};E(()=>{let e=window.matchMedia(`(hover: none), (pointer: coarse)`),t=()=>R(e.matches);return t(),e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t),clearTimeout(B.current??void 0)}},[]);let W=!(a||p||h||y||C||T)&&P,G=e.length,K=G?(r%G+G)%G:0,{viewportRef:q,embla:J,progressRef:Y,freeze:X,reset:Z}=z(W&&G>1,p);E(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>m(e.matches);return t(),e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[]),E(()=>{if(!J)return;let e=()=>s(J.selectedScrollSnap());return J.on(`select`,e).on(`reInit`,e),()=>{J.off(`select`,e).off(`reInit`,e)}},[J,s]),E(()=>{J&&J.selectedScrollSnap()!==K&&J.scrollTo(K,!0)},[J,K]),E(()=>{let e=()=>{document.hidden&&X()},t=()=>D(!1);return e(),document.addEventListener(`visibilitychange`,e,!0),window.addEventListener(`pointerup`,t),window.addEventListener(`pointercancel`,t),()=>{document.removeEventListener(`visibilitychange`,e,!0),window.removeEventListener(`pointerup`,t),window.removeEventListener(`pointercancel`,t)}},[X]);let Q=e=>{J?.scrollTo((e+G)%G,p),Z()};return E(()=>{let e=d.current;d.current=null,e&&document.activeElement===e&&O.current?.querySelector(`.lockerverse-auction-gallery__photo[tabindex="0"]`)?.focus({preventScroll:!0})},[K,O]),E(()=>{let e=u.current,t=f.current[K];if(!(e&&t))return;let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();r.left<n.left?e.scrollLeft-=n.left-r.left:r.right>n.right&&(e.scrollLeft+=r.right-n.right)},[K,G]),N(`section`,{"aria-label":`${t} photos`,className:`lockerverse-auction-gallery`,onBlurCapture:e=>{e.currentTarget.contains(e.relatedTarget)||S(!1)},onFocusCapture:e=>S(e.target.matches(`:focus-visible`)),onKeyDown:e=>{G<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),e.target instanceof HTMLButtonElement&&e.target.classList.contains(`lockerverse-auction-gallery__photo`)&&(d.current=e.target),Q(K+(e.key===`ArrowRight`?1:-1)))},onPointerEnter:e=>{e.pointerType===`mouse`&&v(!0)},onPointerLeave:e=>{e.pointerType===`mouse`&&v(!1)},ref:O,children:[G?N(`div`,{className:`lockerverse-auction-gallery__stage`,onPointerEnter:U,onPointerLeave:H,onPointerMove:U,children:[M(`div`,{className:`lockerverse-auction-gallery__viewport`,onPointerDownCapture:()=>{X(),D(!0)},ref:q,children:M(`div`,{className:`lockerverse-auction-gallery__track`,children:e.map((e,r)=>M(`div`,{"aria-hidden":r!==K,className:`lockerverse-auction-gallery__slide`,children:M(`button`,{"aria-label":`View photo ${r+1} of ${t} at full size`,className:`lockerverse-auction-gallery__photo`,onClick:()=>{c(r)},ref:r===K?o:void 0,tabIndex:r===K?0:-1,type:`button`,children:M(l,{alt:`${t}, ${r+1} of ${G}`,className:`lockerverse-auction-gallery__image`,draggable:!1,fetchPriority:r===0?`high`:`auto`,height:900,loading:r===K?`eager`:`lazy`,maxWidth:1920,sizes:r===K?n:`auto, ${n}`,src:e,width:1200})})},`${e}-${r}`))})}),G>1&&!p&&N(`div`,{className:`lockerverse-auction-gallery__rotation`,children:[M(`div`,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__progress-track`,children:M(`div`,{className:`lockerverse-auction-gallery__progress`,ref:Y,style:{transform:`scaleX(0)`}})}),M(`button`,{"aria-label":C?`Play photo rotation`:`Pause photo rotation`,className:`lockerverse-auction-gallery__play ${V}`,"data-gallery-control":!0,onClick:()=>w(e=>!e),title:C?`Play photo rotation`:`Pause photo rotation`,type:`button`,children:M(C?x:b,{"aria-hidden":`true`,size:13})})]}),G>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__previous ${V}`,"data-gallery-control":!0,onClick:()=>Q(K-1),type:`button`,children:M(g,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__next ${V}`,"data-gallery-control":!0,onClick:()=>Q(K+1),type:`button`,children:M(_,{"aria-hidden":`true`,className:`lockerverse-auction-gallery__chevron`})})]})]}):M(`div`,{className:`lockerverse-auction-gallery__empty`,children:`No photo available`}),G>1&&M(`section`,{"aria-label":`Choose a photo`,className:`lockerverse-auction-gallery__strip`,ref:u,children:M(`div`,{className:`lockerverse-auction-gallery__thumbnails`,children:e.map((e,t)=>M(`button`,{"aria-label":`Show photo ${t+1} of ${G}`,"aria-pressed":K===t,className:`lockerverse-auction-gallery__thumbnail ${K===t?`is-selected`:``}`,onClick:()=>Q(t),ref:e=>{f.current[t]=e},type:`button`,children:M(l,{alt:``,className:`lockerverse-auction-gallery__thumbnail-image`,height:66,loading:`lazy`,maxWidth:192,sizes:`88px`,src:e,width:88})},`${e}-${t}`))})})]})}function V({images:e,fallbackImage:t,name:n,imageSizes:r}){let i=[...new Set(e.filter(Boolean))];!i.length&&t&&i.push(t);let[a,o]=A(0),[s,c]=A(!1),u=k(null),d=k(null),f=i.length,p=f?(a%f+f)%f:0;return N(j,{children:[M(B,{imageSizes:r,name:n,onExpand:e=>{o(e),c(!0)},onSelect:o,paused:s,photoButtonRef:u,photos:i,selected:p}),f>0&&M(F.Root,{onOpenChange:c,open:s,children:N(F.Portal,{children:[M(F.Backdrop,{className:`lockerverse-auction-gallery__backdrop`}),N(F.Popup,{"aria-describedby":void 0,className:`lockerverse-auction-gallery__viewer`,finalFocus:u,onKeyDown:e=>{f<2||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey||(e.key===`ArrowLeft`||e.key===`ArrowRight`)&&(e.preventDefault(),o((p+(e.key===`ArrowRight`?1:-1)+f)%f))},children:[N(F.Title,{className:`lockerverse-auction-gallery__sr-only`,children:[n,` · Photo `,p+1,` of `,f]}),N(`div`,{className:`lockerverse-auction-gallery__full-image`,onTouchCancel:()=>{d.current=null},onTouchEnd:e=>{let t=d.current;d.current=null;let n=e.changedTouches.item(0);if(!(t&&n)||f<2)return;let r=n.clientX-t.x,i=n.clientY-t.y;Math.abs(r)>=45&&Math.abs(r)>Math.abs(i)*1.3&&o((p+(r<0?1:-1)+f)%f)},onTouchMove:e=>{e.touches.length!==1&&(d.current=null)},onTouchStart:e=>{let t=e.touches.item(0);d.current=e.touches.length===1&&t?{x:t.clientX,y:t.clientY}:null},children:[M(l,{alt:`${n}, ${p+1} of ${f}`,height:900,maxWidth:1920,sizes:`100vw`,src:i[p],width:1200}),s&&f>1&&M(l,{alt:``,"aria-hidden":`true`,className:`lockerverse-auction-gallery__preload`,height:900,loading:`eager`,maxWidth:1920,sizes:`100vw`,src:i[(p+1)%f],width:1200})]}),M(F.Close,{"aria-label":`Close photo viewer`,className:`lockerverse-auction-gallery__viewer-close`,children:M(w,{"aria-hidden":`true`,size:22})}),f>1&&N(j,{children:[M(`button`,{"aria-label":`Previous photo`,className:`lockerverse-auction-gallery__viewer-previous`,onClick:()=>o((p-1+f)%f),type:`button`,children:M(g,{"aria-hidden":`true`,size:28})}),M(`button`,{"aria-label":`Next photo`,className:`lockerverse-auction-gallery__viewer-next`,onClick:()=>o((p+1)%f),type:`button`,children:M(_,{"aria-hidden":`true`,size:28})})]})]})]})})]})}const H={1:`h1`,2:`h2`};function U(e){return M(e===`Buy Now`?S:e===`Available`||e===`Increment`?C:y,{"aria-hidden":`true`,size:16})}function W(e,t){return e.saleMode===`buy_now`?[[`Buy Now`,n(e.buyNowPriceAmount??0)],[`Available`,e.availableQuantity===null?`Available`:String(e.availableQuantity)]]:t===`finished`?[[`Final bid`,e.maxBidAmount?n(e.maxBidAmount):`No bids`]]:[[`Current bid`,n(e.maxBidAmount??0)],[`Floor`,n(e.minBidAmount??0)],[`Increment`,n(e.bidIncrementAmount??100)]]}function G({auction:r,item:i,itemHeadingLevel:o=2,galleryImageSizes:c}){s(i.startAt??r.startAt,i.endAt??r.endAt);let[l,u]=A(!1),d=D(),f=e(r,i),p={active:`Closes`,draft:`Opens`,finished:`Closed`}[f],m=a(r,f,i),g=i.saleMode===`buy_now`,_=(i.description??``).trim().length>240,y=W(i,f),b=H[o];return N(`section`,{className:`lockerverse-auctions__item-summary`,children:[M(V,{fallbackImage:i.image??r.configuration.image??r.community?.banner??r.community?.thumbnail??null,imageSizes:c,images:i.images,name:i.name}),N(`div`,{className:`lockerverse-auctions__item-copy`,children:[M(b,{children:i.name}),i.description?N(`div`,{className:`lockerverse-auctions__item-description`,children:[M(t,{className:!l&&_?`lockerverse-auctions__description-clamped`:void 0,description:i.description,id:d}),_?N(`button`,{"aria-controls":d,"aria-expanded":l,className:`lockerverse-auctions__description-toggle`,onClick:()=>u(!l),type:`button`,children:[l?`Hide description`:`Read full description`,` `,M(h,{"aria-hidden":`true`,size:16,style:{transform:l?`rotate(180deg)`:void 0}})]}):null]}):null,N(`dl`,{className:`lockerverse-auctions__stat-panel`,children:[y.map(([e,t])=>N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[U(e),e]}),M(`dd`,{children:t})]},e)),N(`div`,{className:`lockerverse-auctions__stat-row`,children:[N(`dt`,{children:[M(v,{"aria-hidden":`true`,size:16}),p]}),M(`dd`,{className:`lockerverse-auctions__stat-date`,children:m})]}),!g&&f===`finished`?N(`div`,{className:`lockerverse-auctions__stat-footer`,children:[N(`div`,{children:[M(`dt`,{children:`Floor`}),M(`dd`,{children:n(i.minBidAmount??0)})]}),N(`div`,{children:[M(`dt`,{children:`Bid increment`}),M(`dd`,{children:n(i.bidIncrementAmount??100)})]})]}):null]})]})]})}const K={1:`h2`,2:`h3`},q=/^\d+$/;function J(e,t){let r=Number(e),i=r*(t.buyNowPriceAmount??0);if(!(q.test(e)&&Number.isSafeInteger(i))||r<1)return`Enter a whole-number quantity.`;if(!t.additionalCharge)return`Total: ${n(i)}`;let a=t.additionalCharge.firstUnitAmountCents+t.additionalCharge.additionalUnitAmountCents*(r-1),o=i+a;return Number.isSafeInteger(o)?`Subtotal: ${n(i)} · ${t.additionalCharge.name}: ${n(a)} · Total: ${n(o)}`:`Enter a valid quantity.`}function Y(e,t,n){return String(e?t?t.quantity:1:t?t.amount/100:n)}function X(e,t){return o(e)?`This item is sold out.`:t===`draft`?`This item is not open yet.`:t===`finished`?e.saleMode===`buy_now`?`Purchases are closed for this item.`:`Bidding is closed for this item.`:`This item is not available.`}function Z(e,t,n){return o(t)?`All available quantities have been purchased.`:n===`draft`?`This item opens ${a(e,`draft`,t)}.`:t.saleMode===`buy_now`?`This item is no longer available to purchase.`:`Bidding has closed for this item.`}function Q(e,t,n,r){return{amount:t?0:Number(r)*100,includeServiceFee:n?n.includeServiceFee:e.serviceFeeEnabled&&e.serviceFeeDefaultChecked,quantity:t?Number(r):1}}function $({auction:t,item:i,initialSelection:a,onContinue:c,onError:l,onBack:f,backHref:p,itemHeadingLevel:h=2}){let g=K[h],_=i.saleMode===`buy_now`,v=Math.ceil(P(i)/100),[y,b]=A(Y(_,a,v)),[x,S]=A(null),C=D();s(i.startAt??t.startAt,i.endAt??t.endAt);let w=e(t,i),T=w===`active`&&!o(i)&&i.saleMode!==`hybrid`;function E(e){if(e.preventDefault(),!q.test(y)){S(_?`Enter a whole-number quantity.`:`Enter a whole-dollar bid amount.`);return}let n=Q(t,_,a,y),r=d(t,i,n);if(r){S(r),l(r);return}try{u(t,i,n)}catch{S(`Enter a valid amount or quantity.`);return}c(n)}return T?N(`form`,{className:`lockerverse-auctions__selection`,onSubmit:E,children:[M(ee,{buyNow:_,headingTag:g,item:i,minimum:v}),N(`div`,{className:`lockerverse-auctions__selection-body`,children:[N(`label`,{className:`lockerverse-auctions__field`,htmlFor:C,children:[_?`Quantity`:`Your bid amount`,N(`span`,{className:`lockerverse-auctions__amount-control`,children:[_?null:M(`span`,{"aria-hidden":`true`,children:`$`}),M(`input`,{"aria-describedby":`${C}-help`,"aria-invalid":!!x,autoComplete:`off`,id:C,inputMode:`numeric`,onChange:e=>{b(e.target.value),S(null)},placeholder:_?`1`:String(v),required:!0,value:y})]})]}),x?M(`p`,{role:`alert`,children:x}):null,M(`p`,{id:`${C}-help`,children:_?J(y,i):`Enter a whole-dollar bid of at least ${n(v*100)}. Bid increment: ${n(i.bidIncrementAmount??100)}.`}),M(te,{item:i}),N(`div`,{className:`lockerverse-auctions__selection-footer`,children:[M(`p`,{children:_?`Continuing moves you into secure checkout where your payment is processed immediately.`:`Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.`}),N(`button`,{className:`lockerverse-auctions__button`,disabled:!t.payment,type:`submit`,children:[_?`Continue to Checkout`:`Continue to Payment`,` `,M(m,{"aria-hidden":`true`,size:16})]})]}),t.payment?null:M(`p`,{role:`alert`,children:`Payments are not configured for this auction.`})]})]}):N(`div`,{className:`lockerverse-auctions__selection lockerverse-auctions__read-only`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Item status`}),M(g,{children:X(i,w)}),M(`p`,{children:Z(t,i,w)}),N(r,{className:`lockerverse-auctions__button`,href:p,onBack:f,children:[`Browse auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})}function ee({headingTag:e,item:t,buyNow:r,minimum:i}){return N(`div`,{className:`lockerverse-auctions__selection-header`,children:[M(`p`,{className:`lockerverse-auctions__eyebrow`,children:`Step 1 of 2`}),M(e,{children:r?`Buy this item now.`:`Place your bid.`}),M(`p`,{children:r?`Choose how many you want, then complete the secure checkout.`:`Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.`}),N(`p`,{children:[r?`Price: `:`Minimum qualifying bid: `,M(`strong`,{children:n(r?t.buyNowPriceAmount??0:i*100)})]}),r&&t.availableQuantity!==null?N(`p`,{children:[t.availableQuantity,` available`]}):null,t.collectShippingAddress?M(`p`,{children:`The next step will also collect a delivery address for seller fulfillment.`}):null]})}function te({item:e}){return e.saleMode===`buy_now`||!e.additionalCharge?null:N(`p`,{children:[e.additionalCharge.name,`:`,` `,n(e.additionalCharge.firstUnitAmountCents),` will be added to your winning bid.`]})}function ne(e){let[t,n]=A(null),[r,i]=A(!1),a=!!(e.resumePurchase||e.interactionLocked);return E(()=>{let e=!0;return import(`./auction-payment-view.js`).then(({AuctionPayment:t})=>{e&&n(()=>t)},()=>{e&&i(!0)}),()=>{e=!1}},[]),t?M(t,{...e}):N(`div`,{children:[M(`p`,{role:r?`alert`:`status`,children:r?`Payment details could not load.`:`Loading secure payment details…`}),r&&a&&M(`p`,{children:`Your purchase status is not confirmed. Keep this page open and contact the auction organizer before you try another purchase.`}),a?null:M(`button`,{onClick:e.onBack,type:`button`,children:`Back to item`}),r&&!a&&M(`button`,{onClick:()=>window.location.reload(),type:`button`,children:`Reload page to try again`})]})}function re({buyNow:e}){return N(`div`,{className:`lockerverse-auctions__progress`,children:[N(`span`,{children:[M(e?S:y,{"aria-hidden":`true`,size:16}),e?`Choose quantity`:`Place bid`]}),N(`span`,{children:[M(S,{"aria-hidden":`true`,size:16}),e?`Pay securely`:`Secure card`]}),N(`span`,{children:[M(C,{"aria-hidden":`true`,size:16}),e?`Get confirmation`:`Wait for close`]})]})}function ie(e){let{auction:t,item:n,outcome:r}=e,i;return e.backHref?i={href:e.backHref,label:`View auction items`}:e.onBack&&(i={label:`View auction items`,onClick:e.onBack}),M(f,{auctionName:t.name,className:e.className,closesAtLabel:a(t,`active`,n),communityName:e.communityName??t.community?.name,focusHeading:!0,imageUrl:n.image??n.images[0]??t.configuration.image??void 0,itemName:n.name,outcome:r,primaryAction:e.returnToItemHref?{href:e.returnToItemHref,label:`Return to item`}:i,secondaryAction:e.returnToItemHref?i:void 0,style:{"--lockerverse-accent":t.community?.color??`#6f8f6d`,...e.style},theme:e.theme})}function ae(t){let{auction:n,itemId:i,resumePurchase:a,className:o,theme:c=`dark`,style:l}=t,u=k(null),[d,f]=A(n),h=k(n),_=d.items.find(e=>e.id===i)??a?.item;s(_?.startAt??d.startAt,_?.endAt??d.endAt);let[v,y]=A(()=>a?{amount:0,includeServiceFee:a.submission.includeServiceFee??!1,quantity:a.submission.quantity}:null),[b,x]=A(!!a),S=k(!0),C=k(t);C.current=t;let w=k(null),D=T(e=>{S.current&&x(e),w.current!==e&&(w.current=e,p(C.current.onInteractionLockChange,e))},[]),O=!!a;E(()=>(S.current=!0,D(O),()=>{S.current=!1}),[O,D]);let[j,P]=A({email:``,phone:``}),[F,I]=A(!!a),[L,R]=A(null),[z,B]=A(null);E(()=>{!(F||b||a)&&h.current!==n&&(h.current=n,f(n))},[n,F,b,a]);function V(e,t){D(!1),h.current=C.current.auction,f(e),y(null),I(!1),R(t)}function H(e){R(null),y(e),I(!0)}return _?z?M(ie,{...t,auction:d,item:_,outcome:z}):N(`section`,{className:[`lockerverse-auctions`,o].filter(Boolean).join(` `),"data-lockerverse-theme":c,ref:u,style:{"--lockerverse-accent":d.community?.color??`#6f8f6d`,...l},children:[b?null:N(r,{className:`lockerverse-auctions__back`,href:t.backHref,onBack:t.onBack,children:[M(g,{"aria-hidden":`true`,size:16}),` All items`]}),N(`div`,{className:`lockerverse-auctions__detail`,children:[M(G,{auction:d,galleryImageSizes:t.galleryImageSizes,item:_,itemHeadingLevel:t.itemHeadingLevel}),N(`div`,{className:`lockerverse-auctions__transaction`,children:[e(d,_)===`active`?M(re,{buyNow:_.saleMode===`buy_now`}):null,L?M(`p`,{className:`lockerverse-auctions__notice`,role:`alert`,children:L}):null,F&&v?M(ne,{...t,appearanceRoot:u,auction:d,communityName:t.communityName??d.community?.name,contact:j,interactionLocked:b,item:_,onBack:()=>I(!1),onContactChange:P,onIncludeServiceFeeChange:e=>y(t=>t&&{...t,includeServiceFee:d.serviceFeeEnabled&&e}),onInteractionLockChange:D,onResult:B,onReview:V,selection:v}):M($,{auction:d,backHref:t.backHref,initialSelection:v,item:_,itemHeadingLevel:t.itemHeadingLevel,onBack:t.onBack,onContinue:H,onError:R}),b?null:N(r,{className:`lockerverse-auctions__footer-back`,href:t.backHref,onBack:t.onBack,children:[`Back to auction items `,M(m,{"aria-hidden":`true`,size:16})]})]})]})]}):N(`div`,{children:[M(`p`,{role:`alert`,children:`This auction item is no longer available.`}),M(r,{href:t.backHref,onBack:t.onBack,children:`Back to auction items`})]})}function oe(e){let t=k({auctionId:e.auction.id,client:e.client,itemId:e.itemId});if(t.current.client!==e.client||t.current.auctionId!==e.auction.id||t.current.itemId!==e.itemId)throw TypeError(`Auction item identity cannot change. Remount with a new React key.`);if(e.resumePurchase&&(e.resumePurchase.auctionId!==e.auction.id||e.resumePurchase.itemId!==e.itemId||e.resumePurchase.item.id!==e.itemId||e.resumePurchase.item.auctionId!==e.auction.id))throw TypeError(`The purchase recovery record belongs to a different auction item.`);return M(c.Provider,{value:e.auction.mediaBaseUrl,children:M(ae,{...e})})}export{oe as LockerverseAuctionItem};
2
2
  //# sourceMappingURL=auction-item.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-item.js","names":["Close","formatMoney","formatMoney"],"sources":["../src/use-auction-autoplay.ts","../src/auction-photo-filmstrip.tsx","../src/auction-gallery.tsx","../src/auction-item-details.tsx","../src/auction-item-selection.tsx","../src/auction-payment-loader.tsx","../src/lockerverse-auction-item.tsx"],"sourcesContent":["import Autoplay from \"embla-carousel-autoplay\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst PHOTO_DELAY = 6000;\n\n// Embla 8 has stop(), but no pause(). Resume with the saved delay, then restore\n// the full delay on selection. Embla remains the only owner of the slide timer.\nexport function useAuctionAutoplay(enabled: boolean, reducedMotion: boolean) {\n const remaining = useRef(PHOTO_DELAY);\n const progressRef = useRef<HTMLDivElement>(null);\n const [cycleDelay, setCycleDelay] = useState(PHOTO_DELAY);\n const autoplay = useMemo(\n () =>\n Autoplay({\n delay: cycleDelay,\n playOnInit: false,\n stopOnFocusIn: false,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n }),\n [cycleDelay]\n );\n\n const [viewportRef, embla] = useEmblaCarousel(\n { duration: reducedMotion ? 0 : 25, loop: true },\n [autoplay]\n );\n\n const draw = useCallback(() => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref in the filmstrip component.\n if (progressRef.current) {\n progressRef.current.style.transform = `scaleX(${1 - remaining.current / PHOTO_DELAY})`;\n }\n }, []);\n\n const freeze = useCallback(() => {\n const left = autoplay.timeUntilNext();\n if (left !== null) {\n remaining.current = Math.max(1, Math.min(PHOTO_DELAY, left));\n }\n autoplay.stop();\n draw();\n }, [autoplay, draw]);\n\n const reset = useCallback(() => {\n remaining.current = PHOTO_DELAY;\n setCycleDelay(PHOTO_DELAY);\n autoplay.reset();\n draw();\n }, [autoplay, draw]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n if (!enabled) {\n freeze();\n } else if (cycleDelay === remaining.current) {\n autoplay.play();\n } else {\n setCycleDelay(remaining.current);\n }\n }, [embla, enabled, autoplay, cycleDelay, setCycleDelay, remaining, freeze]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n let frame = 0;\n const update = () => {\n const left = autoplay.timeUntilNext();\n if (!enabled || left === null) {\n return;\n }\n remaining.current = Math.max(0, Math.min(PHOTO_DELAY, left));\n draw();\n frame = requestAnimationFrame(update);\n };\n const start = () => {\n cancelAnimationFrame(frame);\n if (enabled) {\n frame = requestAnimationFrame(update);\n }\n };\n const stop = () => cancelAnimationFrame(frame);\n const reinitialize = () => {\n if (enabled) {\n autoplay.play();\n }\n };\n embla\n .on(\"select\", reset)\n .on(\"reInit\", reinitialize)\n .on(\"autoplay:timerset\", start)\n .on(\"autoplay:timerstopped\", stop);\n draw();\n start();\n return () => {\n stop();\n embla\n .off(\"select\", reset)\n .off(\"reInit\", reinitialize)\n .off(\"autoplay:timerset\", start)\n .off(\"autoplay:timerstopped\", stop);\n };\n }, [embla, autoplay, enabled, remaining, reset, draw]);\n return { embla, freeze, progressRef, reset, viewportRef };\n}\n","import { ChevronLeft, ChevronRight, Pause, Play } from \"lucide-react\";\nimport {\n type PointerEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionAutoplay } from \"./use-auction-autoplay\";\nimport { useAuctionVisibility } from \"./use-auction-visibility\";\n\ntype FilmstripProps = {\n photos: string[];\n name: string;\n imageSizes?: string | undefined;\n selected: number;\n paused?: boolean;\n photoButtonRef: Ref<HTMLButtonElement>;\n onSelect: (index: number) => void;\n onExpand: (index: number) => void;\n};\n\nexport function AuctionPhotoFilmstrip({\n photos,\n name,\n imageSizes = \"(max-width: 1279px) 100vw, 45vw\",\n selected,\n paused = false,\n photoButtonRef,\n onSelect,\n onExpand,\n}: FilmstripProps) {\n const stripRef = useRef<HTMLDivElement>(null);\n const keyboardPhoto = useRef<HTMLButtonElement | null>(null);\n const thumbnailRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [reducedMotion, setReducedMotion] = useState(true);\n const [hovered, setHovered] = useState(false);\n const [keyboardFocused, setKeyboardFocused] = useState(false);\n const [userPaused, setUserPaused] = useState(false);\n const [dragging, setDragging] = useState(false);\n const { ref: galleryRef, visible } = useAuctionVisibility<HTMLElement>();\n const [controlsActive, setControlsActive] = useState(false);\n const [touchControls, setTouchControls] = useState(true);\n const hideControlsTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const controlsVisible = touchControls || controlsActive || keyboardFocused;\n const controlsFade = `lockerverse-auction-gallery__control ${controlsVisible ? \"is-visible\" : \"\"}`;\n\n const scheduleControlsHide = () => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n hideControlsTimer.current = setTimeout(\n () => setControlsActive(false),\n 2000\n );\n };\n const showControls = (event: PointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== \"mouse\") {\n setTouchControls(true);\n return;\n }\n setControlsActive(true);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n if (\n !(\n event.target instanceof Element &&\n event.target.closest(\"[data-gallery-control]\")\n )\n ) {\n scheduleControlsHide();\n }\n };\n\n useEffect(() => {\n const preference = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const update = () => setTouchControls(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => {\n preference.removeEventListener(\"change\", update);\n clearTimeout(hideControlsTimer.current ?? undefined);\n };\n }, []);\n\n const autoplayEnabled =\n !(\n paused ||\n reducedMotion ||\n hovered ||\n keyboardFocused ||\n userPaused ||\n dragging\n ) && visible;\n const count = photos.length;\n const current = count ? ((selected % count) + count) % count : 0;\n const { viewportRef, embla, progressRef, freeze, reset } = useAuctionAutoplay(\n autoplayEnabled && count > 1,\n reducedMotion\n );\n\n useEffect(() => {\n const preference = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => preference.removeEventListener(\"change\", update);\n }, []);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n const select = () => onSelect(embla.selectedScrollSnap());\n embla.on(\"select\", select).on(\"reInit\", select);\n return () => {\n embla.off(\"select\", select).off(\"reInit\", select);\n };\n }, [embla, onSelect]);\n\n useEffect(() => {\n if (embla && embla.selectedScrollSnap() !== current) {\n embla.scrollTo(current, true);\n }\n }, [embla, current]);\n\n useEffect(() => {\n const updateVisibility = () => {\n if (document.hidden) {\n freeze();\n }\n };\n const release = () => setDragging(false);\n updateVisibility();\n document.addEventListener(\"visibilitychange\", updateVisibility, true);\n window.addEventListener(\"pointerup\", release);\n window.addEventListener(\"pointercancel\", release);\n return () => {\n document.removeEventListener(\"visibilitychange\", updateVisibility, true);\n window.removeEventListener(\"pointerup\", release);\n window.removeEventListener(\"pointercancel\", release);\n };\n }, [freeze]);\n\n const selectPhoto = (next: number) => {\n embla?.scrollTo((next + count) % count, reducedMotion);\n reset();\n };\n\n useEffect(() => {\n const previousPhoto = keyboardPhoto.current;\n keyboardPhoto.current = null;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Keyboard events assign this ref before the selected photo changes.\n if (previousPhoto && document.activeElement === previousPhoto) {\n galleryRef.current\n ?.querySelector<HTMLButtonElement>(\n '.lockerverse-auction-gallery__photo[tabindex=\"0\"]'\n )\n ?.focus({ preventScroll: true });\n }\n }, [current, galleryRef]);\n\n useEffect(() => {\n const strip = stripRef.current;\n const thumbnail = thumbnailRefs.current[current];\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns the element ref after mounting.\n if (!(strip && thumbnail)) {\n return;\n }\n const stripBounds = strip.getBoundingClientRect();\n const photoBounds = thumbnail.getBoundingClientRect();\n if (photoBounds.left < stripBounds.left) {\n strip.scrollLeft -= stripBounds.left - photoBounds.left;\n } else if (photoBounds.right > stripBounds.right) {\n strip.scrollLeft += photoBounds.right - stripBounds.right;\n }\n }, [current, count]);\n\n return (\n // biome-ignore lint/a11y/noNoninteractiveElementInteractions: The gallery handles keys from its focusable photo and navigation buttons.\n <section\n aria-label={`${name} photos`}\n className=\"lockerverse-auction-gallery\"\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setKeyboardFocused(false);\n }\n }}\n onFocusCapture={(event) =>\n setKeyboardFocused(event.target.matches(\":focus-visible\"))\n }\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (\n event.target instanceof HTMLButtonElement &&\n event.target.classList.contains(\n \"lockerverse-auction-gallery__photo\"\n )\n ) {\n keyboardPhoto.current = event.target;\n }\n selectPhoto(current + (event.key === \"ArrowRight\" ? 1 : -1));\n }\n }}\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(true);\n }\n }}\n onPointerLeave={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(false);\n }\n }}\n ref={galleryRef}\n >\n {count ? (\n <div\n className=\"lockerverse-auction-gallery__stage\"\n onPointerEnter={showControls}\n onPointerLeave={scheduleControlsHide}\n onPointerMove={showControls}\n >\n <div\n className=\"lockerverse-auction-gallery__viewport\"\n onPointerDownCapture={() => {\n freeze();\n setDragging(true);\n }}\n ref={viewportRef}\n >\n <div className=\"lockerverse-auction-gallery__track\">\n {photos.map((photo, photoIndex) => (\n <div\n aria-hidden={photoIndex !== current}\n className=\"lockerverse-auction-gallery__slide\"\n key={`${photo}-${photoIndex}`}\n >\n <button\n aria-label={`View photo ${photoIndex + 1} of ${name} at full size`}\n className=\"lockerverse-auction-gallery__photo\"\n onClick={() => {\n onExpand(photoIndex);\n }}\n ref={photoIndex === current ? photoButtonRef : undefined}\n tabIndex={photoIndex === current ? 0 : -1}\n type=\"button\"\n >\n <AuctionImage\n alt={`${name}, ${photoIndex + 1} of ${count}`}\n className=\"lockerverse-auction-gallery__image\"\n draggable={false}\n fetchPriority={photoIndex === 0 ? \"high\" : \"auto\"}\n height={900}\n loading={photoIndex === current ? \"eager\" : \"lazy\"}\n maxWidth={1280}\n sizes={\n photoIndex === current\n ? imageSizes\n : `auto, ${imageSizes}`\n }\n src={photo}\n width={1200}\n />\n </button>\n </div>\n ))}\n </div>\n </div>\n {count > 1 && !reducedMotion && (\n <div className=\"lockerverse-auction-gallery__rotation\">\n <div\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__progress-track\"\n >\n <div\n className=\"lockerverse-auction-gallery__progress\"\n ref={progressRef}\n style={{ transform: \"scaleX(0)\" }}\n />\n </div>\n <button\n aria-label={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n className={`lockerverse-auction-gallery__play ${controlsFade}`}\n data-gallery-control\n onClick={() => setUserPaused((value) => !value)}\n title={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n type=\"button\"\n >\n {userPaused ? (\n <Play aria-hidden=\"true\" size={13} />\n ) : (\n <Pause aria-hidden=\"true\" size={13} />\n )}\n </button>\n </div>\n )}\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className={`lockerverse-auction-gallery__previous ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current - 1)}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n <button\n aria-label=\"Next photo\"\n className={`lockerverse-auction-gallery__next ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current + 1)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"lockerverse-auction-gallery__empty\">\n No photo available\n </div>\n )}\n {count > 1 && (\n <section\n aria-label=\"Choose a photo\"\n className=\"lockerverse-auction-gallery__strip\"\n ref={stripRef}\n >\n <div className=\"lockerverse-auction-gallery__thumbnails\">\n {photos.map((photo, photoIndex) => (\n <button\n aria-label={`Show photo ${photoIndex + 1} of ${count}`}\n aria-pressed={current === photoIndex}\n className={`lockerverse-auction-gallery__thumbnail ${current === photoIndex ? \"is-selected\" : \"\"}`}\n key={`${photo}-${photoIndex}`}\n onClick={() => selectPhoto(photoIndex)}\n ref={(element) => {\n thumbnailRefs.current[photoIndex] = element;\n }}\n type=\"button\"\n >\n <AuctionImage\n alt=\"\"\n className=\"lockerverse-auction-gallery__thumbnail-image\"\n height={66}\n loading=\"lazy\"\n maxWidth={192}\n sizes=\"88px\"\n src={photo}\n width={88}\n />\n </button>\n ))}\n </div>\n </section>\n )}\n </section>\n );\n}\n","import { Dialog } from \"@base-ui/react/dialog\";\nimport { ChevronLeft, ChevronRight, X as Close } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { AuctionPhotoFilmstrip } from \"./auction-photo-filmstrip\";\n\nexport function AuctionGallery({\n images,\n fallbackImage,\n name,\n imageSizes,\n}: {\n images: readonly string[];\n fallbackImage?: string | null;\n name: string;\n imageSizes?: string | undefined;\n}) {\n const photos = [...new Set(images.filter(Boolean))];\n if (!photos.length && fallbackImage) {\n photos.push(fallbackImage);\n }\n const [index, setIndex] = useState(0);\n const [open, setOpen] = useState(false);\n const opener = useRef<HTMLButtonElement | null>(null);\n const swipeStart = useRef<{ x: number; y: number } | null>(null);\n const count = photos.length;\n const selected = count ? ((index % count) + count) % count : 0;\n\n return (\n <>\n <AuctionPhotoFilmstrip\n imageSizes={imageSizes}\n name={name}\n onExpand={(next) => {\n setIndex(next);\n setOpen(true);\n }}\n onSelect={setIndex}\n paused={open}\n photoButtonRef={opener}\n photos={photos}\n selected={selected}\n />\n {count > 0 && (\n <Dialog.Root onOpenChange={setOpen} open={open}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"lockerverse-auction-gallery__backdrop\" />\n <Dialog.Popup\n aria-describedby={undefined}\n className=\"lockerverse-auction-gallery__viewer\"\n finalFocus={opener}\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setIndex(\n (selected + (event.key === \"ArrowRight\" ? 1 : -1) + count) %\n count\n );\n }\n }}\n >\n <Dialog.Title className=\"lockerverse-auction-gallery__sr-only\">\n {name} · Photo {selected + 1} of {count}\n </Dialog.Title>\n <div\n className=\"lockerverse-auction-gallery__full-image\"\n onTouchCancel={() => {\n swipeStart.current = null;\n }}\n onTouchEnd={(event) => {\n const start = swipeStart.current;\n swipeStart.current = null;\n const end = event.changedTouches.item(0);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Touch start assigns the shared ref before this event.\n if (!(start && end) || count < 2) {\n return;\n }\n const dx = end.clientX - start.x;\n const dy = end.clientY - start.y;\n if (Math.abs(dx) >= 45 && Math.abs(dx) > Math.abs(dy) * 1.3) {\n setIndex((selected + (dx < 0 ? 1 : -1) + count) % count);\n }\n }}\n onTouchMove={(event) => {\n if (event.touches.length !== 1) {\n swipeStart.current = null;\n }\n }}\n onTouchStart={(event) => {\n const touch = event.touches.item(0);\n swipeStart.current =\n event.touches.length === 1 && touch\n ? { x: touch.clientX, y: touch.clientY }\n : null;\n }}\n >\n <AuctionImage\n alt={`${name}, ${selected + 1} of ${count}`}\n height={900}\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[selected]}\n width={1200}\n />\n {open && count > 1 && (\n <AuctionImage\n alt=\"\"\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__preload\"\n height={900}\n loading=\"eager\"\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[(selected + 1) % count]}\n width={1200}\n />\n )}\n </div>\n <Dialog.Close\n aria-label=\"Close photo viewer\"\n className=\"lockerverse-auction-gallery__viewer-close\"\n >\n <Close aria-hidden=\"true\" size={22} />\n </Dialog.Close>\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className=\"lockerverse-auction-gallery__viewer-previous\"\n onClick={() => setIndex((selected - 1 + count) % count)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={28} />\n </button>\n <button\n aria-label=\"Next photo\"\n className=\"lockerverse-auction-gallery__viewer-next\"\n onClick={() => setIndex((selected + 1) % count)}\n type=\"button\"\n >\n <ChevronRight aria-hidden=\"true\" size={28} />\n </button>\n </>\n )}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )}\n </>\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ChevronDown,\n Clock3,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useId, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionGallery } from \"./auction-gallery.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst itemHeadingTags = { 1: \"h1\", 2: \"h2\" } as const;\n\nfunction metricIcon(label: string | undefined) {\n if (label === \"Buy Now\") {\n return <ShieldCheck aria-hidden=\"true\" size={16} />;\n }\n if (label === \"Available\" || label === \"Increment\") {\n return <TimerReset aria-hidden=\"true\" size={16} />;\n }\n return <Gavel aria-hidden=\"true\" size={16} />;\n}\nfunction itemMetrics(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (item.saleMode === \"buy_now\") {\n return [\n [\"Buy Now\", formatMoney(item.buyNowPriceAmount ?? 0)],\n [\n \"Available\",\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n ],\n ];\n }\n if (status === \"finished\") {\n return [\n [\n \"Final bid\",\n item.maxBidAmount ? formatMoney(item.maxBidAmount) : \"No bids\",\n ],\n ];\n }\n return [\n [\"Current bid\", formatMoney(item.maxBidAmount ?? 0)],\n [\"Floor\", formatMoney(item.minBidAmount ?? 0)],\n [\"Increment\", formatMoney(item.bidIncrementAmount ?? 100)],\n ];\n}\nexport function AuctionItemDetails({\n auction,\n item,\n itemHeadingLevel = 2,\n galleryImageSizes,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n galleryImageSizes?: string | undefined;\n}) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const [expanded, setExpanded] = useState(false);\n const descriptionId = useId();\n const status = getAuctionDisplayStatus(auction, item);\n const boundaryLabel = {\n active: \"Closes\",\n draft: \"Opens\",\n finished: \"Closed\",\n }[status];\n const boundary = formatAuctionBoundary(auction, status, item);\n const buyNow = item.saleMode === \"buy_now\";\n const longDescription = (item.description ?? \"\").trim().length > 240;\n const metrics = itemMetrics(item, status);\n const ItemHeading = itemHeadingTags[itemHeadingLevel];\n return (\n <section className=\"lockerverse-auctions__item-summary\">\n <AuctionGallery\n fallbackImage={\n item.image ??\n auction.configuration.image ??\n auction.community?.banner ??\n auction.community?.thumbnail ??\n null\n }\n imageSizes={galleryImageSizes}\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__item-copy\">\n <ItemHeading>{item.name}</ItemHeading>\n {item.description ? (\n <div className=\"lockerverse-auctions__item-description\">\n <AuctionDescription\n className={\n !expanded && longDescription\n ? \"lockerverse-auctions__description-clamped\"\n : undefined\n }\n description={item.description}\n id={descriptionId}\n />\n {longDescription ? (\n <button\n aria-controls={descriptionId}\n aria-expanded={expanded}\n className=\"lockerverse-auctions__description-toggle\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Hide description\" : \"Read full description\"}{\" \"}\n <ChevronDown\n aria-hidden=\"true\"\n size={16}\n style={{ transform: expanded ? \"rotate(180deg)\" : undefined }}\n />\n </button>\n ) : null}\n </div>\n ) : null}\n <dl className=\"lockerverse-auctions__stat-panel\">\n {metrics.map(([label, value]) => (\n <div className=\"lockerverse-auctions__stat-row\" key={label}>\n <dt>\n {metricIcon(label)}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n ))}\n <div className=\"lockerverse-auctions__stat-row\">\n <dt>\n <Clock3 aria-hidden=\"true\" size={16} />\n {boundaryLabel}\n </dt>\n <dd className=\"lockerverse-auctions__stat-date\">{boundary}</dd>\n </div>\n {!buyNow && status === \"finished\" ? (\n <div className=\"lockerverse-auctions__stat-footer\">\n <div>\n <dt>Floor</dt>\n <dd>{formatMoney(item.minBidAmount ?? 0)}</dd>\n </div>\n <div>\n <dt>Bid increment</dt>\n <dd>{formatMoney(item.bidIncrementAmount ?? 100)}</dd>\n </div>\n </div>\n ) : null}\n </dl>\n </div>\n </section>\n );\n}\n","import {\n getLockerverseAuctionMinimumBid,\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight } from \"lucide-react\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst selectionHeadingTags = { 1: \"h2\", 2: \"h3\" } as const;\n\nconst WHOLE_NUMBER = /^\\d+$/;\n\ntype SelectionProps = {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n initialSelection: AuctionSelection | null;\n onContinue: (selection: AuctionSelection) => void;\n onError: (message: string) => void;\n onBack?: (() => void) | undefined;\n backHref?: string | undefined;\n};\n\nfunction quantitySummary(value: string, item: LockerverseAuctionItem) {\n const quantity = Number(value);\n const subtotal = quantity * (item.buyNowPriceAmount ?? 0);\n if (\n !(WHOLE_NUMBER.test(value) && Number.isSafeInteger(subtotal)) ||\n quantity < 1\n ) {\n return \"Enter a whole-number quantity.\";\n }\n if (!item.additionalCharge) {\n return `Total: ${formatMoney(subtotal)}`;\n }\n const charge =\n item.additionalCharge.firstUnitAmountCents +\n item.additionalCharge.additionalUnitAmountCents * (quantity - 1);\n const total = subtotal + charge;\n if (!Number.isSafeInteger(total)) {\n return \"Enter a valid quantity.\";\n }\n return `Subtotal: ${formatMoney(subtotal)} · ${item.additionalCharge.name}: ${formatMoney(charge)} · Total: ${formatMoney(total)}`;\n}\nfunction selectionInitialValue(\n buyNow: boolean,\n initial: AuctionSelection | null,\n minimum: number\n) {\n if (buyNow) {\n return String(initial ? initial.quantity : 1);\n }\n return String(initial ? initial.amount / 100 : minimum);\n}\nfunction readOnlyTitle(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"This item is sold out.\";\n }\n if (status === \"draft\") {\n return \"This item is not open yet.\";\n }\n if (status === \"finished\") {\n return item.saleMode === \"buy_now\"\n ? \"Purchases are closed for this item.\"\n : \"Bidding is closed for this item.\";\n }\n return \"This item is not available.\";\n}\nfunction readOnlyDescription(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"All available quantities have been purchased.\";\n }\n if (status === \"draft\") {\n return `This item opens ${formatAuctionBoundary(auction, \"draft\", item)}.`;\n }\n return item.saleMode === \"buy_now\"\n ? \"This item is no longer available to purchase.\"\n : \"Bidding has closed for this item.\";\n}\nfunction selectionFromInput(\n auction: LockerverseAuction,\n buyNow: boolean,\n initialSelection: AuctionSelection | null,\n value: string\n): AuctionSelection {\n return {\n amount: buyNow ? 0 : Number(value) * 100,\n includeServiceFee: initialSelection\n ? initialSelection.includeServiceFee\n : auction.serviceFeeEnabled && auction.serviceFeeDefaultChecked,\n quantity: buyNow ? Number(value) : 1,\n };\n}\nexport function AuctionItemSelection({\n auction,\n item,\n initialSelection,\n onContinue,\n onError,\n onBack,\n backHref,\n itemHeadingLevel = 2,\n}: SelectionProps) {\n const SelectionHeading = selectionHeadingTags[itemHeadingLevel];\n const buyNow = item.saleMode === \"buy_now\";\n const minimum = Math.ceil(getLockerverseAuctionMinimumBid(item) / 100);\n const [value, setValue] = useState(\n selectionInitialValue(buyNow, initialSelection, minimum)\n );\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const open =\n status === \"active\" &&\n !isAuctionItemSoldOut(item) &&\n item.saleMode !== \"hybrid\";\n function continueToPayment(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!WHOLE_NUMBER.test(value)) {\n setError(\n buyNow\n ? \"Enter a whole-number quantity.\"\n : \"Enter a whole-dollar bid amount.\"\n );\n return;\n }\n const selection = selectionFromInput(\n auction,\n buyNow,\n initialSelection,\n value\n );\n const message = getAuctionSelectionError(auction, item, selection);\n if (message) {\n setError(message);\n onError(message);\n return;\n }\n try {\n getAuctionSelectionPricing(auction, item, selection);\n } catch {\n setError(\"Enter a valid amount or quantity.\");\n return;\n }\n onContinue(selection);\n }\n if (!open) {\n return (\n <div className=\"lockerverse-auctions__selection lockerverse-auctions__read-only\">\n <p className=\"lockerverse-auctions__eyebrow\">Item status</p>\n <SelectionHeading>{readOnlyTitle(item, status)}</SelectionHeading>\n <p>{readOnlyDescription(auction, item, status)}</p>\n <AuctionBackAction\n className=\"lockerverse-auctions__button\"\n href={backHref}\n onBack={onBack}\n >\n Browse auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n </div>\n );\n }\n return (\n <form\n className=\"lockerverse-auctions__selection\"\n onSubmit={continueToPayment}\n >\n <SelectionHeader\n buyNow={buyNow}\n headingTag={SelectionHeading}\n item={item}\n minimum={minimum}\n />\n <div className=\"lockerverse-auctions__selection-body\">\n <label className=\"lockerverse-auctions__field\" htmlFor={id}>\n {buyNow ? \"Quantity\" : \"Your bid amount\"}\n <span className=\"lockerverse-auctions__amount-control\">\n {buyNow ? null : <span aria-hidden=\"true\">$</span>}\n <input\n aria-describedby={`${id}-help`}\n aria-invalid={Boolean(error)}\n autoComplete=\"off\"\n id={id}\n inputMode=\"numeric\"\n onChange={(event) => {\n setValue(event.target.value);\n setError(null);\n }}\n placeholder={buyNow ? \"1\" : String(minimum)}\n required\n value={value}\n />\n </span>\n </label>\n {error ? <p role=\"alert\">{error}</p> : null}\n <p id={`${id}-help`}>\n {buyNow\n ? quantitySummary(value, item)\n : `Enter a whole-dollar bid of at least ${formatMoney(minimum * 100)}. Bid increment: ${formatMoney(item.bidIncrementAmount ?? 100)}.`}\n </p>\n <BidAdditionalCharge item={item} />\n <div className=\"lockerverse-auctions__selection-footer\">\n <p>\n {buyNow\n ? \"Continuing moves you into secure checkout where your payment is processed immediately.\"\n : \"Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.\"}\n </p>\n <button\n className=\"lockerverse-auctions__button\"\n disabled={!auction.payment}\n type=\"submit\"\n >\n {buyNow ? \"Continue to Checkout\" : \"Continue to Payment\"}{\" \"}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n {auction.payment ? null : (\n <p role=\"alert\">Payments are not configured for this auction.</p>\n )}\n </div>\n </form>\n );\n}\n\nfunction SelectionHeader({\n headingTag: SelectionHeading,\n item,\n buyNow,\n minimum,\n}: {\n item: LockerverseAuctionItem;\n buyNow: boolean;\n minimum: number;\n headingTag: \"h2\" | \"h3\";\n}) {\n return (\n <div className=\"lockerverse-auctions__selection-header\">\n <p className=\"lockerverse-auctions__eyebrow\">Step 1 of 2</p>\n <SelectionHeading>\n {buyNow ? \"Buy this item now.\" : \"Place your bid.\"}\n </SelectionHeading>\n <p>\n {buyNow\n ? \"Choose how many you want, then complete the secure checkout.\"\n : \"Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.\"}\n </p>\n <p>\n {buyNow ? \"Price: \" : \"Minimum qualifying bid: \"}\n <strong>\n {formatMoney(buyNow ? (item.buyNowPriceAmount ?? 0) : minimum * 100)}\n </strong>\n </p>\n {buyNow && item.availableQuantity !== null ? (\n <p>{item.availableQuantity} available</p>\n ) : null}\n {item.collectShippingAddress ? (\n <p>\n The next step will also collect a delivery address for seller\n fulfillment.\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction BidAdditionalCharge({ item }: { item: LockerverseAuctionItem }) {\n if (item.saleMode === \"buy_now\" || !item.additionalCharge) {\n return null;\n }\n return (\n <p>\n {item.additionalCharge.name}:{\" \"}\n {formatMoney(item.additionalCharge.firstUnitAmountCents)} will be added to\n your winning bid.\n </p>\n );\n}\n","import { type ComponentType, useEffect, useState } from \"react\";\nimport type { AuctionPaymentProps } from \"./auction-payment-view.tsx\";\n\n/** Keep checkout dependencies out of the server-rendered item and catalog. */\nexport function AuctionPaymentLoader(props: AuctionPaymentProps) {\n const [PaymentView, setPaymentView] =\n useState<ComponentType<AuctionPaymentProps> | null>(null);\n const [failed, setFailed] = useState(false);\n const locked = Boolean(props.resumePurchase || props.interactionLocked);\n\n useEffect(() => {\n let active = true;\n import(\"./auction-payment-view.tsx\").then(\n ({ AuctionPayment }) => {\n if (active) {\n setPaymentView(() => AuctionPayment);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, []);\n\n if (PaymentView) {\n return <PaymentView {...props} />;\n }\n return (\n <div>\n <p role={failed ? \"alert\" : \"status\"}>\n {failed\n ? \"Payment details could not load.\"\n : \"Loading secure payment details…\"}\n </p>\n {failed && locked && (\n <p>\n Your purchase status is not confirmed. Keep this page open and contact\n the auction organizer before you try another purchase.\n </p>\n )}\n {locked ? null : (\n <button onClick={props.onBack} type=\"button\">\n Back to item\n </button>\n )}\n {failed && !locked && (\n <button onClick={() => window.location.reload()} type=\"button\">\n Reload page to try again\n </button>\n )}\n </div>\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ArrowRight,\n ChevronLeft,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImageMediaBase } from \"./auction-image.tsx\";\nimport { AuctionItemDetails } from \"./auction-item-details.tsx\";\nimport { AuctionItemSelection } from \"./auction-item-selection.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport type { AuctionSelection } from \"./auction-payment.ts\";\nimport { AuctionPaymentLoader } from \"./auction-payment-loader.tsx\";\nimport {\n type LockerverseAuctionOutcome,\n LockerverseAuctionResult,\n type LockerverseAuctionResultAction,\n} from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nfunction AuctionProgress({ buyNow }: { buyNow: boolean }) {\n return (\n <div className=\"lockerverse-auctions__progress\">\n <span>\n {buyNow ? (\n <ShieldCheck aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )}\n {buyNow ? \"Choose quantity\" : \"Place bid\"}\n </span>\n <span>\n <ShieldCheck aria-hidden=\"true\" size={16} />\n {buyNow ? \"Pay securely\" : \"Secure card\"}\n </span>\n <span>\n <TimerReset aria-hidden=\"true\" size={16} />\n {buyNow ? \"Get confirmation\" : \"Wait for close\"}\n </span>\n </div>\n );\n}\n\nfunction AuctionItemResult(\n props: LockerverseAuctionItemProps & {\n item: AuctionItem;\n outcome: LockerverseAuctionOutcome;\n }\n) {\n const { auction, item, outcome } = props;\n let auctionAction: LockerverseAuctionResultAction | undefined;\n if (props.backHref) {\n auctionAction = { href: props.backHref, label: \"View auction items\" };\n } else if (props.onBack) {\n auctionAction = { label: \"View auction items\", onClick: props.onBack };\n }\n return (\n <LockerverseAuctionResult\n auctionName={auction.name}\n className={props.className}\n closesAtLabel={formatAuctionBoundary(auction, \"active\", item)}\n communityName={props.communityName ?? auction.community?.name}\n focusHeading\n imageUrl={\n item.image ?? item.images[0] ?? auction.configuration.image ?? undefined\n }\n itemName={item.name}\n outcome={outcome}\n primaryAction={\n props.returnToItemHref\n ? { href: props.returnToItemHref, label: \"Return to item\" }\n : auctionAction\n }\n secondaryAction={props.returnToItemHref ? auctionAction : undefined}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...props.style,\n }}\n theme={props.theme}\n />\n );\n}\n\nfunction AuctionItemView(props: LockerverseAuctionItemProps) {\n const {\n auction: initialAuction,\n itemId,\n resumePurchase,\n className,\n theme = \"dark\",\n style,\n } = props;\n const appearanceRoot = useRef<HTMLElement | null>(null);\n const [auction, setAuction] = useState(initialAuction);\n const acceptedHost = useRef(initialAuction);\n const item =\n auction.items.find((candidate) => candidate.id === itemId) ??\n resumePurchase?.item;\n useAuctionBoundary(\n item?.startAt ?? auction.startAt,\n item?.endAt ?? auction.endAt\n );\n const [selection, setSelection] = useState<AuctionSelection | null>(() =>\n resumePurchase\n ? {\n amount: 0,\n includeServiceFee:\n resumePurchase.submission.includeServiceFee ?? false,\n quantity: resumePurchase.submission.quantity,\n }\n : null\n );\n const [interactionLocked, setInteractionLocked] = useState(\n Boolean(resumePurchase)\n );\n const viewMounted = useRef<boolean>(true);\n const hostCallbacks = useRef(props);\n hostCallbacks.current = props;\n const reportedLock = useRef<boolean | null>(null);\n const updateInteractionLock = useCallback((locked: boolean) => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Effect cleanup changes this ref outside the callback.\n if (viewMounted.current) {\n setInteractionLocked(locked);\n }\n if (reportedLock.current !== locked) {\n reportedLock.current = locked;\n notifyHostCallback(hostCallbacks.current.onInteractionLockChange, locked);\n }\n }, []);\n const hasRecovery = Boolean(resumePurchase);\n useEffect(() => {\n viewMounted.current = true;\n updateInteractionLock(hasRecovery);\n return () => {\n viewMounted.current = false;\n };\n }, [hasRecovery, updateInteractionLock]);\n const [contact, setContact] = useState({ email: \"\", phone: \"\" });\n const [paying, setPaying] = useState(Boolean(resumePurchase));\n const [notice, setNotice] = useState<string | null>(null);\n const [outcome, setOutcome] = useState<LockerverseAuctionOutcome | null>(\n null\n );\n\n useEffect(() => {\n if (\n !(paying || interactionLocked || resumePurchase) &&\n acceptedHost.current !== initialAuction\n ) {\n acceptedHost.current = initialAuction;\n setAuction(initialAuction);\n }\n }, [initialAuction, paying, interactionLocked, resumePurchase]);\n\n function review(current: LockerverseAuction, message: string) {\n updateInteractionLock(false);\n // The checkout just fetched this snapshot. Do not restore an older host\n // snapshot that arrived while payment was open; accept its next refresh.\n acceptedHost.current = hostCallbacks.current.auction;\n setAuction(current);\n setSelection(null);\n setPaying(false);\n setNotice(message);\n }\n function continueToPayment(next: AuctionSelection) {\n setNotice(null);\n setSelection(next);\n setPaying(true);\n }\n if (!item) {\n return (\n <div>\n <p role=\"alert\">This auction item is no longer available.</p>\n <AuctionBackAction href={props.backHref} onBack={props.onBack}>\n Back to auction items\n </AuctionBackAction>\n </div>\n );\n }\n if (outcome) {\n return (\n <AuctionItemResult\n {...props}\n auction={auction}\n item={item}\n outcome={outcome}\n />\n );\n }\n return (\n <section\n className={[\"lockerverse-auctions\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n ref={appearanceRoot}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...style,\n }}\n >\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n <ChevronLeft aria-hidden=\"true\" size={16} /> All items\n </AuctionBackAction>\n )}\n <div className=\"lockerverse-auctions__detail\">\n <AuctionItemDetails\n auction={auction}\n galleryImageSizes={props.galleryImageSizes}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n />\n <div className=\"lockerverse-auctions__transaction\">\n {getAuctionDisplayStatus(auction, item) === \"active\" ? (\n <AuctionProgress buyNow={item.saleMode === \"buy_now\"} />\n ) : null}\n {notice ? (\n <p className=\"lockerverse-auctions__notice\" role=\"alert\">\n {notice}\n </p>\n ) : null}\n {paying && selection ? (\n <AuctionPaymentLoader\n {...props}\n appearanceRoot={appearanceRoot}\n auction={auction}\n communityName={props.communityName ?? auction.community?.name}\n contact={contact}\n interactionLocked={interactionLocked}\n item={item}\n onBack={() => setPaying(false)}\n onContactChange={setContact}\n onIncludeServiceFeeChange={(includeServiceFee) =>\n setSelection((current) =>\n current\n ? {\n ...current,\n includeServiceFee:\n auction.serviceFeeEnabled && includeServiceFee,\n }\n : current\n )\n }\n onInteractionLockChange={updateInteractionLock}\n onResult={setOutcome}\n onReview={review}\n selection={selection}\n />\n ) : (\n <AuctionItemSelection\n auction={auction}\n backHref={props.backHref}\n initialSelection={selection}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n onBack={props.onBack}\n onContinue={continueToPayment}\n onError={setNotice}\n />\n )}\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__footer-back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n Back to auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nexport function LockerverseAuctionItem(props: LockerverseAuctionItemProps) {\n const identity = useRef({\n auctionId: props.auction.id,\n client: props.client,\n itemId: props.itemId,\n });\n if (\n identity.current.client !== props.client ||\n identity.current.auctionId !== props.auction.id ||\n identity.current.itemId !== props.itemId\n ) {\n throw new TypeError(\n \"Auction item identity cannot change. Remount with a new React key.\"\n );\n }\n if (\n props.resumePurchase &&\n (props.resumePurchase.auctionId !== props.auction.id ||\n props.resumePurchase.itemId !== props.itemId ||\n props.resumePurchase.item.id !== props.itemId ||\n props.resumePurchase.item.auctionId !== props.auction.id)\n ) {\n throw new TypeError(\n \"The purchase recovery record belongs to a different auction item.\"\n );\n }\n // Keep the view mounted when a refreshed host snapshot removes the item.\n // Its transaction snapshot remains authoritative until it is safe to leave.\n return (\n <AuctionImageMediaBase.Provider value={props.auction.mediaBaseUrl}>\n <AuctionItemView {...props} />\n </AuctionImageMediaBase.Provider>\n );\n}\n"],"mappings":"0yBAIA,MAAM,EAAc,IAIpB,SAAgB,EAAmB,EAAkB,EAAwB,CAC3E,IAAM,EAAY,EAAO,CAAW,EAC9B,EAAc,EAAuB,IAAI,EACzC,CAAC,EAAY,GAAiB,EAAS,CAAW,EAClD,EAAW,MAEb,EAAS,CACP,MAAO,EACP,WAAY,GACZ,cAAe,GACf,kBAAmB,GACnB,iBAAkB,EACpB,CAAC,EACH,CAAC,CAAU,CACb,EAEM,CAAC,EAAa,GAAS,EAC3B,CAAE,SAAU,EAAgB,EAAI,GAAI,KAAM,EAAK,EAC/C,CAAC,CAAQ,CACX,EAEM,EAAO,MAAkB,CAEzB,EAAY,UACd,EAAY,QAAQ,MAAM,UAAY,UAAU,EAAI,EAAU,QAAU,EAAY,GAExF,EAAG,CAAC,CAAC,EAEC,EAAS,MAAkB,CAC/B,IAAM,EAAO,EAAS,cAAc,EAChC,IAAS,OACX,EAAU,QAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAa,CAAI,CAAC,GAE7D,EAAS,KAAK,EACd,EAAK,CACP,EAAG,CAAC,EAAU,CAAI,CAAC,EAEb,EAAQ,MAAkB,CAC9B,EAAU,QAAU,EACpB,EAAc,CAAW,EACzB,EAAS,MAAM,EACf,EAAK,CACP,EAAG,CAAC,EAAU,CAAI,CAAC,EAyDnB,OAvDA,MAAgB,CACT,IAGA,EAEM,IAAe,EAAU,QAClC,EAAS,KAAK,EAEd,EAAc,EAAU,OAAO,EAJ/B,EAAO,EAMX,EAAG,CAAC,EAAO,EAAS,EAAU,EAAY,EAAe,EAAW,CAAM,CAAC,EAE3E,MAAgB,CACd,GAAI,CAAC,EACH,OAEF,IAAI,EAAQ,EACN,MAAe,CACnB,IAAM,EAAO,EAAS,cAAc,EAChC,CAAC,GAAW,IAAS,OAGzB,EAAU,QAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAa,CAAI,CAAC,EAC3D,EAAK,EACL,EAAQ,sBAAsB,CAAM,EACtC,EACM,MAAc,CAClB,qBAAqB,CAAK,EACtB,IACF,EAAQ,sBAAsB,CAAM,EAExC,EACM,MAAa,qBAAqB,CAAK,EACvC,MAAqB,CACrB,GACF,EAAS,KAAK,CAElB,EAQA,OAPA,EACG,GAAG,SAAU,CAAK,CAAC,CACnB,GAAG,SAAU,CAAY,CAAC,CAC1B,GAAG,oBAAqB,CAAK,CAAC,CAC9B,GAAG,wBAAyB,CAAI,EACnC,EAAK,EACL,EAAM,MACO,CACX,EAAK,EACL,EACG,IAAI,SAAU,CAAK,CAAC,CACpB,IAAI,SAAU,CAAY,CAAC,CAC3B,IAAI,oBAAqB,CAAK,CAAC,CAC/B,IAAI,wBAAyB,CAAI,CACtC,CACF,EAAG,CAAC,EAAO,EAAU,EAAS,EAAW,EAAO,CAAI,CAAC,EAC9C,CAAE,QAAO,SAAQ,cAAa,QAAO,aAAY,CAC1D,CCrFA,SAAgB,EAAsB,CACpC,SACA,OACA,aAAa,kCACb,WACA,SAAS,GACT,iBACA,WACA,YACiB,CACjB,IAAM,EAAW,EAAuB,IAAI,EACtC,EAAgB,EAAiC,IAAI,EACrD,EAAgB,EAAqC,CAAC,CAAC,EACvD,CAAC,EAAe,GAAoB,EAAS,EAAI,EACjD,CAAC,EAAS,GAAc,EAAS,EAAK,EACtC,CAAC,EAAiB,GAAsB,EAAS,EAAK,EACtD,CAAC,EAAY,GAAiB,EAAS,EAAK,EAC5C,CAAC,EAAU,GAAe,EAAS,EAAK,EACxC,CAAE,IAAK,EAAY,WAAY,EAAkC,EACjE,CAAC,EAAgB,GAAqB,EAAS,EAAK,EACpD,CAAC,EAAe,GAAoB,EAAS,EAAI,EACjD,EAAoB,EAA6C,IAAI,EAErE,EAAe,wCADG,GAAiB,GAAkB,EACoB,aAAe,KAExF,MAA6B,CAE7B,EAAkB,SACpB,aAAa,EAAkB,OAAO,EAExC,EAAkB,QAAU,eACpB,EAAkB,EAAK,EAC7B,GACF,CACF,EACM,EAAgB,GAAwC,CAC5D,GAAI,EAAM,cAAgB,QAAS,CACjC,EAAiB,EAAI,EACrB,MACF,CACA,EAAkB,EAAI,EAElB,EAAkB,SACpB,aAAa,EAAkB,OAAO,EAIpC,EAAM,kBAAkB,SACxB,EAAM,OAAO,QAAQ,wBAAwB,GAG/C,EAAqB,CAEzB,EAEA,MAAgB,CACd,IAAM,EAAa,OAAO,WAAW,kCAAkC,EACjE,MAAe,EAAiB,EAAW,OAAO,EAGxD,OAFA,EAAO,EACP,EAAW,iBAAiB,SAAU,CAAM,MAC/B,CACX,EAAW,oBAAoB,SAAU,CAAM,EAC/C,aAAa,EAAkB,SAAW,IAAA,EAAS,CACrD,CACF,EAAG,CAAC,CAAC,EAEL,IAAM,EACJ,EACE,GACA,GACA,GACA,GACA,GACA,IACG,EACD,EAAQ,EAAO,OACf,EAAU,GAAU,EAAW,EAAS,GAAS,EAAQ,EACzD,CAAE,cAAa,QAAO,cAAa,SAAQ,SAAU,EACzD,GAAmB,EAAQ,EAC3B,CACF,EAEA,MAAgB,CACd,IAAM,EAAa,OAAO,WAAW,kCAAkC,EACjE,MAAe,EAAiB,EAAW,OAAO,EAGxD,OAFA,EAAO,EACP,EAAW,iBAAiB,SAAU,CAAM,MAC/B,EAAW,oBAAoB,SAAU,CAAM,CAC9D,EAAG,CAAC,CAAC,EAEL,MAAgB,CACd,GAAI,CAAC,EACH,OAEF,IAAM,MAAe,EAAS,EAAM,mBAAmB,CAAC,EAExD,OADA,EAAM,GAAG,SAAU,CAAM,CAAC,CAAC,GAAG,SAAU,CAAM,MACjC,CACX,EAAM,IAAI,SAAU,CAAM,CAAC,CAAC,IAAI,SAAU,CAAM,CAClD,CACF,EAAG,CAAC,EAAO,CAAQ,CAAC,EAEpB,MAAgB,CACV,GAAS,EAAM,mBAAmB,IAAM,GAC1C,EAAM,SAAS,EAAS,EAAI,CAEhC,EAAG,CAAC,EAAO,CAAO,CAAC,EAEnB,MAAgB,CACd,IAAM,MAAyB,CACzB,SAAS,QACX,EAAO,CAEX,EACM,MAAgB,EAAY,EAAK,EAKvC,OAJA,EAAiB,EACjB,SAAS,iBAAiB,mBAAoB,EAAkB,EAAI,EACpE,OAAO,iBAAiB,YAAa,CAAO,EAC5C,OAAO,iBAAiB,gBAAiB,CAAO,MACnC,CACX,SAAS,oBAAoB,mBAAoB,EAAkB,EAAI,EACvE,OAAO,oBAAoB,YAAa,CAAO,EAC/C,OAAO,oBAAoB,gBAAiB,CAAO,CACrD,CACF,EAAG,CAAC,CAAM,CAAC,EAEX,IAAM,EAAe,GAAiB,CACpC,GAAO,UAAU,EAAO,GAAS,EAAO,CAAa,EACrD,EAAM,CACR,EA+BA,OA7BA,MAAgB,CACd,IAAM,EAAgB,EAAc,QACpC,EAAc,QAAU,KAEpB,GAAiB,SAAS,gBAAkB,GAC9C,EAAW,SACP,cACA,mDACF,CAAC,EACC,MAAM,CAAE,cAAe,EAAK,CAAC,CAErC,EAAG,CAAC,EAAS,CAAU,CAAC,EAExB,MAAgB,CACd,IAAM,EAAQ,EAAS,QACjB,EAAY,EAAc,QAAQ,GAExC,GAAI,EAAE,GAAS,GACb,OAEF,IAAM,EAAc,EAAM,sBAAsB,EAC1C,EAAc,EAAU,sBAAsB,EAChD,EAAY,KAAO,EAAY,KACjC,EAAM,YAAc,EAAY,KAAO,EAAY,KAC1C,EAAY,MAAQ,EAAY,QACzC,EAAM,YAAc,EAAY,MAAQ,EAAY,MAExD,EAAG,CAAC,EAAS,CAAK,CAAC,EAIjB,EAAC,UAAD,CACE,aAAY,GAAG,EAAK,SACpB,UAAU,8BACV,cAAgB,GAAU,CACnB,EAAM,cAAc,SAAS,EAAM,aAAa,GACnD,EAAmB,EAAK,CAE5B,EACA,eAAiB,GACf,EAAmB,EAAM,OAAO,QAAQ,gBAAgB,CAAC,EAE3D,UAAY,GAAU,CAElB,EAAQ,GACR,EAAM,QACN,EAAM,SACN,EAAM,SACN,EAAM,WAIJ,EAAM,MAAQ,aAAe,EAAM,MAAQ,gBAC7C,EAAM,eAAe,EAEnB,EAAM,kBAAkB,mBACxB,EAAM,OAAO,UAAU,SACrB,oCACF,IAEA,EAAc,QAAU,EAAM,QAEhC,EAAY,GAAW,EAAM,MAAQ,aAAe,EAAI,GAAG,EAE/D,EACA,eAAiB,GAAU,CACrB,EAAM,cAAgB,SACxB,EAAW,EAAI,CAEnB,EACA,eAAiB,GAAU,CACrB,EAAM,cAAgB,SACxB,EAAW,EAAK,CAEpB,EACA,IAAK,EA5CP,SAAA,CA8CG,EACC,EAAC,MAAD,CACE,UAAU,qCACV,eAAgB,EAChB,eAAgB,EAChB,cAAe,EAJjB,SAAA,CAME,EAAC,MAAD,CACE,UAAU,wCACV,yBAA4B,CAC1B,EAAO,EACP,EAAY,EAAI,CAClB,EACA,IAAK,EAEL,SAAA,EAAC,MAAD,CAAK,UAAU,qCACZ,SAAA,EAAO,KAAK,EAAO,IAClB,EAAC,MAAD,CACE,cAAa,IAAe,EAC5B,UAAU,qCAGV,SAAA,EAAC,SAAD,CACE,aAAY,cAAc,EAAa,EAAE,MAAM,EAAK,eACpD,UAAU,qCACV,YAAe,CACb,EAAS,CAAU,CACrB,EACA,IAAK,IAAe,EAAU,EAAiB,IAAA,GAC/C,SAAU,IAAe,EAAU,EAAI,GACvC,KAAK,SAEL,SAAA,EAAC,EAAD,CACE,IAAK,GAAG,EAAK,IAAI,EAAa,EAAE,MAAM,IACtC,UAAU,qCACV,UAAW,GACX,cAAe,IAAe,EAAI,OAAS,OAC3C,OAAQ,IACR,QAAS,IAAe,EAAU,QAAU,OAC5C,SAAU,KACV,MACE,IAAe,EACX,EACA,SAAS,IAEf,IAAK,EACL,MAAO,IACR,CAAA,CACK,CAAA,CACL,EA7BE,GAAG,EAAM,GAAG,GA6Bd,CACN,CACE,CAAA,CACF,CAAA,EACJ,EAAQ,GAAK,CAAC,GACb,EAAC,MAAD,CAAK,UAAU,wCAAf,SAAA,CACE,EAAC,MAAD,CACE,cAAY,OACZ,UAAU,8CAEV,SAAA,EAAC,MAAD,CACE,UAAU,wCACV,IAAK,EACL,MAAO,CAAE,UAAW,WAAY,CACjC,CAAA,CACE,CAAA,EACL,EAAC,SAAD,CACE,aACE,EAAa,sBAAwB,uBAEvC,UAAW,qCAAqC,IAChD,uBAAA,GACA,YAAe,EAAe,GAAU,CAAC,CAAK,EAC9C,MACE,EAAa,sBAAwB,uBAEvC,KAAK,SAEJ,SACC,EADD,EACE,EAEA,EAFD,CAAM,cAAY,OAAO,KAAM,EAAK,CAEC,CAEjC,CAAA,CACL,IAEN,EAAQ,GACP,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,SAAD,CACE,aAAW,iBACX,UAAW,yCAAyC,IACpD,uBAAA,GACA,YAAe,EAAY,EAAU,CAAC,EACtC,KAAK,SAEL,SAAA,EAAC,EAAD,CACE,cAAY,OACZ,UAAU,sCACX,CAAA,CACK,CAAA,EACR,EAAC,SAAD,CACE,aAAW,aACX,UAAW,qCAAqC,IAChD,uBAAA,GACA,YAAe,EAAY,EAAU,CAAC,EACtC,KAAK,SAEL,SAAA,EAAC,EAAD,CACE,cAAY,OACZ,UAAU,sCACX,CAAA,CACK,CAAA,CACR,CAAA,CAAA,CAED,CAEL,CAAA,EAAA,EAAC,MAAD,CAAK,UAAU,qCAAqC,SAAA,oBAE/C,CAAA,EAEN,EAAQ,GACP,EAAC,UAAD,CACE,aAAW,iBACX,UAAU,qCACV,IAAK,EAEL,SAAA,EAAC,MAAD,CAAK,UAAU,0CACZ,SAAA,EAAO,KAAK,EAAO,IAClB,EAAC,SAAD,CACE,aAAY,cAAc,EAAa,EAAE,MAAM,IAC/C,eAAc,IAAY,EAC1B,UAAW,0CAA0C,IAAY,EAAa,cAAgB,KAE9F,YAAe,EAAY,CAAU,EACrC,IAAM,GAAY,CAChB,EAAc,QAAQ,GAAc,CACtC,EACA,KAAK,SAEL,SAAA,EAAC,EAAD,CACE,IAAI,GACJ,UAAU,+CACV,OAAQ,GACR,QAAQ,OACR,SAAU,IACV,MAAM,OACN,IAAK,EACL,MAAO,EACR,CAAA,CACK,EAjBD,GAAG,EAAM,GAAG,GAiBX,CACT,CACE,CAAA,CACE,CAAA,CAEJ,GAEb,CC3XA,SAAgB,EAAe,CAC7B,SACA,gBACA,OACA,cAMC,CACD,IAAM,EAAS,CAAC,GAAG,IAAI,IAAI,EAAO,OAAO,OAAO,CAAC,CAAC,EAC9C,CAAC,EAAO,QAAU,GACpB,EAAO,KAAK,CAAa,EAE3B,GAAM,CAAC,EAAO,GAAY,EAAS,CAAC,EAC9B,CAAC,EAAM,GAAW,EAAS,EAAK,EAChC,EAAS,EAAiC,IAAI,EAC9C,EAAa,EAAwC,IAAI,EACzD,EAAQ,EAAO,OACf,EAAW,GAAU,EAAQ,EAAS,GAAS,EAAQ,EAE7D,OACE,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,EAAD,CACc,aACN,OACN,SAAW,GAAS,CAClB,EAAS,CAAI,EACb,EAAQ,EAAI,CACd,EACA,SAAU,EACV,OAAQ,EACR,eAAgB,EACR,SACE,UACX,CAAA,EACA,EAAQ,GACP,EAAC,EAAO,KAAR,CAAa,aAAc,EAAe,OACxC,SAAA,EAAC,EAAO,OAAR,CAAA,SAAA,CACE,EAAC,EAAO,SAAR,CAAiB,UAAU,uCAAyC,CAAA,EACpE,EAAC,EAAO,MAAR,CACE,mBAAkB,IAAA,GAClB,UAAU,sCACV,WAAY,EACZ,UAAY,GAAU,CAElB,EAAQ,GACR,EAAM,QACN,EAAM,SACN,EAAM,SACN,EAAM,WAIJ,EAAM,MAAQ,aAAe,EAAM,MAAQ,gBAC7C,EAAM,eAAe,EACrB,GACG,GAAY,EAAM,MAAQ,aAAe,EAAI,IAAM,GAClD,CACJ,EAEJ,EArBF,SAAA,CAuBE,EAAC,EAAO,MAAR,CAAc,UAAU,uCAAxB,SAAA,CACG,EAAK,YAAU,EAAW,EAAE,OAAK,CACtB,IACd,EAAC,MAAD,CACE,UAAU,0CACV,kBAAqB,CACnB,EAAW,QAAU,IACvB,EACA,WAAa,GAAU,CACrB,IAAM,EAAQ,EAAW,QACzB,EAAW,QAAU,KACrB,IAAM,EAAM,EAAM,eAAe,KAAK,CAAC,EAEvC,GAAI,EAAE,GAAS,IAAQ,EAAQ,EAC7B,OAEF,IAAM,EAAK,EAAI,QAAU,EAAM,EACzB,EAAK,EAAI,QAAU,EAAM,EAC3B,KAAK,IAAI,CAAE,GAAK,IAAM,KAAK,IAAI,CAAE,EAAI,KAAK,IAAI,CAAE,EAAI,KACtD,GAAU,GAAY,EAAK,EAAI,EAAI,IAAM,GAAS,CAAK,CAE3D,EACA,YAAc,GAAU,CAClB,EAAM,QAAQ,SAAW,IAC3B,EAAW,QAAU,KAEzB,EACA,aAAe,GAAU,CACvB,IAAM,EAAQ,EAAM,QAAQ,KAAK,CAAC,EAClC,EAAW,QACT,EAAM,QAAQ,SAAW,GAAK,EAC1B,CAAE,EAAG,EAAM,QAAS,EAAG,EAAM,OAAQ,EACrC,IACR,EA9BF,SAAA,CAgCE,EAAC,EAAD,CACE,IAAK,GAAG,EAAK,IAAI,EAAW,EAAE,MAAM,IACpC,OAAQ,IACR,SAAU,KACV,MAAM,QACN,IAAK,EAAO,GACZ,MAAO,IACR,CAAA,EACA,GAAQ,EAAQ,GACf,EAAC,EAAD,CACE,IAAI,GACJ,cAAY,OACZ,UAAU,uCACV,OAAQ,IACR,QAAQ,QACR,SAAU,KACV,MAAM,QACN,IAAK,GAAQ,EAAW,GAAK,GAC7B,MAAO,IACR,CAAA,CAEA,IACL,EAAC,EAAO,MAAR,CACE,aAAW,qBACX,UAAU,4CAEV,SAAA,EAACA,EAAD,CAAO,cAAY,OAAO,KAAM,EAAK,CAAA,CACzB,CAAA,EACb,EAAQ,GACP,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,SAAD,CACE,aAAW,iBACX,UAAU,+CACV,YAAe,GAAU,EAAW,EAAI,GAAS,CAAK,EACtD,KAAK,SAEL,SAAA,EAAC,EAAD,CAAa,cAAY,OAAO,KAAM,EAAK,CAAA,CACrC,CAAA,EACR,EAAC,SAAD,CACE,aAAW,aACX,UAAU,2CACV,YAAe,GAAU,EAAW,GAAK,CAAK,EAC9C,KAAK,SAEL,SAAA,EAAC,EAAD,CAAc,cAAY,OAAO,KAAM,EAAK,CAAA,CACtC,CAAA,CACR,CAAA,CAAA,CAEQ,CACD,CAAA,CAAA,CAAA,CAAA,CACJ,CAAA,CAEf,CAAA,CAAA,CAEN,CCzIA,MAAM,EAAkB,CAAE,EAAG,KAAM,EAAG,IAAK,EAE3C,SAAS,EAAW,EAA2B,CAO7C,OALS,EADL,IAAU,UACJ,EAEN,IAAU,aAAe,IAAU,YAC7B,EAEF,EALC,CAAa,cAAY,OAAO,KAAM,EAAK,CAAA,CAMtD,CACA,SAAS,EACP,EACA,EACA,CAoBA,OAnBI,EAAK,WAAa,UACb,CACL,CAAC,UAAWC,EAAY,EAAK,mBAAqB,CAAC,CAAC,EACpD,CACE,YACA,EAAK,oBAAsB,KACvB,YACA,OAAO,EAAK,iBAAiB,CACnC,CACF,EAEE,IAAW,WACN,CACL,CACE,YACA,EAAK,aAAeA,EAAY,EAAK,YAAY,EAAI,SACvD,CACF,EAEK,CACL,CAAC,cAAeA,EAAY,EAAK,cAAgB,CAAC,CAAC,EACnD,CAAC,QAASA,EAAY,EAAK,cAAgB,CAAC,CAAC,EAC7C,CAAC,YAAaA,EAAY,EAAK,oBAAsB,GAAG,CAAC,CAC3D,CACF,CACA,SAAgB,EAAmB,CACjC,UACA,OACA,mBAAmB,EACnB,qBAMC,CACD,EACE,EAAK,SAAW,EAAQ,QACxB,EAAK,OAAS,EAAQ,KACxB,EACA,GAAM,CAAC,EAAU,GAAe,EAAS,EAAK,EACxC,EAAgB,EAAM,EACtB,EAAS,EAAwB,EAAS,CAAI,EAC9C,EAAgB,CACpB,OAAQ,SACR,MAAO,QACP,SAAU,QACZ,EAAE,GACI,EAAW,EAAsB,EAAS,EAAQ,CAAI,EACtD,EAAS,EAAK,WAAa,UAC3B,GAAmB,EAAK,aAAe,GAAA,CAAI,KAAK,CAAC,CAAC,OAAS,IAC3D,EAAU,EAAY,EAAM,CAAM,EAClC,EAAc,EAAgB,GACpC,OACE,EAAC,UAAD,CAAS,UAAU,qCAAnB,SAAA,CACE,EAAC,EAAD,CACE,cACE,EAAK,OACL,EAAQ,cAAc,OACtB,EAAQ,WAAW,QACnB,EAAQ,WAAW,WACnB,KAEF,WAAY,EACZ,OAAQ,EAAK,OACb,KAAM,EAAK,IACZ,CAAA,EACD,EAAC,MAAD,CAAK,UAAU,kCAAf,SAAA,CACE,EAAC,EAAD,CAAA,SAAc,EAAK,IAAkB,CAAA,EACpC,EAAK,YACJ,EAAC,MAAD,CAAK,UAAU,yCAAf,SAAA,CACE,EAAC,EAAD,CACE,UACE,CAAC,GAAY,EACT,4CACA,IAAA,GAEN,YAAa,EAAK,YAClB,GAAI,CACL,CAAA,EACA,EACC,EAAC,SAAD,CACE,gBAAe,EACf,gBAAe,EACf,UAAU,2CACV,YAAe,EAAY,CAAC,CAAQ,EACpC,KAAK,SALP,SAAA,CAOG,EAAW,mBAAqB,wBAAyB,IAC1D,EAAC,EAAD,CACE,cAAY,OACZ,KAAM,GACN,MAAO,CAAE,UAAW,EAAW,iBAAmB,IAAA,EAAU,CAC7D,CAAA,CACK,CACN,CAAA,EAAA,IACD,CACH,CAAA,EAAA,KACJ,EAAC,KAAD,CAAI,UAAU,mCAAd,SAAA,CACG,EAAQ,KAAK,CAAC,EAAO,KACpB,EAAC,MAAD,CAAK,UAAU,iCAAf,SAAA,CACE,EAAC,KAAD,CAAA,SAAA,CACG,EAAW,CAAK,EAChB,CACC,CAAA,CAAA,EACJ,EAAC,KAAD,CAAA,SAAK,CAAU,CAAA,CACZ,CANgD,EAAA,CAMhD,CACN,EACD,EAAC,MAAD,CAAK,UAAU,iCAAf,SAAA,CACE,EAAC,KAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAQ,cAAY,OAAO,KAAM,EAAK,CAAA,EACrC,CACC,CAAA,CAAA,EACJ,EAAC,KAAD,CAAI,UAAU,kCAAmC,SAAA,CAAa,CAAA,CAC3D,IACJ,CAAC,GAAU,IAAW,WACrB,EAAC,MAAD,CAAK,UAAU,oCAAf,SAAA,CACE,EAAC,MAAD,CAAA,SAAA,CACE,EAAC,KAAD,CAAA,SAAI,OAAS,CAAA,EACb,EAAC,KAAD,CAAA,SAAKA,EAAY,EAAK,cAAgB,CAAC,CAAM,CAAA,CAC1C,CAAA,CAAA,EACL,EAAC,MAAD,CAAA,SAAA,CACE,EAAC,KAAD,CAAA,SAAI,eAAiB,CAAA,EACrB,EAAC,KAAD,CAAA,SAAKA,EAAY,EAAK,oBAAsB,GAAG,CAAM,CAAA,CAClD,CAAA,CAAA,CACF,CACH,CAAA,EAAA,IACF,GACD,CACE,CAAA,CAAA,GAEb,CClJA,MAAM,EAAuB,CAAE,EAAG,KAAM,EAAG,IAAK,EAE1C,EAAe,QAarB,SAAS,EAAgB,EAAe,EAA8B,CACpE,IAAM,EAAW,OAAO,CAAK,EACvB,EAAW,GAAY,EAAK,mBAAqB,GACvD,GACE,EAAE,EAAa,KAAK,CAAK,GAAK,OAAO,cAAc,CAAQ,IAC3D,EAAW,EAEX,MAAO,iCAET,GAAI,CAAC,EAAK,iBACR,MAAO,UAAUC,EAAY,CAAQ,IAEvC,IAAM,EACJ,EAAK,iBAAiB,qBACtB,EAAK,iBAAiB,2BAA6B,EAAW,GAC1D,EAAQ,EAAW,EAIzB,OAHK,OAAO,cAAc,CAAK,EAGxB,aAAaA,EAAY,CAAQ,EAAE,KAAK,EAAK,iBAAiB,KAAK,IAAIA,EAAY,CAAM,EAAE,YAAYA,EAAY,CAAK,IAFtH,yBAGX,CACA,SAAS,EACP,EACA,EACA,EACA,CAIA,OAFS,OADL,EACY,EAAU,EAAQ,SAAW,EAE/B,EAAU,EAAQ,OAAS,IAAM,CAFD,CAGhD,CACA,SAAS,EACP,EACA,EACA,CAYA,OAXI,EAAqB,CAAI,EACpB,yBAEL,IAAW,QACN,6BAEL,IAAW,WACN,EAAK,WAAa,UACrB,sCACA,mCAEC,6BACT,CACA,SAAS,EACP,EACA,EACA,EACA,CAOA,OANI,EAAqB,CAAI,EACpB,gDAEL,IAAW,QACN,mBAAmB,EAAsB,EAAS,QAAS,CAAI,EAAE,GAEnE,EAAK,WAAa,UACrB,gDACA,mCACN,CACA,SAAS,EACP,EACA,EACA,EACA,EACkB,CAClB,MAAO,CACL,OAAQ,EAAS,EAAI,OAAO,CAAK,EAAI,IACrC,kBAAmB,EACf,EAAiB,kBACjB,EAAQ,mBAAqB,EAAQ,yBACzC,SAAU,EAAS,OAAO,CAAK,EAAI,CACrC,CACF,CACA,SAAgB,EAAqB,CACnC,UACA,OACA,mBACA,aACA,UACA,SACA,WACA,mBAAmB,GACF,CACjB,IAAM,EAAmB,EAAqB,GACxC,EAAS,EAAK,WAAa,UAC3B,EAAU,KAAK,KAAK,EAAgC,CAAI,EAAI,GAAG,EAC/D,CAAC,EAAO,GAAY,EACxB,EAAsB,EAAQ,EAAkB,CAAO,CACzD,EACM,CAAC,EAAO,GAAY,EAAwB,IAAI,EAChD,EAAK,EAAM,EACjB,EACE,EAAK,SAAW,EAAQ,QACxB,EAAK,OAAS,EAAQ,KACxB,EACA,IAAM,EAAS,EAAwB,EAAS,CAAI,EAC9C,EACJ,IAAW,UACX,CAAC,EAAqB,CAAI,GAC1B,EAAK,WAAa,SACpB,SAAS,EAAkB,EAAmC,CAE5D,GADA,EAAM,eAAe,EACjB,CAAC,EAAa,KAAK,CAAK,EAAG,CAC7B,EACE,EACI,iCACA,kCACN,EACA,MACF,CACA,IAAM,EAAY,EAChB,EACA,EACA,EACA,CACF,EACM,EAAU,EAAyB,EAAS,EAAM,CAAS,EACjE,GAAI,EAAS,CACX,EAAS,CAAO,EAChB,EAAQ,CAAO,EACf,MACF,CACA,GAAI,CACF,EAA2B,EAAS,EAAM,CAAS,CACrD,MAAQ,CACN,EAAS,mCAAmC,EAC5C,MACF,CACA,EAAW,CAAS,CACtB,CAiBA,OAhBK,EAiBH,EAAC,OAAD,CACE,UAAU,kCACV,SAAU,EAFZ,SAAA,CAIE,EAAC,GAAD,CACU,SACR,WAAY,EACN,OACG,SACV,CAAA,EACD,EAAC,MAAD,CAAK,UAAU,uCAAf,SAAA,CACE,EAAC,QAAD,CAAO,UAAU,8BAA8B,QAAS,EAAxD,SAAA,CACG,EAAS,WAAa,kBACvB,EAAC,OAAD,CAAM,UAAU,uCAAhB,SAAA,CACG,EAAS,KAAO,EAAC,OAAD,CAAM,cAAY,OAAO,SAAA,GAAO,CAAA,EACjD,EAAC,QAAD,CACE,mBAAkB,GAAG,EAAG,OACxB,eAAc,EAAQ,EACtB,aAAa,MACT,KACJ,UAAU,UACV,SAAW,GAAU,CACnB,EAAS,EAAM,OAAO,KAAK,EAC3B,EAAS,IAAI,CACf,EACA,YAAa,EAAS,IAAM,OAAO,CAAO,EAC1C,SAAA,GACO,OACR,CAAA,CACG,CACD,CAAA,CAAA,IACN,EAAQ,EAAC,IAAD,CAAG,KAAK,QAAS,SAAA,CAAS,CAAA,EAAI,KACvC,EAAC,IAAD,CAAG,GAAI,GAAG,EAAG,OACV,SAAA,EACG,EAAgB,EAAO,CAAI,EAC3B,wCAAwCA,EAAY,EAAU,GAAG,EAAE,mBAAmBA,EAAY,EAAK,oBAAsB,GAAG,EAAE,EACrI,CAAA,EACH,EAAC,GAAD,CAA2B,MAAO,CAAA,EAClC,EAAC,MAAD,CAAK,UAAU,yCAAf,SAAA,CACE,EAAC,IAAD,CAAA,SACG,EACG,yFACA,mHACH,CAAA,EACH,EAAC,SAAD,CACE,UAAU,+BACV,SAAU,CAAC,EAAQ,QACnB,KAAK,SAHP,SAAA,CAKG,EAAS,uBAAyB,sBAAuB,IAC1D,EAAC,EAAD,CAAY,cAAY,OAAO,KAAM,EAAK,CAAA,CACpC,CACL,CAAA,CAAA,IACJ,EAAQ,QAAU,KACjB,EAAC,IAAD,CAAG,KAAK,QAAQ,SAAA,+CAAgD,CAAA,CAE/D,CACD,CAAA,CAAA,IAxEJ,EAAC,MAAD,CAAK,UAAU,kEAAf,SAAA,CACE,EAAC,IAAD,CAAG,UAAU,gCAAgC,SAAA,aAAc,CAAA,EAC3D,EAAC,EAAD,CAAA,SAAmB,EAAc,EAAM,CAAM,CAAoB,CAAA,EACjE,EAAC,IAAD,CAAA,SAAI,EAAoB,EAAS,EAAM,CAAM,CAAK,CAAA,EAClD,EAAC,EAAD,CACE,UAAU,+BACV,KAAM,EACE,SAHV,SAAA,CAIC,wBACsB,EAAC,EAAD,CAAY,cAAY,OAAO,KAAM,EAAK,CAAA,CAC9C,GAChB,GA+DX,CAEA,SAAS,GAAgB,CACvB,WAAY,EACZ,OACA,SACA,WAMC,CACD,OACE,EAAC,MAAD,CAAK,UAAU,yCAAf,SAAA,CACE,EAAC,IAAD,CAAG,UAAU,gCAAgC,SAAA,aAAc,CAAA,EAC3D,EAAC,EAAD,CAAA,SACG,EAAS,qBAAuB,iBACjB,CAAA,EAClB,EAAC,IAAD,CAAA,SACG,EACG,+DACA,mHACH,CAAA,EACH,EAAC,IAAD,CAAA,SAAA,CACG,EAAS,UAAY,2BACtB,EAAC,SAAD,CAAA,SACGA,EAAY,EAAU,EAAK,mBAAqB,EAAK,EAAU,GAAG,CAC7D,CAAA,CACP,CAAA,CAAA,EACF,GAAU,EAAK,oBAAsB,KACpC,EAAC,IAAD,CAAA,SAAA,CAAI,EAAK,kBAAkB,YAAa,CAAA,CAAA,EACtC,KACH,EAAK,uBACJ,EAAC,IAAD,CAAA,SAAG,4EAGA,CAAA,EACD,IACD,GAET,CAEA,SAAS,GAAoB,CAAE,QAA0C,CAIvE,OAHI,EAAK,WAAa,WAAa,CAAC,EAAK,iBAChC,KAGP,EAAC,IAAD,CAAA,SAAA,CACG,EAAK,iBAAiB,KAAK,IAAE,IAC7BA,EAAY,EAAK,iBAAiB,oBAAoB,EAAE,qCAExD,CAAA,CAAA,CAEP,CCzSA,SAAgB,GAAqB,EAA4B,CAC/D,GAAM,CAAC,EAAa,GAClB,EAAoD,IAAI,EACpD,CAAC,EAAQ,GAAa,EAAS,EAAK,EACpC,EAAS,GAAQ,EAAM,gBAAkB,EAAM,mBAwBrD,OAtBA,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,OAAO,4BAA6B,CAAC,MAClC,CAAE,oBAAqB,CAClB,GACF,MAAqB,CAAc,CAEvC,MACM,CACA,GACF,EAAU,EAAI,CAElB,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,CAAC,EAED,EACK,EAAC,EAAD,CAAa,GAAI,CAAQ,CAAA,EAGhC,EAAC,MAAD,CAAA,SAAA,CACE,EAAC,IAAD,CAAG,KAAM,EAAS,QAAU,SACzB,SAAA,EACG,kCACA,iCACH,CAAA,EACF,GAAU,GACT,EAAC,IAAD,CAAA,SAAG,+HAGA,CAAA,EAEJ,EAAS,KACR,EAAC,SAAD,CAAQ,QAAS,EAAM,OAAQ,KAAK,SAAS,SAAA,cAErC,CAAA,EAET,GAAU,CAAC,GACV,EAAC,SAAD,CAAQ,YAAe,OAAO,SAAS,OAAO,EAAG,KAAK,SAAS,SAAA,0BAEvD,CAAA,CAEP,CAAA,CAAA,CAET,CC1BA,SAAS,GAAgB,CAAE,UAA+B,CACxD,OACE,EAAC,MAAD,CAAK,UAAU,iCAAf,SAAA,CACE,EAAC,OAAD,CAAA,SAAA,CAEI,EADD,EACE,EAEA,EAFD,CAAa,cAAY,OAAO,KAAM,EAAK,CAEN,EAEtC,EAAS,kBAAoB,WAC1B,CAAA,CAAA,EACN,EAAC,OAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAa,cAAY,OAAO,KAAM,EAAK,CAAA,EAC1C,EAAS,eAAiB,aACvB,CAAA,CAAA,EACN,EAAC,OAAD,CAAA,SAAA,CACE,EAAC,EAAD,CAAY,cAAY,OAAO,KAAM,EAAK,CAAA,EACzC,EAAS,mBAAqB,gBAC3B,CAAA,CAAA,CACH,GAET,CAEA,SAAS,GACP,EAIA,CACA,GAAM,CAAE,UAAS,OAAM,WAAY,EAC/B,EAMJ,OALI,EAAM,SACR,EAAgB,CAAE,KAAM,EAAM,SAAU,MAAO,oBAAqB,EAC3D,EAAM,SACf,EAAgB,CAAE,MAAO,qBAAsB,QAAS,EAAM,MAAO,GAGrE,EAAC,EAAD,CACE,YAAa,EAAQ,KACrB,UAAW,EAAM,UACjB,cAAe,EAAsB,EAAS,SAAU,CAAI,EAC5D,cAAe,EAAM,eAAiB,EAAQ,WAAW,KACzD,aAAA,GACA,SACE,EAAK,OAAS,EAAK,OAAO,IAAM,EAAQ,cAAc,OAAS,IAAA,GAEjE,SAAU,EAAK,KACN,UACT,cACE,EAAM,iBACF,CAAE,KAAM,EAAM,iBAAkB,MAAO,gBAAiB,EACxD,EAEN,gBAAiB,EAAM,iBAAmB,EAAgB,IAAA,GAC1D,MAAO,CACL,uBAAwB,EAAQ,WAAW,OAAS,UACpD,GAAG,EAAM,KACX,EACA,MAAO,EAAM,KACd,CAAA,CAEL,CAEA,SAAS,GAAgB,EAAoC,CAC3D,GAAM,CACJ,QAAS,EACT,SACA,iBACA,YACA,QAAQ,OACR,SACE,EACE,EAAiB,EAA2B,IAAI,EAChD,CAAC,EAAS,GAAc,EAAS,CAAc,EAC/C,EAAe,EAAO,CAAc,EACpC,EACJ,EAAQ,MAAM,KAAM,GAAc,EAAU,KAAO,CAAM,GACzD,GAAgB,KAClB,EACE,GAAM,SAAW,EAAQ,QACzB,GAAM,OAAS,EAAQ,KACzB,EACA,GAAM,CAAC,EAAW,GAAgB,MAChC,EACI,CACE,OAAQ,EACR,kBACE,EAAe,WAAW,mBAAqB,GACjD,SAAU,EAAe,WAAW,QACtC,EACA,IACN,EACM,CAAC,EAAmB,GAAwB,EAChD,EAAQ,CACV,EACM,EAAc,EAAgB,EAAI,EAClC,EAAgB,EAAO,CAAK,EAClC,EAAc,QAAU,EACxB,IAAM,EAAe,EAAuB,IAAI,EAC1C,EAAwB,EAAa,GAAoB,CAEzD,EAAY,SACd,EAAqB,CAAM,EAEzB,EAAa,UAAY,IAC3B,EAAa,QAAU,EACvB,EAAmB,EAAc,QAAQ,wBAAyB,CAAM,EAE5E,EAAG,CAAC,CAAC,EACC,EAAc,EAAQ,EAC5B,OACE,EAAY,QAAU,GACtB,EAAsB,CAAW,MACpB,CACX,EAAY,QAAU,EACxB,GACC,CAAC,EAAa,CAAqB,CAAC,EACvC,GAAM,CAAC,EAAS,GAAc,EAAS,CAAE,MAAO,GAAI,MAAO,EAAG,CAAC,EACzD,CAAC,EAAQ,GAAa,EAAS,EAAQ,CAAe,EACtD,CAAC,EAAQ,GAAa,EAAwB,IAAI,EAClD,CAAC,EAAS,GAAc,EAC5B,IACF,EAEA,MAAgB,CAEZ,EAAE,GAAU,GAAqB,IACjC,EAAa,UAAY,IAEzB,EAAa,QAAU,EACvB,EAAW,CAAc,EAE7B,EAAG,CAAC,EAAgB,EAAQ,EAAmB,CAAc,CAAC,EAE9D,SAAS,EAAO,EAA6B,EAAiB,CAC5D,EAAsB,EAAK,EAG3B,EAAa,QAAU,EAAc,QAAQ,QAC7C,EAAW,CAAO,EAClB,EAAa,IAAI,EACjB,EAAU,EAAK,EACf,EAAU,CAAO,CACnB,CACA,SAAS,EAAkB,EAAwB,CACjD,EAAU,IAAI,EACd,EAAa,CAAI,EACjB,EAAU,EAAI,CAChB,CAqBA,OApBK,EAUD,EAEA,EAAC,GAAD,CACE,GAAI,EACK,UACH,OACG,SACV,CAAA,EAIH,EAAC,UAAD,CACE,UAAW,CAAC,uBAAwB,CAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,EACvE,yBAAwB,EACxB,IAAK,EACL,MAAO,CACL,uBAAwB,EAAQ,WAAW,OAAS,UACpD,GAAG,CACL,EAPF,SAAA,CASG,EAAoB,KACnB,EAAC,EAAD,CACE,UAAU,6BACV,KAAM,EAAM,SACZ,OAAQ,EAAM,OAHhB,SAAA,CAKE,EAAC,EAAD,CAAa,cAAY,OAAO,KAAM,EAAK,CAAA,EAAC,YAC3B,CAErB,CAAA,EAAA,EAAC,MAAD,CAAK,UAAU,+BAAf,SAAA,CACE,EAAC,EAAD,CACW,UACT,kBAAmB,EAAM,kBACnB,OACN,iBAAkB,EAAM,gBACzB,CAAA,EACD,EAAC,MAAD,CAAK,UAAU,oCAAf,SAAA,CACG,EAAwB,EAAS,CAAI,IAAM,SAC1C,EAAC,GAAD,CAAiB,OAAQ,EAAK,WAAa,SAAY,CAAA,EACrD,KACH,EACC,EAAC,IAAD,CAAG,UAAU,+BAA+B,KAAK,QAC9C,SAAA,CACA,CAAA,EACD,KACH,GAAU,EACT,EAAC,GAAD,CACE,GAAI,EACY,iBACP,UACT,cAAe,EAAM,eAAiB,EAAQ,WAAW,KAChD,UACU,oBACb,OACN,WAAc,EAAU,EAAK,EAC7B,gBAAiB,EACjB,0BAA4B,GAC1B,EAAc,GACZ,GACI,CACE,GAAG,EACH,kBACE,EAAQ,mBAAqB,CACjC,CAEN,EAEF,wBAAyB,EACzB,SAAU,EACV,SAAU,EACC,WACZ,CAAA,EAED,EAAC,EAAD,CACW,UACT,SAAU,EAAM,SAChB,iBAAkB,EACZ,OACN,iBAAkB,EAAM,iBACxB,OAAQ,EAAM,OACd,WAAY,EACZ,QAAS,CACV,CAAA,EAEF,EAAoB,KACnB,EAAC,EAAD,CACE,UAAU,oCACV,KAAM,EAAM,SACZ,OAAQ,EAAM,OAHhB,SAAA,CAIC,yBACuB,EAAC,EAAD,CAAY,cAAY,OAAO,KAAM,EAAK,CAAA,CAC/C,GAElB,CACF,CAAA,CAAA,CACE,CAAA,CAAA,IAvGP,EAAC,MAAD,CAAA,SAAA,CACE,EAAC,IAAD,CAAG,KAAK,QAAQ,SAAA,2CAA4C,CAAA,EAC5D,EAAC,EAAD,CAAmB,KAAM,EAAM,SAAU,OAAQ,EAAM,OAAQ,SAAA,uBAE5C,CAAA,CAChB,CAAA,CAAA,CAoGX,CAEA,SAAgB,GAAuB,EAAoC,CACzE,IAAM,EAAW,EAAO,CACtB,UAAW,EAAM,QAAQ,GACzB,OAAQ,EAAM,OACd,OAAQ,EAAM,MAChB,CAAC,EACD,GACE,EAAS,QAAQ,SAAW,EAAM,QAClC,EAAS,QAAQ,YAAc,EAAM,QAAQ,IAC7C,EAAS,QAAQ,SAAW,EAAM,OAElC,MAAU,UACR,oEACF,EAEF,GACE,EAAM,iBACL,EAAM,eAAe,YAAc,EAAM,QAAQ,IAChD,EAAM,eAAe,SAAW,EAAM,QACtC,EAAM,eAAe,KAAK,KAAO,EAAM,QACvC,EAAM,eAAe,KAAK,YAAc,EAAM,QAAQ,IAExD,MAAU,UACR,mEACF,EAIF,OACE,EAAC,EAAsB,SAAvB,CAAgC,MAAO,EAAM,QAAQ,aACnD,SAAA,EAAC,GAAD,CAAiB,GAAI,CAAQ,CAAA,CACC,CAAA,CAEpC"}
1
+ {"version":3,"file":"auction-item.js","names":["Close","formatMoney","formatMoney"],"sources":["../src/use-auction-autoplay.ts","../src/auction-photo-filmstrip.tsx","../src/auction-gallery.tsx","../src/auction-item-details.tsx","../src/auction-item-selection.tsx","../src/auction-payment-loader.tsx","../src/lockerverse-auction-item.tsx"],"sourcesContent":["import Autoplay from \"embla-carousel-autoplay\";\nimport useEmblaCarousel from \"embla-carousel-react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nconst PHOTO_DELAY = 6000;\n\n// Embla 8 has stop(), but no pause(). Resume with the saved delay, then restore\n// the full delay on selection. Embla remains the only owner of the slide timer.\nexport function useAuctionAutoplay(enabled: boolean, reducedMotion: boolean) {\n const remaining = useRef(PHOTO_DELAY);\n const progressRef = useRef<HTMLDivElement>(null);\n const [cycleDelay, setCycleDelay] = useState(PHOTO_DELAY);\n const autoplay = useMemo(\n () =>\n Autoplay({\n delay: cycleDelay,\n playOnInit: false,\n stopOnFocusIn: false,\n stopOnInteraction: true,\n stopOnMouseEnter: false,\n }),\n [cycleDelay]\n );\n\n const [viewportRef, embla] = useEmblaCarousel(\n { duration: reducedMotion ? 0 : 25, loop: true },\n [autoplay]\n );\n\n const draw = useCallback(() => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns this ref in the filmstrip component.\n if (progressRef.current) {\n progressRef.current.style.transform = `scaleX(${1 - remaining.current / PHOTO_DELAY})`;\n }\n }, []);\n\n const freeze = useCallback(() => {\n const left = autoplay.timeUntilNext();\n if (left !== null) {\n remaining.current = Math.max(1, Math.min(PHOTO_DELAY, left));\n }\n autoplay.stop();\n draw();\n }, [autoplay, draw]);\n\n const reset = useCallback(() => {\n remaining.current = PHOTO_DELAY;\n setCycleDelay(PHOTO_DELAY);\n autoplay.reset();\n draw();\n }, [autoplay, draw]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n if (!enabled) {\n freeze();\n } else if (cycleDelay === remaining.current) {\n autoplay.play();\n } else {\n setCycleDelay(remaining.current);\n }\n }, [embla, enabled, autoplay, cycleDelay, setCycleDelay, remaining, freeze]);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n let frame = 0;\n const update = () => {\n const left = autoplay.timeUntilNext();\n if (!enabled || left === null) {\n return;\n }\n remaining.current = Math.max(0, Math.min(PHOTO_DELAY, left));\n draw();\n frame = requestAnimationFrame(update);\n };\n const start = () => {\n cancelAnimationFrame(frame);\n if (enabled) {\n frame = requestAnimationFrame(update);\n }\n };\n const stop = () => cancelAnimationFrame(frame);\n const reinitialize = () => {\n if (enabled) {\n autoplay.play();\n }\n };\n embla\n .on(\"select\", reset)\n .on(\"reInit\", reinitialize)\n .on(\"autoplay:timerset\", start)\n .on(\"autoplay:timerstopped\", stop);\n draw();\n start();\n return () => {\n stop();\n embla\n .off(\"select\", reset)\n .off(\"reInit\", reinitialize)\n .off(\"autoplay:timerset\", start)\n .off(\"autoplay:timerstopped\", stop);\n };\n }, [embla, autoplay, enabled, remaining, reset, draw]);\n return { embla, freeze, progressRef, reset, viewportRef };\n}\n","import { ChevronLeft, ChevronRight, Pause, Play } from \"lucide-react\";\nimport {\n type PointerEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { useAuctionAutoplay } from \"./use-auction-autoplay\";\nimport { useAuctionVisibility } from \"./use-auction-visibility\";\n\ntype FilmstripProps = {\n photos: string[];\n name: string;\n imageSizes?: string | undefined;\n selected: number;\n paused?: boolean;\n photoButtonRef: Ref<HTMLButtonElement>;\n onSelect: (index: number) => void;\n onExpand: (index: number) => void;\n};\n\nexport function AuctionPhotoFilmstrip({\n photos,\n name,\n imageSizes = \"(max-width: 1279px) 100vw, 45vw\",\n selected,\n paused = false,\n photoButtonRef,\n onSelect,\n onExpand,\n}: FilmstripProps) {\n const stripRef = useRef<HTMLDivElement>(null);\n const keyboardPhoto = useRef<HTMLButtonElement | null>(null);\n const thumbnailRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const [reducedMotion, setReducedMotion] = useState(true);\n const [hovered, setHovered] = useState(false);\n const [keyboardFocused, setKeyboardFocused] = useState(false);\n const [userPaused, setUserPaused] = useState(false);\n const [dragging, setDragging] = useState(false);\n const { ref: galleryRef, visible } = useAuctionVisibility<HTMLElement>();\n const [controlsActive, setControlsActive] = useState(false);\n const [touchControls, setTouchControls] = useState(true);\n const hideControlsTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const controlsVisible = touchControls || controlsActive || keyboardFocused;\n const controlsFade = `lockerverse-auction-gallery__control ${controlsVisible ? \"is-visible\" : \"\"}`;\n\n const scheduleControlsHide = () => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n hideControlsTimer.current = setTimeout(\n () => setControlsActive(false),\n 2000\n );\n };\n const showControls = (event: PointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== \"mouse\") {\n setTouchControls(true);\n return;\n }\n setControlsActive(true);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: The timer ref is assigned after pointer activity.\n if (hideControlsTimer.current) {\n clearTimeout(hideControlsTimer.current);\n }\n if (\n !(\n event.target instanceof Element &&\n event.target.closest(\"[data-gallery-control]\")\n )\n ) {\n scheduleControlsHide();\n }\n };\n\n useEffect(() => {\n const preference = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const update = () => setTouchControls(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => {\n preference.removeEventListener(\"change\", update);\n clearTimeout(hideControlsTimer.current ?? undefined);\n };\n }, []);\n\n const autoplayEnabled =\n !(\n paused ||\n reducedMotion ||\n hovered ||\n keyboardFocused ||\n userPaused ||\n dragging\n ) && visible;\n const count = photos.length;\n const current = count ? ((selected % count) + count) % count : 0;\n const { viewportRef, embla, progressRef, freeze, reset } = useAuctionAutoplay(\n autoplayEnabled && count > 1,\n reducedMotion\n );\n\n useEffect(() => {\n const preference = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const update = () => setReducedMotion(preference.matches);\n update();\n preference.addEventListener(\"change\", update);\n return () => preference.removeEventListener(\"change\", update);\n }, []);\n\n useEffect(() => {\n if (!embla) {\n return;\n }\n const select = () => onSelect(embla.selectedScrollSnap());\n embla.on(\"select\", select).on(\"reInit\", select);\n return () => {\n embla.off(\"select\", select).off(\"reInit\", select);\n };\n }, [embla, onSelect]);\n\n useEffect(() => {\n if (embla && embla.selectedScrollSnap() !== current) {\n embla.scrollTo(current, true);\n }\n }, [embla, current]);\n\n useEffect(() => {\n const updateVisibility = () => {\n if (document.hidden) {\n freeze();\n }\n };\n const release = () => setDragging(false);\n updateVisibility();\n document.addEventListener(\"visibilitychange\", updateVisibility, true);\n window.addEventListener(\"pointerup\", release);\n window.addEventListener(\"pointercancel\", release);\n return () => {\n document.removeEventListener(\"visibilitychange\", updateVisibility, true);\n window.removeEventListener(\"pointerup\", release);\n window.removeEventListener(\"pointercancel\", release);\n };\n }, [freeze]);\n\n const selectPhoto = (next: number) => {\n embla?.scrollTo((next + count) % count, reducedMotion);\n reset();\n };\n\n useEffect(() => {\n const previousPhoto = keyboardPhoto.current;\n keyboardPhoto.current = null;\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Keyboard events assign this ref before the selected photo changes.\n if (previousPhoto && document.activeElement === previousPhoto) {\n galleryRef.current\n ?.querySelector<HTMLButtonElement>(\n '.lockerverse-auction-gallery__photo[tabindex=\"0\"]'\n )\n ?.focus({ preventScroll: true });\n }\n }, [current, galleryRef]);\n\n useEffect(() => {\n const strip = stripRef.current;\n const thumbnail = thumbnailRefs.current[current];\n // biome-ignore lint/suspicious/noUnnecessaryConditions: React assigns the element ref after mounting.\n if (!(strip && thumbnail)) {\n return;\n }\n const stripBounds = strip.getBoundingClientRect();\n const photoBounds = thumbnail.getBoundingClientRect();\n if (photoBounds.left < stripBounds.left) {\n strip.scrollLeft -= stripBounds.left - photoBounds.left;\n } else if (photoBounds.right > stripBounds.right) {\n strip.scrollLeft += photoBounds.right - stripBounds.right;\n }\n }, [current, count]);\n\n return (\n // biome-ignore lint/a11y/noNoninteractiveElementInteractions: The gallery handles keys from its focusable photo and navigation buttons.\n <section\n aria-label={`${name} photos`}\n className=\"lockerverse-auction-gallery\"\n onBlurCapture={(event) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setKeyboardFocused(false);\n }\n }}\n onFocusCapture={(event) =>\n setKeyboardFocused(event.target.matches(\":focus-visible\"))\n }\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n if (\n event.target instanceof HTMLButtonElement &&\n event.target.classList.contains(\n \"lockerverse-auction-gallery__photo\"\n )\n ) {\n keyboardPhoto.current = event.target;\n }\n selectPhoto(current + (event.key === \"ArrowRight\" ? 1 : -1));\n }\n }}\n onPointerEnter={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(true);\n }\n }}\n onPointerLeave={(event) => {\n if (event.pointerType === \"mouse\") {\n setHovered(false);\n }\n }}\n ref={galleryRef}\n >\n {count ? (\n <div\n className=\"lockerverse-auction-gallery__stage\"\n onPointerEnter={showControls}\n onPointerLeave={scheduleControlsHide}\n onPointerMove={showControls}\n >\n <div\n className=\"lockerverse-auction-gallery__viewport\"\n onPointerDownCapture={() => {\n freeze();\n setDragging(true);\n }}\n ref={viewportRef}\n >\n <div className=\"lockerverse-auction-gallery__track\">\n {photos.map((photo, photoIndex) => (\n <div\n aria-hidden={photoIndex !== current}\n className=\"lockerverse-auction-gallery__slide\"\n key={`${photo}-${photoIndex}`}\n >\n <button\n aria-label={`View photo ${photoIndex + 1} of ${name} at full size`}\n className=\"lockerverse-auction-gallery__photo\"\n onClick={() => {\n onExpand(photoIndex);\n }}\n ref={photoIndex === current ? photoButtonRef : undefined}\n tabIndex={photoIndex === current ? 0 : -1}\n type=\"button\"\n >\n <AuctionImage\n alt={`${name}, ${photoIndex + 1} of ${count}`}\n className=\"lockerverse-auction-gallery__image\"\n draggable={false}\n fetchPriority={photoIndex === 0 ? \"high\" : \"auto\"}\n height={900}\n loading={photoIndex === current ? \"eager\" : \"lazy\"}\n maxWidth={1920}\n sizes={\n photoIndex === current\n ? imageSizes\n : `auto, ${imageSizes}`\n }\n src={photo}\n width={1200}\n />\n </button>\n </div>\n ))}\n </div>\n </div>\n {count > 1 && !reducedMotion && (\n <div className=\"lockerverse-auction-gallery__rotation\">\n <div\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__progress-track\"\n >\n <div\n className=\"lockerverse-auction-gallery__progress\"\n ref={progressRef}\n style={{ transform: \"scaleX(0)\" }}\n />\n </div>\n <button\n aria-label={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n className={`lockerverse-auction-gallery__play ${controlsFade}`}\n data-gallery-control\n onClick={() => setUserPaused((value) => !value)}\n title={\n userPaused ? \"Play photo rotation\" : \"Pause photo rotation\"\n }\n type=\"button\"\n >\n {userPaused ? (\n <Play aria-hidden=\"true\" size={13} />\n ) : (\n <Pause aria-hidden=\"true\" size={13} />\n )}\n </button>\n </div>\n )}\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className={`lockerverse-auction-gallery__previous ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current - 1)}\n type=\"button\"\n >\n <ChevronLeft\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n <button\n aria-label=\"Next photo\"\n className={`lockerverse-auction-gallery__next ${controlsFade}`}\n data-gallery-control\n onClick={() => selectPhoto(current + 1)}\n type=\"button\"\n >\n <ChevronRight\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__chevron\"\n />\n </button>\n </>\n )}\n </div>\n ) : (\n <div className=\"lockerverse-auction-gallery__empty\">\n No photo available\n </div>\n )}\n {count > 1 && (\n <section\n aria-label=\"Choose a photo\"\n className=\"lockerverse-auction-gallery__strip\"\n ref={stripRef}\n >\n <div className=\"lockerverse-auction-gallery__thumbnails\">\n {photos.map((photo, photoIndex) => (\n <button\n aria-label={`Show photo ${photoIndex + 1} of ${count}`}\n aria-pressed={current === photoIndex}\n className={`lockerverse-auction-gallery__thumbnail ${current === photoIndex ? \"is-selected\" : \"\"}`}\n key={`${photo}-${photoIndex}`}\n onClick={() => selectPhoto(photoIndex)}\n ref={(element) => {\n thumbnailRefs.current[photoIndex] = element;\n }}\n type=\"button\"\n >\n <AuctionImage\n alt=\"\"\n className=\"lockerverse-auction-gallery__thumbnail-image\"\n height={66}\n loading=\"lazy\"\n maxWidth={192}\n sizes=\"88px\"\n src={photo}\n width={88}\n />\n </button>\n ))}\n </div>\n </section>\n )}\n </section>\n );\n}\n","import { Dialog } from \"@base-ui/react/dialog\";\nimport { ChevronLeft, ChevronRight, X as Close } from \"lucide-react\";\nimport { useRef, useState } from \"react\";\nimport { AuctionImage } from \"./auction-image.tsx\";\nimport { AuctionPhotoFilmstrip } from \"./auction-photo-filmstrip\";\n\nexport function AuctionGallery({\n images,\n fallbackImage,\n name,\n imageSizes,\n}: {\n images: readonly string[];\n fallbackImage?: string | null;\n name: string;\n imageSizes?: string | undefined;\n}) {\n const photos = [...new Set(images.filter(Boolean))];\n if (!photos.length && fallbackImage) {\n photos.push(fallbackImage);\n }\n const [index, setIndex] = useState(0);\n const [open, setOpen] = useState(false);\n const opener = useRef<HTMLButtonElement | null>(null);\n const swipeStart = useRef<{ x: number; y: number } | null>(null);\n const count = photos.length;\n const selected = count ? ((index % count) + count) % count : 0;\n\n return (\n <>\n <AuctionPhotoFilmstrip\n imageSizes={imageSizes}\n name={name}\n onExpand={(next) => {\n setIndex(next);\n setOpen(true);\n }}\n onSelect={setIndex}\n paused={open}\n photoButtonRef={opener}\n photos={photos}\n selected={selected}\n />\n {count > 0 && (\n <Dialog.Root onOpenChange={setOpen} open={open}>\n <Dialog.Portal>\n <Dialog.Backdrop className=\"lockerverse-auction-gallery__backdrop\" />\n <Dialog.Popup\n aria-describedby={undefined}\n className=\"lockerverse-auction-gallery__viewer\"\n finalFocus={opener}\n onKeyDown={(event) => {\n if (\n count < 2 ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n event.preventDefault();\n setIndex(\n (selected + (event.key === \"ArrowRight\" ? 1 : -1) + count) %\n count\n );\n }\n }}\n >\n <Dialog.Title className=\"lockerverse-auction-gallery__sr-only\">\n {name} · Photo {selected + 1} of {count}\n </Dialog.Title>\n <div\n className=\"lockerverse-auction-gallery__full-image\"\n onTouchCancel={() => {\n swipeStart.current = null;\n }}\n onTouchEnd={(event) => {\n const start = swipeStart.current;\n swipeStart.current = null;\n const end = event.changedTouches.item(0);\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Touch start assigns the shared ref before this event.\n if (!(start && end) || count < 2) {\n return;\n }\n const dx = end.clientX - start.x;\n const dy = end.clientY - start.y;\n if (Math.abs(dx) >= 45 && Math.abs(dx) > Math.abs(dy) * 1.3) {\n setIndex((selected + (dx < 0 ? 1 : -1) + count) % count);\n }\n }}\n onTouchMove={(event) => {\n if (event.touches.length !== 1) {\n swipeStart.current = null;\n }\n }}\n onTouchStart={(event) => {\n const touch = event.touches.item(0);\n swipeStart.current =\n event.touches.length === 1 && touch\n ? { x: touch.clientX, y: touch.clientY }\n : null;\n }}\n >\n <AuctionImage\n alt={`${name}, ${selected + 1} of ${count}`}\n height={900}\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[selected]}\n width={1200}\n />\n {open && count > 1 && (\n <AuctionImage\n alt=\"\"\n aria-hidden=\"true\"\n className=\"lockerverse-auction-gallery__preload\"\n height={900}\n loading=\"eager\"\n maxWidth={1920}\n sizes=\"100vw\"\n src={photos[(selected + 1) % count]}\n width={1200}\n />\n )}\n </div>\n <Dialog.Close\n aria-label=\"Close photo viewer\"\n className=\"lockerverse-auction-gallery__viewer-close\"\n >\n <Close aria-hidden=\"true\" size={22} />\n </Dialog.Close>\n {count > 1 && (\n <>\n <button\n aria-label=\"Previous photo\"\n className=\"lockerverse-auction-gallery__viewer-previous\"\n onClick={() => setIndex((selected - 1 + count) % count)}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={28} />\n </button>\n <button\n aria-label=\"Next photo\"\n className=\"lockerverse-auction-gallery__viewer-next\"\n onClick={() => setIndex((selected + 1) % count)}\n type=\"button\"\n >\n <ChevronRight aria-hidden=\"true\" size={28} />\n </button>\n </>\n )}\n </Dialog.Popup>\n </Dialog.Portal>\n </Dialog.Root>\n )}\n </>\n );\n}\n","import type {\n LockerverseAuction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ChevronDown,\n Clock3,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useId, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionGallery } from \"./auction-gallery.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst itemHeadingTags = { 1: \"h1\", 2: \"h2\" } as const;\n\nfunction metricIcon(label: string | undefined) {\n if (label === \"Buy Now\") {\n return <ShieldCheck aria-hidden=\"true\" size={16} />;\n }\n if (label === \"Available\" || label === \"Increment\") {\n return <TimerReset aria-hidden=\"true\" size={16} />;\n }\n return <Gavel aria-hidden=\"true\" size={16} />;\n}\nfunction itemMetrics(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (item.saleMode === \"buy_now\") {\n return [\n [\"Buy Now\", formatMoney(item.buyNowPriceAmount ?? 0)],\n [\n \"Available\",\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n ],\n ];\n }\n if (status === \"finished\") {\n return [\n [\n \"Final bid\",\n item.maxBidAmount ? formatMoney(item.maxBidAmount) : \"No bids\",\n ],\n ];\n }\n return [\n [\"Current bid\", formatMoney(item.maxBidAmount ?? 0)],\n [\"Floor\", formatMoney(item.minBidAmount ?? 0)],\n [\"Increment\", formatMoney(item.bidIncrementAmount ?? 100)],\n ];\n}\nexport function AuctionItemDetails({\n auction,\n item,\n itemHeadingLevel = 2,\n galleryImageSizes,\n}: {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n galleryImageSizes?: string | undefined;\n}) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const [expanded, setExpanded] = useState(false);\n const descriptionId = useId();\n const status = getAuctionDisplayStatus(auction, item);\n const boundaryLabel = {\n active: \"Closes\",\n draft: \"Opens\",\n finished: \"Closed\",\n }[status];\n const boundary = formatAuctionBoundary(auction, status, item);\n const buyNow = item.saleMode === \"buy_now\";\n const longDescription = (item.description ?? \"\").trim().length > 240;\n const metrics = itemMetrics(item, status);\n const ItemHeading = itemHeadingTags[itemHeadingLevel];\n return (\n <section className=\"lockerverse-auctions__item-summary\">\n <AuctionGallery\n fallbackImage={\n item.image ??\n auction.configuration.image ??\n auction.community?.banner ??\n auction.community?.thumbnail ??\n null\n }\n imageSizes={galleryImageSizes}\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__item-copy\">\n <ItemHeading>{item.name}</ItemHeading>\n {item.description ? (\n <div className=\"lockerverse-auctions__item-description\">\n <AuctionDescription\n className={\n !expanded && longDescription\n ? \"lockerverse-auctions__description-clamped\"\n : undefined\n }\n description={item.description}\n id={descriptionId}\n />\n {longDescription ? (\n <button\n aria-controls={descriptionId}\n aria-expanded={expanded}\n className=\"lockerverse-auctions__description-toggle\"\n onClick={() => setExpanded(!expanded)}\n type=\"button\"\n >\n {expanded ? \"Hide description\" : \"Read full description\"}{\" \"}\n <ChevronDown\n aria-hidden=\"true\"\n size={16}\n style={{ transform: expanded ? \"rotate(180deg)\" : undefined }}\n />\n </button>\n ) : null}\n </div>\n ) : null}\n <dl className=\"lockerverse-auctions__stat-panel\">\n {metrics.map(([label, value]) => (\n <div className=\"lockerverse-auctions__stat-row\" key={label}>\n <dt>\n {metricIcon(label)}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n ))}\n <div className=\"lockerverse-auctions__stat-row\">\n <dt>\n <Clock3 aria-hidden=\"true\" size={16} />\n {boundaryLabel}\n </dt>\n <dd className=\"lockerverse-auctions__stat-date\">{boundary}</dd>\n </div>\n {!buyNow && status === \"finished\" ? (\n <div className=\"lockerverse-auctions__stat-footer\">\n <div>\n <dt>Floor</dt>\n <dd>{formatMoney(item.minBidAmount ?? 0)}</dd>\n </div>\n <div>\n <dt>Bid increment</dt>\n <dd>{formatMoney(item.bidIncrementAmount ?? 100)}</dd>\n </div>\n </div>\n ) : null}\n </dl>\n </div>\n </section>\n );\n}\n","import {\n getLockerverseAuctionMinimumBid,\n type LockerverseAuction,\n type LockerverseAuctionItem,\n type LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight } from \"lucide-react\";\nimport { type FormEvent, useId, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport {\n type AuctionSelection,\n getAuctionSelectionError,\n getAuctionSelectionPricing,\n} from \"./auction-payment.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nconst selectionHeadingTags = { 1: \"h2\", 2: \"h3\" } as const;\n\nconst WHOLE_NUMBER = /^\\d+$/;\n\ntype SelectionProps = {\n auction: LockerverseAuction;\n item: LockerverseAuctionItem;\n itemHeadingLevel?: 1 | 2 | undefined;\n initialSelection: AuctionSelection | null;\n onContinue: (selection: AuctionSelection) => void;\n onError: (message: string) => void;\n onBack?: (() => void) | undefined;\n backHref?: string | undefined;\n};\n\nfunction quantitySummary(value: string, item: LockerverseAuctionItem) {\n const quantity = Number(value);\n const subtotal = quantity * (item.buyNowPriceAmount ?? 0);\n if (\n !(WHOLE_NUMBER.test(value) && Number.isSafeInteger(subtotal)) ||\n quantity < 1\n ) {\n return \"Enter a whole-number quantity.\";\n }\n if (!item.additionalCharge) {\n return `Total: ${formatMoney(subtotal)}`;\n }\n const charge =\n item.additionalCharge.firstUnitAmountCents +\n item.additionalCharge.additionalUnitAmountCents * (quantity - 1);\n const total = subtotal + charge;\n if (!Number.isSafeInteger(total)) {\n return \"Enter a valid quantity.\";\n }\n return `Subtotal: ${formatMoney(subtotal)} · ${item.additionalCharge.name}: ${formatMoney(charge)} · Total: ${formatMoney(total)}`;\n}\nfunction selectionInitialValue(\n buyNow: boolean,\n initial: AuctionSelection | null,\n minimum: number\n) {\n if (buyNow) {\n return String(initial ? initial.quantity : 1);\n }\n return String(initial ? initial.amount / 100 : minimum);\n}\nfunction readOnlyTitle(\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"This item is sold out.\";\n }\n if (status === \"draft\") {\n return \"This item is not open yet.\";\n }\n if (status === \"finished\") {\n return item.saleMode === \"buy_now\"\n ? \"Purchases are closed for this item.\"\n : \"Bidding is closed for this item.\";\n }\n return \"This item is not available.\";\n}\nfunction readOnlyDescription(\n auction: LockerverseAuction,\n item: LockerverseAuctionItem,\n status: LockerverseAuctionStatus\n) {\n if (isAuctionItemSoldOut(item)) {\n return \"All available quantities have been purchased.\";\n }\n if (status === \"draft\") {\n return `This item opens ${formatAuctionBoundary(auction, \"draft\", item)}.`;\n }\n return item.saleMode === \"buy_now\"\n ? \"This item is no longer available to purchase.\"\n : \"Bidding has closed for this item.\";\n}\nfunction selectionFromInput(\n auction: LockerverseAuction,\n buyNow: boolean,\n initialSelection: AuctionSelection | null,\n value: string\n): AuctionSelection {\n return {\n amount: buyNow ? 0 : Number(value) * 100,\n includeServiceFee: initialSelection\n ? initialSelection.includeServiceFee\n : auction.serviceFeeEnabled && auction.serviceFeeDefaultChecked,\n quantity: buyNow ? Number(value) : 1,\n };\n}\nexport function AuctionItemSelection({\n auction,\n item,\n initialSelection,\n onContinue,\n onError,\n onBack,\n backHref,\n itemHeadingLevel = 2,\n}: SelectionProps) {\n const SelectionHeading = selectionHeadingTags[itemHeadingLevel];\n const buyNow = item.saleMode === \"buy_now\";\n const minimum = Math.ceil(getLockerverseAuctionMinimumBid(item) / 100);\n const [value, setValue] = useState(\n selectionInitialValue(buyNow, initialSelection, minimum)\n );\n const [error, setError] = useState<string | null>(null);\n const id = useId();\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const open =\n status === \"active\" &&\n !isAuctionItemSoldOut(item) &&\n item.saleMode !== \"hybrid\";\n function continueToPayment(event: FormEvent<HTMLFormElement>) {\n event.preventDefault();\n if (!WHOLE_NUMBER.test(value)) {\n setError(\n buyNow\n ? \"Enter a whole-number quantity.\"\n : \"Enter a whole-dollar bid amount.\"\n );\n return;\n }\n const selection = selectionFromInput(\n auction,\n buyNow,\n initialSelection,\n value\n );\n const message = getAuctionSelectionError(auction, item, selection);\n if (message) {\n setError(message);\n onError(message);\n return;\n }\n try {\n getAuctionSelectionPricing(auction, item, selection);\n } catch {\n setError(\"Enter a valid amount or quantity.\");\n return;\n }\n onContinue(selection);\n }\n if (!open) {\n return (\n <div className=\"lockerverse-auctions__selection lockerverse-auctions__read-only\">\n <p className=\"lockerverse-auctions__eyebrow\">Item status</p>\n <SelectionHeading>{readOnlyTitle(item, status)}</SelectionHeading>\n <p>{readOnlyDescription(auction, item, status)}</p>\n <AuctionBackAction\n className=\"lockerverse-auctions__button\"\n href={backHref}\n onBack={onBack}\n >\n Browse auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n </div>\n );\n }\n return (\n <form\n className=\"lockerverse-auctions__selection\"\n onSubmit={continueToPayment}\n >\n <SelectionHeader\n buyNow={buyNow}\n headingTag={SelectionHeading}\n item={item}\n minimum={minimum}\n />\n <div className=\"lockerverse-auctions__selection-body\">\n <label className=\"lockerverse-auctions__field\" htmlFor={id}>\n {buyNow ? \"Quantity\" : \"Your bid amount\"}\n <span className=\"lockerverse-auctions__amount-control\">\n {buyNow ? null : <span aria-hidden=\"true\">$</span>}\n <input\n aria-describedby={`${id}-help`}\n aria-invalid={Boolean(error)}\n autoComplete=\"off\"\n id={id}\n inputMode=\"numeric\"\n onChange={(event) => {\n setValue(event.target.value);\n setError(null);\n }}\n placeholder={buyNow ? \"1\" : String(minimum)}\n required\n value={value}\n />\n </span>\n </label>\n {error ? <p role=\"alert\">{error}</p> : null}\n <p id={`${id}-help`}>\n {buyNow\n ? quantitySummary(value, item)\n : `Enter a whole-dollar bid of at least ${formatMoney(minimum * 100)}. Bid increment: ${formatMoney(item.bidIncrementAmount ?? 100)}.`}\n </p>\n <BidAdditionalCharge item={item} />\n <div className=\"lockerverse-auctions__selection-footer\">\n <p>\n {buyNow\n ? \"Continuing moves you into secure checkout where your payment is processed immediately.\"\n : \"Continuing moves you into the secure payment step where your card is stored for settlement only if your bid wins.\"}\n </p>\n <button\n className=\"lockerverse-auctions__button\"\n disabled={!auction.payment}\n type=\"submit\"\n >\n {buyNow ? \"Continue to Checkout\" : \"Continue to Payment\"}{\" \"}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </button>\n </div>\n {auction.payment ? null : (\n <p role=\"alert\">Payments are not configured for this auction.</p>\n )}\n </div>\n </form>\n );\n}\n\nfunction SelectionHeader({\n headingTag: SelectionHeading,\n item,\n buyNow,\n minimum,\n}: {\n item: LockerverseAuctionItem;\n buyNow: boolean;\n minimum: number;\n headingTag: \"h2\" | \"h3\";\n}) {\n return (\n <div className=\"lockerverse-auctions__selection-header\">\n <p className=\"lockerverse-auctions__eyebrow\">Step 1 of 2</p>\n <SelectionHeading>\n {buyNow ? \"Buy this item now.\" : \"Place your bid.\"}\n </SelectionHeading>\n <p>\n {buyNow\n ? \"Choose how many you want, then complete the secure checkout.\"\n : \"Enter the bid amount you want to place for this item. You are only charged if this bid wins after bidding closes.\"}\n </p>\n <p>\n {buyNow ? \"Price: \" : \"Minimum qualifying bid: \"}\n <strong>\n {formatMoney(buyNow ? (item.buyNowPriceAmount ?? 0) : minimum * 100)}\n </strong>\n </p>\n {buyNow && item.availableQuantity !== null ? (\n <p>{item.availableQuantity} available</p>\n ) : null}\n {item.collectShippingAddress ? (\n <p>\n The next step will also collect a delivery address for seller\n fulfillment.\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction BidAdditionalCharge({ item }: { item: LockerverseAuctionItem }) {\n if (item.saleMode === \"buy_now\" || !item.additionalCharge) {\n return null;\n }\n return (\n <p>\n {item.additionalCharge.name}:{\" \"}\n {formatMoney(item.additionalCharge.firstUnitAmountCents)} will be added to\n your winning bid.\n </p>\n );\n}\n","import { type ComponentType, useEffect, useState } from \"react\";\nimport type { AuctionPaymentProps } from \"./auction-payment-view.tsx\";\n\n/** Keep checkout dependencies out of the server-rendered item and catalog. */\nexport function AuctionPaymentLoader(props: AuctionPaymentProps) {\n const [PaymentView, setPaymentView] =\n useState<ComponentType<AuctionPaymentProps> | null>(null);\n const [failed, setFailed] = useState(false);\n const locked = Boolean(props.resumePurchase || props.interactionLocked);\n\n useEffect(() => {\n let active = true;\n import(\"./auction-payment-view.tsx\").then(\n ({ AuctionPayment }) => {\n if (active) {\n setPaymentView(() => AuctionPayment);\n }\n },\n () => {\n if (active) {\n setFailed(true);\n }\n }\n );\n return () => {\n active = false;\n };\n }, []);\n\n if (PaymentView) {\n return <PaymentView {...props} />;\n }\n return (\n <div>\n <p role={failed ? \"alert\" : \"status\"}>\n {failed\n ? \"Payment details could not load.\"\n : \"Loading secure payment details…\"}\n </p>\n {failed && locked && (\n <p>\n Your purchase status is not confirmed. Keep this page open and contact\n the auction organizer before you try another purchase.\n </p>\n )}\n {locked ? null : (\n <button onClick={props.onBack} type=\"button\">\n Back to item\n </button>\n )}\n {failed && !locked && (\n <button onClick={() => window.location.reload()} type=\"button\">\n Reload page to try again\n </button>\n )}\n </div>\n );\n}\n","import type {\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuction,\n} from \"@lockerverse/sdk/auctions\";\nimport {\n ArrowRight,\n ChevronLeft,\n Gavel,\n ShieldCheck,\n TimerReset,\n} from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { AuctionBackAction } from \"./auction-back-action.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { AuctionImageMediaBase } from \"./auction-image.tsx\";\nimport { AuctionItemDetails } from \"./auction-item-details.tsx\";\nimport { AuctionItemSelection } from \"./auction-item-selection.tsx\";\nimport type { LockerverseAuctionItemProps } from \"./auction-item-types.ts\";\nimport type { AuctionSelection } from \"./auction-payment.ts\";\nimport { AuctionPaymentLoader } from \"./auction-payment-loader.tsx\";\nimport {\n type LockerverseAuctionOutcome,\n LockerverseAuctionResult,\n type LockerverseAuctionResultAction,\n} from \"./auction-result.tsx\";\nimport { notifyHostCallback } from \"./host-callback.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nfunction AuctionProgress({ buyNow }: { buyNow: boolean }) {\n return (\n <div className=\"lockerverse-auctions__progress\">\n <span>\n {buyNow ? (\n <ShieldCheck aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )}\n {buyNow ? \"Choose quantity\" : \"Place bid\"}\n </span>\n <span>\n <ShieldCheck aria-hidden=\"true\" size={16} />\n {buyNow ? \"Pay securely\" : \"Secure card\"}\n </span>\n <span>\n <TimerReset aria-hidden=\"true\" size={16} />\n {buyNow ? \"Get confirmation\" : \"Wait for close\"}\n </span>\n </div>\n );\n}\n\nfunction AuctionItemResult(\n props: LockerverseAuctionItemProps & {\n item: AuctionItem;\n outcome: LockerverseAuctionOutcome;\n }\n) {\n const { auction, item, outcome } = props;\n let auctionAction: LockerverseAuctionResultAction | undefined;\n if (props.backHref) {\n auctionAction = { href: props.backHref, label: \"View auction items\" };\n } else if (props.onBack) {\n auctionAction = { label: \"View auction items\", onClick: props.onBack };\n }\n return (\n <LockerverseAuctionResult\n auctionName={auction.name}\n className={props.className}\n closesAtLabel={formatAuctionBoundary(auction, \"active\", item)}\n communityName={props.communityName ?? auction.community?.name}\n focusHeading\n imageUrl={\n item.image ?? item.images[0] ?? auction.configuration.image ?? undefined\n }\n itemName={item.name}\n outcome={outcome}\n primaryAction={\n props.returnToItemHref\n ? { href: props.returnToItemHref, label: \"Return to item\" }\n : auctionAction\n }\n secondaryAction={props.returnToItemHref ? auctionAction : undefined}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...props.style,\n }}\n theme={props.theme}\n />\n );\n}\n\nfunction AuctionItemView(props: LockerverseAuctionItemProps) {\n const {\n auction: initialAuction,\n itemId,\n resumePurchase,\n className,\n theme = \"dark\",\n style,\n } = props;\n const appearanceRoot = useRef<HTMLElement | null>(null);\n const [auction, setAuction] = useState(initialAuction);\n const acceptedHost = useRef(initialAuction);\n const item =\n auction.items.find((candidate) => candidate.id === itemId) ??\n resumePurchase?.item;\n useAuctionBoundary(\n item?.startAt ?? auction.startAt,\n item?.endAt ?? auction.endAt\n );\n const [selection, setSelection] = useState<AuctionSelection | null>(() =>\n resumePurchase\n ? {\n amount: 0,\n includeServiceFee:\n resumePurchase.submission.includeServiceFee ?? false,\n quantity: resumePurchase.submission.quantity,\n }\n : null\n );\n const [interactionLocked, setInteractionLocked] = useState(\n Boolean(resumePurchase)\n );\n const viewMounted = useRef<boolean>(true);\n const hostCallbacks = useRef(props);\n hostCallbacks.current = props;\n const reportedLock = useRef<boolean | null>(null);\n const updateInteractionLock = useCallback((locked: boolean) => {\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Effect cleanup changes this ref outside the callback.\n if (viewMounted.current) {\n setInteractionLocked(locked);\n }\n if (reportedLock.current !== locked) {\n reportedLock.current = locked;\n notifyHostCallback(hostCallbacks.current.onInteractionLockChange, locked);\n }\n }, []);\n const hasRecovery = Boolean(resumePurchase);\n useEffect(() => {\n viewMounted.current = true;\n updateInteractionLock(hasRecovery);\n return () => {\n viewMounted.current = false;\n };\n }, [hasRecovery, updateInteractionLock]);\n const [contact, setContact] = useState({ email: \"\", phone: \"\" });\n const [paying, setPaying] = useState(Boolean(resumePurchase));\n const [notice, setNotice] = useState<string | null>(null);\n const [outcome, setOutcome] = useState<LockerverseAuctionOutcome | null>(\n null\n );\n\n useEffect(() => {\n if (\n !(paying || interactionLocked || resumePurchase) &&\n acceptedHost.current !== initialAuction\n ) {\n acceptedHost.current = initialAuction;\n setAuction(initialAuction);\n }\n }, [initialAuction, paying, interactionLocked, resumePurchase]);\n\n function review(current: LockerverseAuction, message: string) {\n updateInteractionLock(false);\n // The checkout just fetched this snapshot. Do not restore an older host\n // snapshot that arrived while payment was open; accept its next refresh.\n acceptedHost.current = hostCallbacks.current.auction;\n setAuction(current);\n setSelection(null);\n setPaying(false);\n setNotice(message);\n }\n function continueToPayment(next: AuctionSelection) {\n setNotice(null);\n setSelection(next);\n setPaying(true);\n }\n if (!item) {\n return (\n <div>\n <p role=\"alert\">This auction item is no longer available.</p>\n <AuctionBackAction href={props.backHref} onBack={props.onBack}>\n Back to auction items\n </AuctionBackAction>\n </div>\n );\n }\n if (outcome) {\n return (\n <AuctionItemResult\n {...props}\n auction={auction}\n item={item}\n outcome={outcome}\n />\n );\n }\n return (\n <section\n className={[\"lockerverse-auctions\", className].filter(Boolean).join(\" \")}\n data-lockerverse-theme={theme}\n ref={appearanceRoot}\n style={{\n \"--lockerverse-accent\": auction.community?.color ?? \"#6f8f6d\",\n ...style,\n }}\n >\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n <ChevronLeft aria-hidden=\"true\" size={16} /> All items\n </AuctionBackAction>\n )}\n <div className=\"lockerverse-auctions__detail\">\n <AuctionItemDetails\n auction={auction}\n galleryImageSizes={props.galleryImageSizes}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n />\n <div className=\"lockerverse-auctions__transaction\">\n {getAuctionDisplayStatus(auction, item) === \"active\" ? (\n <AuctionProgress buyNow={item.saleMode === \"buy_now\"} />\n ) : null}\n {notice ? (\n <p className=\"lockerverse-auctions__notice\" role=\"alert\">\n {notice}\n </p>\n ) : null}\n {paying && selection ? (\n <AuctionPaymentLoader\n {...props}\n appearanceRoot={appearanceRoot}\n auction={auction}\n communityName={props.communityName ?? auction.community?.name}\n contact={contact}\n interactionLocked={interactionLocked}\n item={item}\n onBack={() => setPaying(false)}\n onContactChange={setContact}\n onIncludeServiceFeeChange={(includeServiceFee) =>\n setSelection((current) =>\n current\n ? {\n ...current,\n includeServiceFee:\n auction.serviceFeeEnabled && includeServiceFee,\n }\n : current\n )\n }\n onInteractionLockChange={updateInteractionLock}\n onResult={setOutcome}\n onReview={review}\n selection={selection}\n />\n ) : (\n <AuctionItemSelection\n auction={auction}\n backHref={props.backHref}\n initialSelection={selection}\n item={item}\n itemHeadingLevel={props.itemHeadingLevel}\n onBack={props.onBack}\n onContinue={continueToPayment}\n onError={setNotice}\n />\n )}\n {interactionLocked ? null : (\n <AuctionBackAction\n className=\"lockerverse-auctions__footer-back\"\n href={props.backHref}\n onBack={props.onBack}\n >\n Back to auction items <ArrowRight aria-hidden=\"true\" size={16} />\n </AuctionBackAction>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nexport function LockerverseAuctionItem(props: LockerverseAuctionItemProps) {\n const identity = useRef({\n auctionId: props.auction.id,\n client: props.client,\n itemId: props.itemId,\n });\n if (\n identity.current.client !== props.client ||\n identity.current.auctionId !== props.auction.id ||\n identity.current.itemId !== props.itemId\n ) {\n throw new TypeError(\n \"Auction item identity cannot change. Remount with a new React key.\"\n );\n }\n if (\n props.resumePurchase &&\n (props.resumePurchase.auctionId !== props.auction.id ||\n props.resumePurchase.itemId !== props.itemId ||\n props.resumePurchase.item.id !== props.itemId ||\n props.resumePurchase.item.auctionId !== props.auction.id)\n ) {\n throw new TypeError(\n \"The purchase recovery record belongs to a different auction item.\"\n );\n }\n // Keep the view mounted when a refreshed host snapshot removes the item.\n // Its transaction snapshot remains authoritative until it is safe to leave.\n return (\n <AuctionImageMediaBase.Provider value={props.auction.mediaBaseUrl}>\n <AuctionItemView {...props} />\n </AuctionImageMediaBase.Provider>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{i as e}from"./use-auction-boundary.js";import{a as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./auction-payment.js";import{t as c}from"./host-callback.js";import{d as l,n as u,p as d,r as f,t as p,u as m}from"./phone-field.js";import{i as h,n as g,t as _}from"./stripe-loader.js";import{ArrowRight as v,ChevronLeft as y}from"lucide-react";import{useEffect as b,useId as x,useRef as S,useState as C}from"react";import{Fragment as w,jsx as T,jsxs as E}from"react/jsx-runtime";import{LockerverseSdkError as D}from"@lockerverse/sdk/auctions";import{AddressElement as O,Elements as k,PaymentElement as A,useElements as ee,useStripe as te}from"@stripe/react-stripe-js";function j(e){return{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},terms:{applePay:e?`auto`:`never`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:e?`auto`:`never`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:e?`auto`:`never`,googlePay:`never`}}}function ne(t){let{isPurchase:n,item:r,pricing:i,id:a}=t;return E(`form`,{className:`lockerverse-auctions__checkout`,noValidate:!0,onSubmit:t.onSubmit,children:[E(`div`,{className:`lockerverse-auctions__checkout-header`,children:[E(`div`,{className:`lockerverse-auctions__checkout-navigation`,children:[T(`button`,{"aria-label":`Back`,className:`lockerverse-auctions__checkout-back`,disabled:!t.onBack,onClick:t.onBack,type:`button`,children:T(y,{"aria-hidden":`true`,size:20})}),E(`div`,{children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Step 2 of 2`}),T(`p`,{children:n?`Secure checkout`:`Secure payment method`})]})]}),T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:t.communityName}),T(`h2`,{children:n?`Finalize your purchase.`:`Finalize your bid authorization.`}),T(`p`,{className:`lockerverse-auctions__checkout-summary`,children:n?E(w,{children:[`Pay `,T(`strong`,{children:e(i.totalCents)}),` for`,` `,t.quantity,` `,t.quantity===1?`item`:`items`,` of`,` `,T(`strong`,{children:r.name}),`. Your card is charged immediately once checkout succeeds.`]}):E(w,{children:[`Authorize a payment method for your bid of`,` `,T(`strong`,{children:e(i.subtotalCents)}),` on`,` `,T(`strong`,{children:r.name}),`. Your card is only charged if this bid wins the item.`]})}),r.collectShippingAddress&&E(`div`,{className:`lockerverse-auctions__checkout-physical`,children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Physical item`}),T(`p`,{children:`This item requires a delivery address. Billing details are used by default, and you can switch to a separate delivery address below if needed.`})]})]}),E(`div`,{className:`lockerverse-auctions__checkout-body`,children:[t.showFields&&E(`fieldset`,{disabled:t.locked,children:[E(`div`,{className:`lockerverse-auctions__checkout-contact`,children:[T(l,{error:t.contactErrors.email,id:`${a}-email`,label:`Email`,name:`email`,onChange:e=>t.onEmailChange(e.target.value),required:!0,value:t.email}),T(d,{error:t.contactErrors.phone,id:`${a}-phone`,label:`Phone`,children:T(p,{country:t.phoneCountry,error:t.contactErrors.phone,errorId:`${a}-phone-error`,id:`${a}-phone`,name:`phone`,onChange:t.onPhoneChange,required:!0,value:t.phone})})]}),E(`section`,{"aria-label":`Payment Information`,className:`lockerverse-auctions__checkout-section`,children:[E(`div`,{className:`lockerverse-auctions__checkout-section-heading`,children:[T(`h3`,{children:`Payment Information`}),T(`p`,{children:n?`Processed securely and charged immediately for this purchase.`:`Stored securely and charged only if your bid finishes on top.`})]}),T(A,{onLoadError:t.onPaymentLoadError,options:j(n)})]}),E(`section`,{"aria-label":`Billing Details`,className:`lockerverse-auctions__checkout-section`,children:[T(`h3`,{children:`Billing Details`}),T(O,{onChange:t.onBillingChange,options:{mode:`billing`}}),T(`p`,{children:n?`Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.`:`Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.`})]}),r.collectShippingAddress&&E(`section`,{"aria-label":`Delivery Details`,className:`lockerverse-auctions__checkout-section`,children:[E(`label`,{className:`lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery`,htmlFor:`${a}-delivery-same-as-billing`,children:[T(m,{checked:t.sameAsBilling,id:`${a}-delivery-same-as-billing`,onChange:e=>t.onSameAsBillingChange(e.target.checked)}),E(`span`,{children:[T(`strong`,{children:`Delivery address is the same as billing`}),T(`span`,{children:`Leave this on for the fastest flow. Turn it off only if the delivery address should differ from the billing details above.`})]})]}),!t.sameAsBilling&&E(w,{children:[T(`h3`,{children:`Delivery Address`}),T(O,{onChange:t.onShippingChange,options:{mode:`shipping`}})]})]}),T(N,{isPurchase:n,pricing:i}),t.serviceFeeEnabled&&T(M,{...t})]}),t.message&&T(`p`,{"aria-live":`polite`,className:`lockerverse-auctions__notice`,role:`status`,children:t.message}),!t.isTerminal&&E(`div`,{className:`lockerverse-auctions__checkout-footer`,children:[E(`p`,{children:[n?`By continuing, you agree to be charged for this purchase.`:`By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.`,r.collectShippingAddress?` Your delivery details are stored with the ${n?`order`:`bid`} so the seller can fulfill the item after payment.`:``]}),E(`button`,{className:`lockerverse-auctions__button lockerverse-auctions__checkout-submit`,disabled:t.submitDisabled,type:`submit`,children:[t.buttonText,T(v,{"aria-hidden":`true`,size:16})]})]})]})]})}function M(t){let{isPurchase:n,pricing:r}=t;return T(`section`,{"aria-label":`Processing fees`,className:`lockerverse-auctions__checkout-section`,children:t.onIncludeServiceFeeChange?E(`label`,{className:`lockerverse-auctions__checkout-checkbox`,htmlFor:`${t.id}-service-fee`,children:[T(m,{checked:t.includeServiceFee,id:`${t.id}-service-fee`,onChange:e=>t.onIncludeServiceFeeChange?.(e.target.checked)}),E(`span`,{children:[E(`strong`,{children:[n?`Add`:`If I win, add`,` `,e(t.serviceFeeCents),` to help cover processing fees`]}),E(`span`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})]})]}):E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})})}function N({pricing:t,isPurchase:n}){return t.additionalCharge?E(`section`,{"aria-label":`Order amounts`,className:`lockerverse-auctions__checkout-section`,children:[E(`p`,{children:[n?`Subtotal`:`Bid amount`,`:`,` `,e(t.subtotalCents)]}),E(`p`,{children:[t.additionalCharge.name,`:`,` `,e(t.additionalChargeCents??0)]}),E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(t.totalCents)]})]}):null}function re(e,t,n){return e===`busy`?n?`Processing...`:`Authorizing...`:e===`retry`?`Retry original purchase`:t?`Check purchase status`:n?`Buy Now`:`Authorize Bid`}function P(e){let{auction:l,item:d,selection:p,client:m,onReview:g,onBack:_}=e,v=te(),y=ee(),w=x(),[E,O]=C(e.contact?.email??``),[k,A]=C(e.contact?.phone??``),[j,M]=C(()=>f(e.contact?.phone??``)),[N,P]=C({}),[F,ie]=C(!0),[I,ae]=C(null),[oe,se]=C(null),[L,ce]=C(e.resumePurchase??null),[R,le]=C(e.resumePurchase?`pending`:`ready`),[ue,de]=C(null),z=S(e.resumePurchase?.submission.clientRequestId??null),B=R===`complete`||R===`uncertain`,V=S(!1),H=S(!0),U=S(e);U.current=e;let W=S(!1);function G(e){H.current&&le(e),c(U.current.onInteractionLockChange,e!==`ready`&&e!==`complete`)}function K(e){H.current&&de(e)}function q(e){G(e===`bid`?`uncertain`:`pending`),K(e===`bid`?`We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.`:`We could not confirm the purchase result. Check its status using the same purchase request.`),W.current||(W.current=!0,c(U.current.onUncertain,e))}b(()=>(H.current=!0,()=>{H.current=!1}),[]);let J=!!(L??e.resumePurchase)||d.saleMode===`buy_now`,Y=L?.pricing??e.resumePurchase?.pricing??t(l,d,p),fe=L?.payment??e.resumePurchase?.payment??l.payment;function X(e){H.current&&ce(e),c(U.current.onPurchaseRecoveryChange,e)}function Z(e){e.status===`paid`?(z.current=null,X(null),G(`complete`),c(U.current.onResult,{additionalCharge:e.additionalCharge??null,additionalChargeCents:e.additionalChargeCents??0,kind:`purchase`,purchaseId:e.purchaseId,quantity:e.quantity,serviceFeeCents:e.serviceFeeCents,status:`paid`,subtotalCents:e.subtotalCents,totalCents:e.totalCents,unitAmountCents:e.subtotalCents/e.quantity}),W.current||(W.current=!0,c(U.current.onPurchaseComplete,e))):e.status===`pending_payment`?(G(`pending`),K(`Your purchase is pending. Check its status before making another payment.`)):(z.current=null,X(null),G(`ready`),K(`This purchase is ${e.status.replaceAll(`_`,` `)}. You can start a new purchase.`))}function pe(){let e=u(k,j),t=h({email:E,phone:e},!0);return P(t.errors),t.value?{email:t.value.email,phone:e}:(document.getElementById(`${w}-${t.errors.email?`email`:`phone`}`)?.focus(),null)}function me(){let e=U.current.selection;if(p.quantity!==e.quantity||p.amount!==e.amount||p.includeServiceFee!==e.includeServiceFee)throw Error(`Your selection changed. Review the total before continuing.`)}async function he(e){if(!(J&&d.additionalCharge))return!0;let t=await m.getPurchaseQuote(l.slug,d.id,{includeServiceFee:p.includeServiceFee,quantity:p.quantity});return H.current?t.subtotalCents!==Y.subtotalCents||(t.additionalChargeCents??0)!==(Y.additionalChargeCents??0)||t.serviceFeeCents!==Y.serviceFeeCents||t.totalCents!==Y.totalCents||!o(t.additionalCharge,Y.additionalCharge)?(g(e,`The checkout details changed. Review them before continuing.`),!1):!0:!1}async function ge(e){if(!e)throw Error(`Check the contact fields below.`);if(!(v&&y&&l.payment))throw Error(`Payment details are still loading.`);let t=await m.load(l.slug);if(!H.current)return null;let r=t.items.find(e=>e.id===d.id);if(!r)return g(t,`This item is no longer available.`),null;let o=n(t,r,p);if(o||i(l,t,d,r,p))return g(t,o??`The checkout details changed. Review them before continuing.`),null;if(!await he(t))return null;let c=await a({billing:I,collectShippingAddress:d.collectShippingAddress,elements:y,email:e.email,phone:e.phone,shipping:F?I:oe,stripe:v});return H.current?(me(),{confirmationToken:c,email:e.email,includeServiceFee:p.includeServiceFee,phone:e.phone,...s(Y)}):null}async function _e(e){let t=await m.createBid(l.slug,d.id,{...e,amount:p.amount});if(t.requiresAction){if(!(H.current&&v)){q(`bid`);return}await r(v,t)}G(`complete`),c(U.current.onResult,{additionalCharge:t.additionalCharge??null,additionalChargeCents:t.additionalChargeCents??0,amountCents:t.subtotalCents,kind:`bid`,serviceFeeCents:t.serviceFeeCents,totalCents:t.totalCents}),W.current||(W.current=!0,c(U.current.onBidSubmitted,t))}async function Q(e,t){if(e.requiresAction){if(!(H.current&&v)){q(`purchase`);return}await r(v,e);let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);n?Z(n):(G(`pending`),K(`Payment status is not available yet. Check again shortly.`));return}Z(e),!H.current&&e.status===`pending_payment`&&q(`purchase`)}async function ve(e){let t=await m.getPurchaseStatus(l.slug,d.id,e.submission.clientRequestId);if(t)await Q(t,e);else{if(!H.current){q(`purchase`);return}G(`retry`),K(`No purchase is recorded yet. You can retry the original purchase with the same request ID.`)}}async function ye(e,t){let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);if(n){await Q(n,t);return}X(null),G(`ready`),K(`The purchase was rejected. Review the item and payment details before trying again. (${e.status??`validation`})`)}async function be(e,t,n,r){let i=t&&(!(e instanceof D)||e.recoveryRecommended);if(K(e instanceof Error?e.message:`Unable to complete this request.`),J&&n){if(!r&&e instanceof D&&!e.recoveryRecommended)try{await ye(e,n);return}catch{}q(`purchase`)}else i?q(`bid`):G(`ready`)}function xe(){return z.current??=globalThis.crypto.randomUUID(),z.current}function Se(){return H.current?!0:(L||(X(null),G(`ready`)),!1)}async function Ce(e,t){if(t){await ve(e);return}Se()&&await Q(await m.createPurchase(l.slug,d.id,e.submission),e)}let $=v&&y&&fe;function we(){if(V.current||B)return null;if(!$)return K(`Payment details are still loading.`),null;let e=L?null:pe();return L||e?{checkoutPayment:$,contact:e,retryOriginal:R===`retry`}:null}async function Te(e){e.preventDefault();let t=we();if(!t)return;let{contact:n,checkoutPayment:r,retryOriginal:i}=t;V.current=!0,W.current=!1,G(`busy`),K(null);let a=!1,o=L;try{if(!o){let e=await ge(n);if(!(e&&H.current)){G(`ready`);return}if(!J){a=!0,await _e(e);return}o=Object.freeze({auctionId:l.id,item:d,itemId:d.id,payment:Object.freeze({...r}),pricing:Y,submission:Object.freeze({...e,clientRequestId:xe(),paymentMethodTypes:Object.freeze([`card`]),quantity:p.quantity})}),X(o)}a=!0,await Ce(o,!!L&&!i)}catch(e){await be(e,a,o,L!==null&&!i)}finally{V.current=!1}}let Ee=re(R,L!==null,J),De=R!==`ready`;return T(ne,{buttonText:Ee,communityName:e.communityName??l.name,contactErrors:N,email:E,id:w,includeServiceFee:p.includeServiceFee,isPurchase:J,isTerminal:B,item:d,locked:De,message:ue,onBack:R===`ready`?_:void 0,onBillingChange:ae,onEmailChange:t=>{O(t),e.onContactChange?.({email:t,phone:u(k,j)})},onIncludeServiceFeeChange:e.onIncludeServiceFeeChange,onPaymentLoadError:()=>K(`Unable to load payment form.`),onPhoneChange:({value:t,country:n})=>{A(t),M(n),e.onContactChange?.({email:E,phone:u(t,n)})},onSameAsBillingChange:ie,onShippingChange:se,onSubmit:Te,phone:k,phoneCountry:j,pricing:Y,quantity:p.quantity,sameAsBilling:F,serviceFeeCents:L?Y.serviceFeeCents:t(l,d,{...p,includeServiceFee:l.serviceFeeEnabled}).serviceFeeCents,serviceFeeEnabled:l.serviceFeeEnabled,showFields:!(L||B),submitDisabled:R===`busy`||!v||!y})}function F(e){let{auction:n,item:r,selection:i,theme:a=`dark`,stripeLoader:o=_,style:s,onBack:c,resumePurchase:l}=e,[u,d]=C(null),[f,p]=C(!1),[m,h]=C(0),v=g(e.appearanceRoot,a,s,e.interactionLocked),y=l?.payment??n.payment;if(b(()=>{let e=!0;if(!y){p(!0);return}return Promise.resolve().then(()=>o(y.publishableKey,y.connectedAccountId?{stripeAccount:y.connectedAccountId}:void 0)).then(t=>{e&&(d(t),p(!t))},()=>{e&&p(!0)}),()=>{e=!1}},[y,o,m]),f)return E(`div`,{children:[T(`p`,{role:`alert`,children:`Payment details could not load.`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`}),T(`button`,{onClick:()=>{p(!1),d(null),h(e=>e+1)},type:`button`,children:`Try again`})]});if(!(u&&v))return E(`div`,{children:[T(`p`,{role:`status`,children:`Loading secure payment details…`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`})]});let x={mode:`setup`,setupFutureUsage:`off_session`};l?x={amount:l.pricing.totalCents,currency:`usd`,mode:`payment`}:r.saleMode===`buy_now`&&(x={amount:t(n,r,i).totalCents,currency:`usd`,mode:`payment`});let S={...x,appearance:v,currency:`usd`,paymentMethodTypes:[`card`],syncAddressCheckbox:`none`};return T(k,{options:S,stripe:u,children:T(P,{...e})})}export{F as AuctionPayment};
1
+ import{i as e}from"./use-auction-boundary.js";import{a as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./auction-payment.js";import{t as c}from"./host-callback.js";import{d as l,n as u,p as d,r as f,t as p,u as m}from"./phone-field.js";import{i as h,n as g,t as _}from"./stripe-loader.js";import{ArrowRight as v,ChevronLeft as y}from"lucide-react";import{useEffect as b,useId as x,useRef as S,useState as C}from"react";import{Fragment as w,jsx as T,jsxs as E}from"react/jsx-runtime";import{LockerverseSdkError as D}from"@lockerverse/sdk/auctions";import{AddressElement as O,Elements as k,PaymentElement as A,useElements as ee,useStripe as te}from"@stripe/react-stripe-js";function j(e){return{business:{name:`Lockerverse`},fields:{billingDetails:{address:`never`,email:`never`,name:`never`,phone:`never`}},terms:{applePay:e?`auto`:`never`,auBecsDebit:`never`,bancontact:`never`,card:`always`,cashapp:`never`,googlePay:`never`,ideal:`never`,paypal:e?`auto`:`never`,sepaDebit:`never`,sofort:`never`,usBankAccount:`never`},wallets:{applePay:e?`auto`:`never`,googlePay:`never`}}}function ne(t){let{isPurchase:n,item:r,pricing:i,id:a}=t;return E(`form`,{className:`lockerverse-auctions__checkout`,noValidate:!0,onSubmit:t.onSubmit,children:[E(`div`,{className:`lockerverse-auctions__checkout-header`,children:[E(`div`,{className:`lockerverse-auctions__checkout-navigation`,children:[T(`button`,{"aria-label":`Back`,className:`lockerverse-auctions__checkout-back`,disabled:!t.onBack,onClick:t.onBack,type:`button`,children:T(y,{"aria-hidden":`true`,size:20})}),E(`div`,{children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Step 2 of 2`}),T(`p`,{children:n?`Secure checkout`:`Secure payment method`})]})]}),T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:t.communityName}),T(`h2`,{children:n?`Finalize your purchase.`:`Finalize your bid authorization.`}),T(`p`,{className:`lockerverse-auctions__checkout-summary`,children:n?E(w,{children:[`Pay `,T(`strong`,{children:e(i.totalCents)}),` for`,` `,t.quantity,` `,t.quantity===1?`item`:`items`,` of`,` `,T(`strong`,{children:r.name}),`. Your card is charged immediately once checkout succeeds.`]}):E(w,{children:[`Authorize a payment method for your bid of`,` `,T(`strong`,{children:e(i.subtotalCents)}),` on`,` `,T(`strong`,{children:r.name}),`. Your card is only charged if this bid wins the item.`]})}),r.collectShippingAddress&&E(`div`,{className:`lockerverse-auctions__checkout-physical`,children:[T(`p`,{className:`lockerverse-auctions__checkout-eyebrow`,children:`Physical item`}),T(`p`,{children:`This item requires a delivery address. Billing details are used by default, and you can switch to a separate delivery address below if needed.`})]})]}),E(`div`,{className:`lockerverse-auctions__checkout-body`,children:[t.showFields&&E(`fieldset`,{disabled:t.locked,children:[E(`div`,{className:`lockerverse-auctions__checkout-contact`,children:[T(l,{error:t.contactErrors.email,id:`${a}-email`,label:`Email`,name:`email`,onChange:e=>t.onEmailChange(e.target.value),required:!0,value:t.email}),T(d,{error:t.contactErrors.phone,id:`${a}-phone`,label:`Phone`,children:T(p,{country:t.phoneCountry,error:t.contactErrors.phone,errorId:`${a}-phone-error`,id:`${a}-phone`,name:`phone`,onChange:t.onPhoneChange,required:!0,value:t.phone})})]}),E(`section`,{"aria-label":`Payment Information`,className:`lockerverse-auctions__checkout-section`,children:[E(`div`,{className:`lockerverse-auctions__checkout-section-heading`,children:[T(`h3`,{children:`Payment Information`}),T(`p`,{children:n?`Processed securely and charged immediately for this purchase.`:`Stored securely and charged only if your bid finishes on top.`})]}),T(A,{onLoadError:t.onPaymentLoadError,options:j(n)})]}),E(`section`,{"aria-label":`Billing Details`,className:`lockerverse-auctions__checkout-section`,children:[T(`h3`,{children:`Billing Details`}),T(O,{onChange:t.onBillingChange,options:{mode:`billing`}}),T(`p`,{children:n?`Use your full name here. We use the email and phone above for purchase confirmation and fulfillment updates.`:`Use the bidder's full name here. We use the email and phone above to contact you if this bid is outbid or wins.`})]}),r.collectShippingAddress&&E(`section`,{"aria-label":`Delivery Details`,className:`lockerverse-auctions__checkout-section`,children:[E(`label`,{className:`lockerverse-auctions__checkout-checkbox lockerverse-auctions__checkout-delivery`,htmlFor:`${a}-delivery-same-as-billing`,children:[T(m,{checked:t.sameAsBilling,id:`${a}-delivery-same-as-billing`,onChange:e=>t.onSameAsBillingChange(e.target.checked)}),E(`span`,{children:[T(`strong`,{children:`Delivery address is the same as billing`}),T(`span`,{children:`Leave this on for the fastest flow. Turn it off only if the delivery address should differ from the billing details above.`})]})]}),!t.sameAsBilling&&E(w,{children:[T(`h3`,{children:`Delivery Address`}),T(O,{onChange:t.onShippingChange,options:{mode:`shipping`}})]})]}),T(N,{isPurchase:n,pricing:i}),t.serviceFeeEnabled&&T(M,{...t})]}),t.message&&T(`p`,{"aria-live":`polite`,className:`lockerverse-auctions__notice`,role:`status`,children:t.message}),!t.isTerminal&&E(`div`,{className:`lockerverse-auctions__checkout-footer`,children:[E(`p`,{children:[n?`By continuing, you agree to be charged for this purchase.`:`By continuing, you agree to have this payment method stored for item settlement if your bid is the winning offer.`,r.collectShippingAddress?` Your delivery details are stored with the ${n?`order`:`bid`} so the seller can fulfill the item after payment.`:``]}),E(`button`,{className:`lockerverse-auctions__button lockerverse-auctions__checkout-submit`,disabled:t.submitDisabled,type:`submit`,children:[t.buttonText,T(v,{"aria-hidden":`true`,size:16})]})]})]})]})}function M(t){let{isPurchase:n,pricing:r}=t;return T(`section`,{"aria-label":`Processing fees`,className:`lockerverse-auctions__checkout-section`,children:t.onIncludeServiceFeeChange?E(`label`,{className:`lockerverse-auctions__checkout-checkbox`,htmlFor:`${t.id}-service-fee`,children:[T(m,{checked:t.includeServiceFee,id:`${t.id}-service-fee`,onChange:e=>t.onIncludeServiceFeeChange?.(e.target.checked)}),E(`span`,{children:[E(`strong`,{children:[n?`Add`:`If I win, add`,` `,e(t.serviceFeeCents),` to help cover processing fees`]}),E(`span`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})]})]}):E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(r.totalCents)]})})}function N({pricing:t,isPurchase:n}){return t.additionalCharge?E(`section`,{"aria-label":`Order amounts`,className:`lockerverse-auctions__checkout-section`,children:[E(`p`,{children:[n?`Subtotal`:`Bid amount`,`:`,` `,e(t.subtotalCents)]}),E(`p`,{children:[t.additionalCharge.name,`:`,` `,e(t.additionalChargeCents??0)]}),E(`p`,{children:[n?`Total`:`Total if I win`,`:`,` `,e(t.totalCents)]})]}):null}function re(e,t,n){return e===`busy`?n?`Processing...`:`Authorizing...`:e===`retry`?`Retry original purchase`:t?`Check purchase status`:n?`Buy Now`:`Authorize Bid`}function P(e){let{auction:l,item:d,selection:p,client:m,onReview:g,onBack:_}=e,v=te(),y=ee(),w=x(),[E,O]=C(e.contact?.email??``),[k,A]=C(e.contact?.phone??``),[j,M]=C(()=>f(e.contact?.phone??``)),[N,P]=C({}),[F,ie]=C(!0),[I,ae]=C(null),[oe,se]=C(null),[L,ce]=C(e.resumePurchase??null),[R,le]=C(e.resumePurchase?`pending`:`ready`),[ue,de]=C(null),z=S(e.resumePurchase?.submission.clientRequestId??null),B=R===`complete`||R===`uncertain`,V=S(!1),H=S(!0),U=S(e);U.current=e;let W=S(!1);function G(e){H.current&&le(e),c(U.current.onInteractionLockChange,e!==`ready`&&e!==`complete`)}function K(e){H.current&&de(e)}function q(e){G(e===`bid`?`uncertain`:`pending`),K(e===`bid`?`We could not confirm your bid. Do not submit another bid until you check your email or contact the auction organizer.`:`We could not confirm the purchase result. Check its status using the same purchase request.`),W.current||(W.current=!0,c(U.current.onUncertain,e))}b(()=>(H.current=!0,()=>{H.current=!1}),[]);let J=!!(L??e.resumePurchase)||d.saleMode===`buy_now`,Y=L?.pricing??e.resumePurchase?.pricing??t(l,d,p),fe=L?.payment??e.resumePurchase?.payment??l.payment;function X(e){H.current&&ce(e),c(U.current.onPurchaseRecoveryChange,e)}function Z(e){e.status===`paid`?(z.current=null,X(null),G(`complete`),c(U.current.onResult,{additionalCharge:e.additionalCharge??null,additionalChargeCents:e.additionalChargeCents??0,kind:`purchase`,purchaseId:e.purchaseId,quantity:e.quantity,serviceFeeCents:e.serviceFeeCents,status:`paid`,subtotalCents:e.subtotalCents,totalCents:e.totalCents,unitAmountCents:e.subtotalCents/e.quantity}),W.current||(W.current=!0,c(U.current.onPurchaseComplete,e))):e.status===`pending_payment`?(G(`pending`),K(`Your purchase is pending. Check its status before making another payment.`)):(z.current=null,X(null),G(`ready`),K(`This purchase is ${e.status.replaceAll(`_`,` `)}. You can start a new purchase.`))}function pe(){let e=u(k,j),t=h({email:E,phone:e},!0);return P(t.errors),t.value?{email:t.value.email,phone:e}:(document.getElementById(`${w}-${t.errors.email?`email`:`phone`}`)?.focus(),null)}function me(){let e=U.current.selection;if(p.quantity!==e.quantity||p.amount!==e.amount||p.includeServiceFee!==e.includeServiceFee)throw Error(`Your selection changed. Review the total before continuing.`)}async function he(e){if(!(J&&d.additionalCharge))return!0;let t=await m.getPurchaseQuote(l.slug,d.id,{includeServiceFee:p.includeServiceFee,quantity:p.quantity});return H.current?t.subtotalCents!==Y.subtotalCents||(t.additionalChargeCents??0)!==(Y.additionalChargeCents??0)||t.serviceFeeCents!==Y.serviceFeeCents||t.totalCents!==Y.totalCents||!o(t.additionalCharge,Y.additionalCharge)?(g(e,`The checkout details changed. Review them before continuing.`),!1):!0:!1}async function ge(e){if(!e)throw Error(`Check the contact fields below.`);if(!(v&&y&&l.payment))throw Error(`Payment details are still loading.`);let t=await m.load(l.slug);if(!H.current)return null;let r=t.items.find(e=>e.id===d.id);if(!r)return g(t,`This item is no longer available.`),null;let o=n(t,r,p);if(o||i(l,t,d,r,p))return g(t,o??`The checkout details changed. Review them before continuing.`),null;if(!await he(t))return null;let c=await a({billing:I,collectShippingAddress:d.collectShippingAddress,elements:y,email:e.email,phone:e.phone,shipping:F?I:oe,stripe:v});return H.current?(me(),{confirmationToken:c,email:e.email,includeServiceFee:p.includeServiceFee,phone:e.phone,...s(Y)}):null}async function _e(e){let t=await m.createBid(l.slug,d.id,{...e,amount:p.amount});if(t.requiresAction){if(!(H.current&&v)){q(`bid`);return}await r(v,t)}G(`complete`),c(U.current.onResult,{additionalCharge:t.additionalCharge??null,additionalChargeCents:t.additionalChargeCents??0,amountCents:t.subtotalCents,kind:`bid`,serviceFeeCents:t.serviceFeeCents,totalCents:t.totalCents}),W.current||(W.current=!0,c(U.current.onBidSubmitted,t))}async function Q(e,t){if(e.requiresAction){if(!(H.current&&v)){q(`purchase`);return}await r(v,e);let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);n?Z(n):(G(`pending`),K(`Payment status is not available yet. Check again shortly.`));return}Z(e),!H.current&&e.status===`pending_payment`&&q(`purchase`)}async function ve(e){let t=await m.getPurchaseStatus(l.slug,d.id,e.submission.clientRequestId);if(t)await Q(t,e);else{if(!H.current){q(`purchase`);return}G(`retry`),K(`No purchase is recorded yet. You can retry the original purchase with the same request ID.`)}}async function ye(e,t){let n=await m.getPurchaseStatus(l.slug,d.id,t.submission.clientRequestId);if(n){await Q(n,t);return}X(null),G(`ready`),K(`The purchase was rejected. Review the item and payment details before trying again. (${e.status??`validation`})`)}async function be(e,t,n,r){let i=t&&(!(e instanceof D)||e.recoveryRecommended);if(K(e instanceof Error?e.message:`Unable to complete this request.`),J&&n){if(!r&&e instanceof D&&!e.recoveryRecommended)try{await ye(e,n);return}catch{}q(`purchase`)}else i?q(`bid`):G(`ready`)}function xe(){return z.current??=globalThis.crypto.randomUUID(),z.current}function Se(){return H.current?!0:(L||(X(null),G(`ready`)),!1)}async function Ce(e,t){if(t){await ve(e);return}Se()&&await Q(await m.createPurchase(l.slug,d.id,e.submission),e)}let $=v&&y&&fe;function we(){if(V.current||B)return null;if(!$)return K(`Payment details are still loading.`),null;let e=L?null:pe();return L||e?{checkoutPayment:$,contact:e,retryOriginal:R===`retry`}:null}async function Te(e){e.preventDefault();let t=we();if(!t)return;let{contact:n,checkoutPayment:r,retryOriginal:i}=t;V.current=!0,W.current=!1,G(`busy`),K(null);let a=!1,o=L;try{if(!o){let e=await ge(n);if(!(e&&H.current)){G(`ready`);return}if(!J){a=!0,await _e(e);return}o=Object.freeze({auctionId:l.id,item:d,itemId:d.id,payment:Object.freeze({...r}),pricing:Y,submission:Object.freeze({...e,clientRequestId:xe(),paymentMethodTypes:Object.freeze([`card`]),quantity:p.quantity})}),X(o)}a=!0,await Ce(o,!!L&&!i)}catch(e){await be(e,a,o,L!==null&&!i)}finally{V.current=!1}}let Ee=re(R,L!==null,J),De=R!==`ready`;return T(ne,{buttonText:Ee,communityName:e.communityName??l.name,contactErrors:N,email:E,id:w,includeServiceFee:p.includeServiceFee,isPurchase:J,isTerminal:B,item:d,locked:De,message:ue,onBack:R===`ready`?_:void 0,onBillingChange:ae,onEmailChange:t=>{O(t),e.onContactChange?.({email:t,phone:u(k,j)})},onIncludeServiceFeeChange:e.onIncludeServiceFeeChange,onPaymentLoadError:()=>K(`Unable to load payment form.`),onPhoneChange:({value:t,country:n})=>{A(t),M(n),e.onContactChange?.({email:E,phone:u(t,n)})},onSameAsBillingChange:ie,onShippingChange:se,onSubmit:Te,phone:k,phoneCountry:j,pricing:Y,quantity:p.quantity,sameAsBilling:F,serviceFeeCents:L?Y.serviceFeeCents:t(l,d,{...p,includeServiceFee:l.serviceFeeEnabled}).serviceFeeCents,serviceFeeEnabled:l.serviceFeeEnabled,showFields:!(L||B),submitDisabled:R===`busy`||!v||!y})}function F(e){let{auction:n,item:r,selection:i,theme:a=`dark`,stripeLoader:o=_,style:s,onBack:c,resumePurchase:l}=e,[u,d]=C(null),[f,p]=C(!1),[m,h]=C(0),v=g(e.appearanceRoot,a,s,e.interactionLocked),y=l?.payment??n.payment;if(b(()=>{let e=!0;if(!y){p(!0);return}return Promise.resolve().then(()=>o(y.publishableKey,y.connectedAccountId?{stripeAccount:y.connectedAccountId}:void 0)).then(t=>{e&&(d(t),p(!t))},()=>{e&&p(!0)}),()=>{e=!1}},[y,o,m]),f)return E(`div`,{children:[T(`p`,{role:`alert`,children:`Payment details could not load.`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`}),T(`button`,{onClick:()=>{p(!1),d(null),h(e=>e+1)},type:`button`,children:`Try again`})]});if(!(u&&v))return E(`div`,{children:[T(`p`,{role:`status`,children:`Loading secure payment details…`}),l?null:T(`button`,{onClick:c,type:`button`,children:`Back to item`})]});let x={mode:`setup`};l?x={amount:l.pricing.totalCents,currency:`usd`,mode:`payment`}:r.saleMode===`buy_now`&&(x={amount:t(n,r,i).totalCents,currency:`usd`,mode:`payment`});let S={...x,appearance:v,currency:`usd`,paymentMethodTypes:[`card`],setupFutureUsage:`off_session`,syncAddressCheckbox:`none`};return T(k,{options:S,stripe:u,children:T(P,{...e})})}export{F as AuctionPayment};
2
2
  //# sourceMappingURL=auction-payment-view.js.map