@lockerverse/react 0.2.127-dev.1 → 0.2.130-dev.1

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.
@@ -1,4 +1,4 @@
1
- import { n as useLockerverseAuctions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
1
+ import { n as useLockerverseAuctions, r as AuctionRefreshOptions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
2
2
  import { CreateLockerverseAuctionOptions, LockerverseAuction, LockerverseAuctionClient, LockerverseSdkError } from "@lockerverse/sdk/auctions";
3
3
  //#region src/use-lockerverse-auction.d.ts
4
4
  type UseLockerverseAuctionResult = {
@@ -10,7 +10,7 @@ type UseLockerverseAuctionResult = {
10
10
  refresh: () => void;
11
11
  };
12
12
  /** Load one auction by slug without requesting the community auction list. */
13
- declare function useLockerverseAuction(options: CreateLockerverseAuctionOptions, auctionSlug: string): UseLockerverseAuctionResult;
13
+ declare function useLockerverseAuction(options: CreateLockerverseAuctionOptions, auctionSlug: string, refreshOptions?: AuctionRefreshOptions): UseLockerverseAuctionResult;
14
14
  //#endregion
15
- export { type UseLockerverseAuctionResult, type UseLockerverseAuctionsResult, useLockerverseAuction, useLockerverseAuctions };
15
+ export { type AuctionRefreshOptions, type UseLockerverseAuctionResult, type UseLockerverseAuctionsResult, useLockerverseAuction, useLockerverseAuctions };
16
16
  //# sourceMappingURL=auction-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-data.d.ts","names":[],"sources":["../src/use-lockerverse-auction.ts"],"mappings":";;;KAUY;EACV,QAAQ;;EAER,SAAS;EACT;EACA,OAAO;EACP;;;iBAIc,sBACd,SAAS,iCACT,sBACC"}
1
+ {"version":3,"file":"auction-data.d.ts","names":[],"sources":["../src/use-lockerverse-auction.ts"],"mappings":";;;KAcY;EACV,QAAQ;;EAER,SAAS;EACT;EACA,OAAO;EACP;;;iBAIc,sBACd,SAAS,iCACT,qBACA,iBAAgB,wBACf"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./immutable-resource-identity.js";import{t}from"./use-lockerverse-auctions.js";import{useCallback as n,useEffect as r,useRef as i,useState as a}from"react";import{createLockerverseAuctionClient as o}from"@lockerverse/sdk/auctions";function s(t,s){e(`auction`,{apiBaseUrl:t.apiBaseUrl,communitySlug:t.communitySlug,environment:t.environment,mediaBaseUrl:t.mediaBaseUrl,slug:s});let c=i(t.onError);c.current=t.onError;let[l]=a(()=>o({...t,onError:e=>c.current?.(e)})),u=i(0),[d,f]=a(0),[p,m]=a({auction:null,error:null,loading:!0});r(()=>{let e=!0,t=u.current;return l.load(s).then(n=>{e&&t===u.current&&m({auction:n,error:null,loading:!1})},n=>{e&&t===u.current&&m(e=>({...e,error:n,loading:!1}))}),()=>{e=!1}},[l,s,d]);let h=n(()=>{u.current+=1,m(e=>({...e,error:null,loading:!0})),f(e=>e+1)},[]);return{...p,client:l,refresh:h}}export{s as useLockerverseAuction,t as useLockerverseAuctions};
1
+ import{t as e}from"./immutable-resource-identity.js";import{n as t,t as n}from"./use-lockerverse-auctions.js";import{useCallback as r,useEffect as i,useRef as a,useState as o}from"react";import{createLockerverseAuctionClient as s}from"@lockerverse/sdk/auctions";function c(n,c,l={}){e(`auction`,{apiBaseUrl:n.apiBaseUrl,communitySlug:n.communitySlug,environment:n.environment,mediaBaseUrl:n.mediaBaseUrl,slug:c});let u=a(n.onError);u.current=n.onError;let[d]=o(()=>s({...n,onError:e=>u.current?.(e)})),f=a(0),[p,m]=o(0),[h,g]=o({auction:null,error:null,loading:!0}),_=r(()=>{f.current+=1,g(e=>({...e,error:null,loading:!0})),m(e=>e+1)},[]),v=t(_,l);return i(()=>{let e=!0,t=f.current,n=v();return d.load(c).then(n=>{e&&t===f.current&&g({auction:n,error:null,loading:!1})},n=>{e&&t===f.current&&g(e=>({...e,error:n,loading:!1}))}).finally(n),()=>{e=!1}},[d,c,p,v]),{...h,client:d,refresh:_}}export{c as useLockerverseAuction,n as useLockerverseAuctions};
2
2
  //# sourceMappingURL=auction-data.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auction-data.js","names":[],"sources":["../src/use-lockerverse-auction.ts"],"sourcesContent":["import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseAuctionResult = {\n client: LockerverseAuctionClient;\n /** Last successful snapshot, retained during refresh and refresh errors. */\n auction: LockerverseAuction | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load one auction by slug without requesting the community auction list. */\nexport function useLockerverseAuction(\n options: CreateLockerverseAuctionOptions,\n auctionSlug: string\n): UseLockerverseAuctionResult {\n useImmutableResourceIdentity(\"auction\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n mediaBaseUrl: options.mediaBaseUrl,\n slug: auctionSlug,\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const generation = useRef(0);\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerverseAuctionResult, \"auction\" | \"loading\" | \"error\">\n >({ auction: null, error: null, loading: true });\n\n useEffect(() => {\n let active = true;\n const requestGeneration = generation.current;\n client.load(auctionSlug).then(\n (auction) => {\n if (active && requestGeneration === generation.current) {\n setState({ auction, error: null, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active && requestGeneration === generation.current) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, auctionSlug, revision]);\n\n const refresh = useCallback(() => {\n generation.current += 1;\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"0PAoBA,SAAgB,EACd,EACA,EAC6B,CAC7B,EAA6B,UAAW,CACtC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,aAAc,EAAQ,aACtB,KAAM,CACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,EAAa,EAAO,CAAC,EACrB,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAExB,CAAE,QAAS,KAAM,MAAO,KAAM,QAAS,EAAK,CAAC,EAE/C,MAAgB,CACd,IAAI,EAAS,GACP,EAAoB,EAAW,QAarC,OAZA,EAAO,KAAK,CAAW,CAAC,CAAC,KACtB,GAAY,CACP,GAAU,IAAsB,EAAW,SAC7C,EAAS,CAAE,UAAS,MAAO,KAAM,QAAS,EAAM,CAAC,CAErD,EACC,GAA+B,CAC1B,GAAU,IAAsB,EAAW,SAC7C,EAAU,IAAa,CAAE,GAAG,EAAS,QAAO,QAAS,EAAM,EAAE,CAEjE,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,EAAa,CAAQ,CAAC,EAElC,IAAM,EAAU,MAAkB,CAChC,EAAW,SAAW,EACtB,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAY,EAAU,CAAC,CACtC,EAAG,CAAC,CAAC,EAEL,MAAO,CAAE,GAAG,EAAO,SAAQ,SAAQ,CACrC"}
1
+ {"version":3,"file":"auction-data.js","names":[],"sources":["../src/use-lockerverse-auction.ts"],"sourcesContent":["import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\nimport {\n type AuctionRefreshOptions,\n useAuctionReturnRefresh,\n} from \"./use-auction-return-refresh.ts\";\n\nexport type UseLockerverseAuctionResult = {\n client: LockerverseAuctionClient;\n /** Last successful snapshot, retained during refresh and refresh errors. */\n auction: LockerverseAuction | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\n/** Load one auction by slug without requesting the community auction list. */\nexport function useLockerverseAuction(\n options: CreateLockerverseAuctionOptions,\n auctionSlug: string,\n refreshOptions: AuctionRefreshOptions = {}\n): UseLockerverseAuctionResult {\n useImmutableResourceIdentity(\"auction\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n mediaBaseUrl: options.mediaBaseUrl,\n slug: auctionSlug,\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const generation = useRef(0);\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<\n Pick<UseLockerverseAuctionResult, \"auction\" | \"loading\" | \"error\">\n >({ auction: null, error: null, loading: true });\n\n const refresh = useCallback(() => {\n generation.current += 1;\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((current) => current + 1);\n }, []);\n const startRead = useAuctionReturnRefresh(refresh, refreshOptions);\n\n useEffect(() => {\n let active = true;\n const requestGeneration = generation.current;\n const settleRead = startRead();\n client\n .load(auctionSlug)\n .then(\n (auction) => {\n if (active && requestGeneration === generation.current) {\n setState({ auction, error: null, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active && requestGeneration === generation.current) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n )\n .finally(settleRead);\n return () => {\n active = false;\n };\n }, [client, auctionSlug, revision, startRead]);\n\n return { ...state, client, refresh };\n}\n"],"mappings":"sQAwBA,SAAgB,EACd,EACA,EACA,EAAwC,CAAC,EACZ,CAC7B,EAA6B,UAAW,CACtC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,aAAc,EAAQ,aACtB,KAAM,CACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,EAAa,EAAO,CAAC,EACrB,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAExB,CAAE,QAAS,KAAM,MAAO,KAAM,QAAS,EAAK,CAAC,EAEzC,EAAU,MAAkB,CAChC,EAAW,SAAW,EACtB,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAY,EAAU,CAAC,CACtC,EAAG,CAAC,CAAC,EACC,EAAY,EAAwB,EAAS,CAAc,EA0BjE,OAxBA,MAAgB,CACd,IAAI,EAAS,GACP,EAAoB,EAAW,QAC/B,EAAa,EAAU,EAgB7B,OAfA,EACG,KAAK,CAAW,CAAC,CACjB,KACE,GAAY,CACP,GAAU,IAAsB,EAAW,SAC7C,EAAS,CAAE,UAAS,MAAO,KAAM,QAAS,EAAM,CAAC,CAErD,EACC,GAA+B,CAC1B,GAAU,IAAsB,EAAW,SAC7C,EAAU,IAAa,CAAE,GAAG,EAAS,QAAO,QAAS,EAAM,EAAE,CAEjE,CACF,CAAC,CACA,QAAQ,CAAU,MACR,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,EAAa,EAAU,CAAS,CAAC,EAEtC,CAAE,GAAG,EAAO,SAAQ,SAAQ,CACrC"}
@@ -1,4 +1,4 @@
1
- import { n as useLockerverseAuctions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
1
+ import { n as useLockerverseAuctions, r as AuctionRefreshOptions, t as UseLockerverseAuctionsResult } from "./use-lockerverse-auctions.js";
2
2
  import { n as LockerverseTheme, t as LockerverseStyle } from "./theme.js";
3
3
  import { a as LockerverseAuctionItemRenderContext, i as LockerverseAuctionItemFilter, n as LockerverseAuctionItemCardProps, o as LockerverseAuctionProps, r as LockerverseAuction, t as LockerverseAuctionItemCard } from "./lockerverse-auction-item-card.js";
4
4
  import { LockerverseAuction as LockerverseAuction$1 } from "@lockerverse/sdk/auctions";
@@ -11,5 +11,5 @@ type LockerverseAuctionsProps = Omit<LockerverseAuctionProps, "auction" | "onBac
11
11
  /** Optional auction browser. Select an auction to show its items. */
12
12
  declare function LockerverseAuctions({ auctions, theme, style, className, showFilters, showHeader, showLineup, getAuctionHref, onSelectAuction, ...contentProps }: LockerverseAuctionsProps): import("react").JSX.Element;
13
13
  //#endregion
14
- export { LockerverseAuction, LockerverseAuctionItemCard, type LockerverseAuctionItemCardProps, type LockerverseAuctionItemFilter, type LockerverseAuctionItemRenderContext, type LockerverseAuctionProps, LockerverseAuctions, type LockerverseAuctionsProps, type LockerverseStyle, type LockerverseTheme, type UseLockerverseAuctionsResult, useLockerverseAuctions };
14
+ export { type AuctionRefreshOptions, LockerverseAuction, LockerverseAuctionItemCard, type LockerverseAuctionItemCardProps, type LockerverseAuctionItemFilter, type LockerverseAuctionItemRenderContext, type LockerverseAuctionProps, LockerverseAuctions, type LockerverseAuctionsProps, type LockerverseStyle, type LockerverseTheme, type UseLockerverseAuctionsResult, useLockerverseAuctions };
15
15
  //# sourceMappingURL=auctions.d.ts.map
package/dist/auctions.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,t as n}from"./use-auction-boundary.js";import{a as r,i,n as a,o,r as s,s as c,t as l}from"./lockerverse-auction.js";import{t as u}from"./use-lockerverse-auctions.js";import{ArrowRight as d,Gavel as f,ListChecks as p}from"lucide-react";import{useEffect as m,useRef as h,useState as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";function b({auction:a,onSelect:s,href:l}){n(a.startAt,a.endAt,a.items);let u=a.configuration.image||a.items.find(e=>e.image||e.images.length)?.image||a.items.find(e=>e.images.length)?.images[0]||a.community?.banner||a.community?.thumbnail,m=a.description||{active:`Bidding is open on available items.`,draft:`Preview the lineup before bidding opens.`,finished:`Bidding has wrapped. Review the completed items.`}[e(a)];return y(`article`,{className:`lockerverse-auctions__catalog-card`,children:[l?v(`a`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,href:l,onClick:e=>{s&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),s())},children:y(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View items in `,a.name]})}):v(`button`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,onClick:s,type:`button`}),y(`div`,{className:`lockerverse-auctions__catalog-media`,children:[v(i,{fallback:u,name:a.name}),y(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[v(`span`,{className:`lockerverse-auctions__catalog-chip`,children:o[e(a)]}),v(c,{auction:a})]}),y(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[v(r,{icon:v(p,{"aria-hidden":`true`,size:16}),label:`Items`,value:String(a.items.length)}),v(r,{icon:v(f,{"aria-hidden":`true`,size:16}),label:`Bids`,value:String(a.items.reduce((e,t)=>e+t.bidCount,0))})]})]}),y(`div`,{className:`lockerverse-auctions__catalog-body`,children:[v(`h3`,{children:a.name}),v(t,{className:`lockerverse-auctions__catalog-description`,description:m}),y(`div`,{className:`lockerverse-auctions__catalog-footer`,children:[v(`span`,{className:`lockerverse-auctions__catalog-cta`,children:e(a)===`draft`?`Preview items`:`View items`}),v(`span`,{className:`lockerverse-auctions__catalog-arrow`,children:v(d,{"aria-hidden":`true`,size:16})})]})]})]})}function x({auctions:e,theme:t=`dark`,style:n,className:r,showFilters:i=!0,showHeader:a=!0,showLineup:o=!0,getAuctionHref:s,onSelectAuction:c,...u}){let[d,f]=g(null),p=h(null),_=h(null),b=h(d),x=e.auctions?.find(e=>e.id===d);return m(()=>{if(b.current!==d){if(d===null){let e=[..._.current?.querySelectorAll(`button[data-auction-id]`)??[]].find(e=>e.dataset.auctionId===b.current);(p.current??e??_.current)?.focus()}b.current=d}},[d]),y(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,r].filter(Boolean).join(` `),"data-lockerverse-theme":t,ref:_,style:n,tabIndex:-1,children:[!x&&a?v(`header`,{className:`lockerverse-auctions__catalog-header`,children:v(`h2`,{ref:p,tabIndex:-1,children:`Auctions`})}):null,e.loading?v(`p`,{role:`status`,children:`Loading auctions…`}):null,e.error?y(`div`,{role:`alert`,children:[v(`p`,{children:e.error.message}),v(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,x?v(l,{auction:x,onBack:()=>f(null),...u,showFilters:i,showHeader:a,showLineup:o,theme:t,...n?{style:n}:{}},x.id):v(S,{auctions:e.auctions,onSelectAuction:e=>{c?c(e):f(e.id)},...s?{getAuctionHref:s}:{},interceptLinks:!!c,showLineup:o})]})}function S({auctions:e,showLineup:t,onSelectAuction:n,getAuctionHref:r,interceptLinks:i}){return e?e.length?y(_,{children:[t?y(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[y(`div`,{children:[v(`h3`,{children:`Auction lineup`}),v(`p`,{children:`Browse the current collection.`})]}),y(`span`,{children:[e.length,` `,e.length===1?`auction`:`auctions`]})]}):null,v(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:e.map(e=>v(`li`,{children:v(b,{auction:e,...r?{href:r(e)}:{},...!r||i?{onSelect:()=>n(e)}:{}})},e.id))})]}):y(`div`,{className:`lockerverse-auctions__catalog-empty`,children:[v(`h3`,{children:`No auctions yet.`}),v(`p`,{children:`Published auctions will appear here once they are available.`})]}):null}export{a as LockerverseAuction,s as LockerverseAuctionItemCard,x as LockerverseAuctions,u as useLockerverseAuctions};
1
+ import{a as e,c as t,t as n}from"./use-auction-boundary.js";import{a as r,i,n as a,o,r as s,s as c,t as l}from"./lockerverse-auction.js";import{t as u}from"./use-lockerverse-auctions.js";import{ArrowRight as d,Gavel as f,ListChecks as p}from"lucide-react";import{useEffect as m,useRef as h,useState as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";function b({auction:a,onSelect:s,href:l}){n(a.startAt,a.endAt,a.items);let u=a.configuration.image||a.items.find(e=>e.image||e.images.length)?.image||a.items.find(e=>e.images.length)?.images[0]||a.community?.banner||a.community?.thumbnail,m=a.description||{active:`Bidding is open on available items.`,draft:`Preview the lineup before bidding opens.`,finished:`Bidding has wrapped. Review the completed items.`}[e(a)];return y(`article`,{className:`lockerverse-auctions__catalog-card`,children:[l?v(`a`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,href:l,onClick:e=>{s&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),s())},children:y(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View items in `,a.name]})}):v(`button`,{"aria-label":`View items in ${a.name}`,className:`lockerverse-auctions__catalog-select`,"data-auction-id":a.id,onClick:s,type:`button`}),y(`div`,{className:`lockerverse-auctions__catalog-media`,children:[v(i,{fallback:u,name:a.name}),y(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[v(`span`,{className:`lockerverse-auctions__catalog-chip`,children:o[e(a)]}),v(c,{auction:a})]}),y(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[v(r,{icon:v(p,{"aria-hidden":`true`,size:16}),label:`Items`,value:String(a.items.length)}),v(r,{icon:v(f,{"aria-hidden":`true`,size:16}),label:`Bids`,value:String(a.items.reduce((e,t)=>e+t.bidCount,0))})]})]}),y(`div`,{className:`lockerverse-auctions__catalog-body`,children:[v(`h3`,{children:a.name}),v(t,{className:`lockerverse-auctions__catalog-description`,description:m}),y(`div`,{className:`lockerverse-auctions__catalog-footer`,children:[v(`span`,{className:`lockerverse-auctions__catalog-cta`,children:e(a)===`draft`?`Preview items`:`View items`}),v(`span`,{className:`lockerverse-auctions__catalog-arrow`,children:v(d,{"aria-hidden":`true`,size:16})})]})]})]})}function x({auctions:e,theme:t=`dark`,style:n,className:r,showFilters:i=!0,showHeader:a=!0,showLineup:o=!1,getAuctionHref:s,onSelectAuction:c,...u}){let[d,f]=g(null),p=h(null),_=h(null),b=h(d),x=e.auctions?.find(e=>e.id===d);return m(()=>{if(b.current!==d){if(d===null){let e=[..._.current?.querySelectorAll(`button[data-auction-id]`)??[]].find(e=>e.dataset.auctionId===b.current);(p.current??e??_.current)?.focus()}b.current=d}},[d]),y(`section`,{"aria-busy":e.loading,"aria-label":`Auctions`,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,r].filter(Boolean).join(` `),"data-lockerverse-theme":t,ref:_,style:n,tabIndex:-1,children:[!x&&a?v(`header`,{className:`lockerverse-auctions__catalog-header`,children:v(`h2`,{ref:p,tabIndex:-1,children:`Auctions`})}):null,e.loading?v(`p`,{role:`status`,children:e.auctions?`Refreshing auctions…`:`Loading auctions…`}):null,e.error?y(`div`,{role:`alert`,children:[v(`p`,{children:e.error.message}),v(`button`,{onClick:e.refresh,type:`button`,children:`Try again`})]}):null,x?v(l,{auction:x,onBack:()=>f(null),...u,showFilters:i,showHeader:a,showLineup:o,theme:t,...n?{style:n}:{}},x.id):v(S,{auctions:e.auctions,onSelectAuction:e=>{c?c(e):f(e.id)},...s?{getAuctionHref:s}:{},interceptLinks:!!c,showLineup:o})]})}function S({auctions:e,showLineup:t,onSelectAuction:n,getAuctionHref:r,interceptLinks:i}){return e?e.length?y(_,{children:[t?y(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[y(`div`,{children:[v(`h3`,{children:`Auction lineup`}),v(`p`,{children:`Browse the current collection.`})]}),y(`span`,{children:[e.length,` `,e.length===1?`auction`:`auctions`]})]}):null,v(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:e.map(e=>v(`li`,{children:v(b,{auction:e,...r?{href:r(e)}:{},...!r||i?{onSelect:()=>n(e)}:{}})},e.id))})]}):y(`div`,{className:`lockerverse-auctions__catalog-empty`,children:[v(`h3`,{children:`No auctions yet.`}),v(`p`,{children:`Published auctions will appear here once they are available.`})]}):null}export{a as LockerverseAuction,s as LockerverseAuctionItemCard,x as LockerverseAuctions,u as useLockerverseAuctions};
2
2
  //# sourceMappingURL=auctions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auctions.js","names":[],"sources":["../src/lockerverse-auctions.tsx"],"sourcesContent":["import type { LockerverseAuction as Auction } from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Gavel, ListChecks } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\nimport {\n AuctionContent,\n type LockerverseAuctionProps,\n} from \"./lockerverse-auction.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\nimport type { UseLockerverseAuctionsResult } from \"./use-lockerverse-auctions.ts\";\n\nexport type LockerverseAuctionsProps = Omit<\n LockerverseAuctionProps,\n \"auction\" | \"onBack\"\n> & {\n auctions: UseLockerverseAuctionsResult;\n getAuctionHref?: (auction: Auction) => string;\n onSelectAuction?: (auction: Auction) => void;\n};\n\nfunction AuctionCard({\n auction,\n onSelect,\n href,\n}: {\n auction: Auction;\n onSelect?: () => void;\n href?: string;\n}) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const fallback =\n auction.configuration.image ||\n auction.items.find((item) => item.image || item.images.length)?.image ||\n auction.items.find((item) => item.images.length)?.images[0] ||\n auction.community?.banner ||\n auction.community?.thumbnail;\n const description =\n auction.description ||\n {\n active: \"Bidding is open on available items.\",\n draft: \"Preview the lineup before bidding opens.\",\n finished: \"Bidding has wrapped. Review the completed items.\",\n }[getAuctionDisplayStatus(auction)];\n return (\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View items in {auction.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage fallback={fallback} name={auction.name} />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span className=\"lockerverse-auctions__catalog-chip\">\n {STATUS_LABELS[getAuctionDisplayStatus(auction)]}\n </span>\n <Timing auction={auction} />\n </div>\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={<ListChecks aria-hidden=\"true\" size={16} />}\n label=\"Items\"\n value={String(auction.items.length)}\n />\n <Metric\n icon={<Gavel aria-hidden=\"true\" size={16} />}\n label=\"Bids\"\n value={String(\n auction.items.reduce((sum, item) => sum + item.bidCount, 0)\n )}\n />\n </dl>\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{auction.name}</h3>\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={description}\n />\n <div className=\"lockerverse-auctions__catalog-footer\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {getAuctionDisplayStatus(auction) === \"draft\"\n ? \"Preview items\"\n : \"View items\"}\n </span>\n <span className=\"lockerverse-auctions__catalog-arrow\">\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n );\n}\n\n/** Optional auction browser. Select an auction to show its items. */\nexport function LockerverseAuctions({\n auctions,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = true,\n getAuctionHref,\n onSelectAuction,\n ...contentProps\n}: LockerverseAuctionsProps) {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const headingRef = useRef<HTMLHeadingElement>(null);\n const sectionRef = useRef<HTMLElement>(null);\n const previousId = useRef(selectedId);\n const selected = auctions.auctions?.find(\n (auction) => auction.id === selectedId\n );\n useEffect(() => {\n if (previousId.current !== selectedId) {\n if (selectedId === null) {\n const card = [\n ...(sectionRef.current?.querySelectorAll<HTMLButtonElement>(\n \"button[data-auction-id]\"\n ) ?? []),\n ].find((button) => button.dataset.auctionId === previousId.current);\n (headingRef.current ?? card ?? sectionRef.current)?.focus();\n }\n previousId.current = selectedId;\n }\n }, [selectedId]);\n return (\n <section\n aria-busy={auctions.loading}\n aria-label=\"Auctions\"\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n ref={sectionRef}\n style={style}\n tabIndex={-1}\n >\n {!selected && showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n Auctions\n </h2>\n </header>\n ) : null}\n {auctions.loading ? <p role=\"status\">Loading auctions…</p> : null}\n {auctions.error ? (\n <div role=\"alert\">\n <p>{auctions.error.message}</p>\n <button onClick={auctions.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {selected ? (\n <AuctionContent\n auction={selected}\n key={selected.id}\n onBack={() => setSelectedId(null)}\n {...contentProps}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n />\n ) : (\n <AuctionList\n auctions={auctions.auctions}\n onSelectAuction={(auction) => {\n if (onSelectAuction) {\n onSelectAuction(auction);\n } else {\n setSelectedId(auction.id);\n }\n }}\n {...(getAuctionHref ? { getAuctionHref } : {})}\n interceptLinks={Boolean(onSelectAuction)}\n showLineup={showLineup}\n />\n )}\n </section>\n );\n}\n\nfunction AuctionList({\n auctions,\n showLineup,\n onSelectAuction,\n getAuctionHref,\n interceptLinks,\n}: {\n auctions: Auction[] | null;\n showLineup: boolean;\n onSelectAuction: (auction: Auction) => void;\n getAuctionHref?: (auction: Auction) => string;\n interceptLinks: boolean;\n}) {\n if (!auctions) {\n return null;\n }\n if (!auctions.length) {\n return (\n <div className=\"lockerverse-auctions__catalog-empty\">\n <h3>No auctions yet.</h3>\n <p>Published auctions will appear here once they are available.</p>\n </div>\n );\n }\n return (\n <>\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {auctions.length} {auctions.length === 1 ? \"auction\" : \"auctions\"}\n </span>\n </div>\n ) : null}\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {auctions.map((auction) => (\n <li key={auction.id}>\n <AuctionCard\n auction={auction}\n {...(getAuctionHref ? { href: getAuctionHref(auction) } : {})}\n {...(!getAuctionHref || interceptLinks\n ? { onSelect: () => onSelectAuction(auction) }\n : {})}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auctions.js","names":[],"sources":["../src/lockerverse-auctions.tsx"],"sourcesContent":["import type { LockerverseAuction as Auction } from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Gavel, ListChecks } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport { getAuctionDisplayStatus } from \"./auction-display.ts\";\nimport {\n AuctionContent,\n type LockerverseAuctionProps,\n} from \"./lockerverse-auction.tsx\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\nimport type { UseLockerverseAuctionsResult } from \"./use-lockerverse-auctions.ts\";\n\nexport type LockerverseAuctionsProps = Omit<\n LockerverseAuctionProps,\n \"auction\" | \"onBack\"\n> & {\n auctions: UseLockerverseAuctionsResult;\n getAuctionHref?: (auction: Auction) => string;\n onSelectAuction?: (auction: Auction) => void;\n};\n\nfunction AuctionCard({\n auction,\n onSelect,\n href,\n}: {\n auction: Auction;\n onSelect?: () => void;\n href?: string;\n}) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const fallback =\n auction.configuration.image ||\n auction.items.find((item) => item.image || item.images.length)?.image ||\n auction.items.find((item) => item.images.length)?.images[0] ||\n auction.community?.banner ||\n auction.community?.thumbnail;\n const description =\n auction.description ||\n {\n active: \"Bidding is open on available items.\",\n draft: \"Preview the lineup before bidding opens.\",\n finished: \"Bidding has wrapped. Review the completed items.\",\n }[getAuctionDisplayStatus(auction)];\n return (\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View items in {auction.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View items in ${auction.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n data-auction-id={auction.id}\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage fallback={fallback} name={auction.name} />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span className=\"lockerverse-auctions__catalog-chip\">\n {STATUS_LABELS[getAuctionDisplayStatus(auction)]}\n </span>\n <Timing auction={auction} />\n </div>\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={<ListChecks aria-hidden=\"true\" size={16} />}\n label=\"Items\"\n value={String(auction.items.length)}\n />\n <Metric\n icon={<Gavel aria-hidden=\"true\" size={16} />}\n label=\"Bids\"\n value={String(\n auction.items.reduce((sum, item) => sum + item.bidCount, 0)\n )}\n />\n </dl>\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{auction.name}</h3>\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={description}\n />\n <div className=\"lockerverse-auctions__catalog-footer\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {getAuctionDisplayStatus(auction) === \"draft\"\n ? \"Preview items\"\n : \"View items\"}\n </span>\n <span className=\"lockerverse-auctions__catalog-arrow\">\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n );\n}\n\n/** Optional auction browser. Select an auction to show its items. */\nexport function LockerverseAuctions({\n auctions,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n getAuctionHref,\n onSelectAuction,\n ...contentProps\n}: LockerverseAuctionsProps) {\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const headingRef = useRef<HTMLHeadingElement>(null);\n const sectionRef = useRef<HTMLElement>(null);\n const previousId = useRef(selectedId);\n const selected = auctions.auctions?.find(\n (auction) => auction.id === selectedId\n );\n useEffect(() => {\n if (previousId.current !== selectedId) {\n if (selectedId === null) {\n const card = [\n ...(sectionRef.current?.querySelectorAll<HTMLButtonElement>(\n \"button[data-auction-id]\"\n ) ?? []),\n ].find((button) => button.dataset.auctionId === previousId.current);\n (headingRef.current ?? card ?? sectionRef.current)?.focus();\n }\n previousId.current = selectedId;\n }\n }, [selectedId]);\n return (\n <section\n aria-busy={auctions.loading}\n aria-label=\"Auctions\"\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n ref={sectionRef}\n style={style}\n tabIndex={-1}\n >\n {!selected && showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n Auctions\n </h2>\n </header>\n ) : null}\n {auctions.loading ? (\n <p role=\"status\">\n {auctions.auctions ? \"Refreshing auctions…\" : \"Loading auctions…\"}\n </p>\n ) : null}\n {auctions.error ? (\n <div role=\"alert\">\n <p>{auctions.error.message}</p>\n <button onClick={auctions.refresh} type=\"button\">\n Try again\n </button>\n </div>\n ) : null}\n {selected ? (\n <AuctionContent\n auction={selected}\n key={selected.id}\n onBack={() => setSelectedId(null)}\n {...contentProps}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n />\n ) : (\n <AuctionList\n auctions={auctions.auctions}\n onSelectAuction={(auction) => {\n if (onSelectAuction) {\n onSelectAuction(auction);\n } else {\n setSelectedId(auction.id);\n }\n }}\n {...(getAuctionHref ? { getAuctionHref } : {})}\n interceptLinks={Boolean(onSelectAuction)}\n showLineup={showLineup}\n />\n )}\n </section>\n );\n}\n\nfunction AuctionList({\n auctions,\n showLineup,\n onSelectAuction,\n getAuctionHref,\n interceptLinks,\n}: {\n auctions: Auction[] | null;\n showLineup: boolean;\n onSelectAuction: (auction: Auction) => void;\n getAuctionHref?: (auction: Auction) => string;\n interceptLinks: boolean;\n}) {\n if (!auctions) {\n return null;\n }\n if (!auctions.length) {\n return (\n <div className=\"lockerverse-auctions__catalog-empty\">\n <h3>No auctions yet.</h3>\n <p>Published auctions will appear here once they are available.</p>\n </div>\n );\n }\n return (\n <>\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {auctions.length} {auctions.length === 1 ? \"auction\" : \"auctions\"}\n </span>\n </div>\n ) : null}\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {auctions.map((auction) => (\n <li key={auction.id}>\n <AuctionCard\n auction={auction}\n {...(getAuctionHref ? { href: getAuctionHref(auction) } : {})}\n {...(!getAuctionHref || interceptLinks\n ? { onSelect: () => onSelectAuction(auction) }\n : {})}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n"],"mappings":"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"}
@@ -30,6 +30,7 @@ type LockerverseAuctionProps = {
30
30
  className?: string;
31
31
  showFilters?: boolean;
32
32
  showHeader?: boolean;
33
+ /** Show the optional catalog introduction and count. Hidden by default. */
33
34
  showLineup?: boolean;
34
35
  onBack?: () => void;
35
36
  /** Replace the card inside each list item. Keep onSelect connected to your item view. */
@@ -1 +1 @@
1
- {"version":3,"file":"lockerverse-auction-item-card.d.ts","names":[],"sources":["../src/lockerverse-auction.tsx","../src/lockerverse-auction-item-card.tsx"],"mappings":";;;;KAiBY;EACV,SAAS;EACT,MAAM;;EAEN,QAAQ;;EAER;EACA;;EAEA,OAAO;EACP,QAAQ;;KAEE;EACV,SAAS;EACT,gBAAgB,SAAS,oBAAS,MAAM;;EAExC,SAAS;EACT,kBAAkB,QAAQ;;EAE1B,iBAAiB,QAAQ;EACzB,eAAe,SAAS,oBAAS,MAAM;;EAEvC;EACA,QAAQ;EACR,QAAQ;EACR;EACA;EACA;EACA;EACA;;EAEA,cAAc,SAAS,wCAAwC;;cAE3D;;;;;;;;;;;;;KAMM,uCAAuC;;iBAGnC,uBACd,SACA,cACA,QAAQ,kBACR,gBACA,eACA,aACA,kBACA,OACA,OACA,WACA,aACA,YACA,YACA,QACA,cACC,0CAAuB,IAAA;;;KCtDd;EACV,SAAS;EACT,MAAM;EACN;EACA;;EAEA;EACA,QAAQ;;EAER;EACA,QAAQ;EACR;EACA;EACA;;iBAoCc,6BACd,SACA,MACA,UACA,MACA,kBACA,OACA,WACA,OACA,iBACA,aACA,cACC,kDAA+B,IAAA"}
1
+ {"version":3,"file":"lockerverse-auction-item-card.d.ts","names":[],"sources":["../src/lockerverse-auction.tsx","../src/lockerverse-auction-item-card.tsx"],"mappings":";;;;KAiBY;EACV,SAAS;EACT,MAAM;;EAEN,QAAQ;;EAER;EACA;;EAEA,OAAO;EACP,QAAQ;;KAEE;EACV,SAAS;EACT,gBAAgB,SAAS,oBAAS,MAAM;;EAExC,SAAS;EACT,kBAAkB,QAAQ;;EAE1B,iBAAiB,QAAQ;EACzB,eAAe,SAAS,oBAAS,MAAM;;EAEvC;EACA,QAAQ;EACR,QAAQ;EACR;EACA;EACA;;EAEA;EACA;;EAEA,cAAc,SAAS,wCAAwC;;cAE3D;;;;;;;;;;;;;KAMM,uCAAuC;;iBAGnC,uBACd,SACA,cACA,QAAQ,kBACR,gBACA,eACA,aACA,kBACA,OACA,OACA,WACA,aACA,YACA,YACA,QACA,cACC,0CAAuB,IAAA;;;KCvDd;EACV,SAAS;EACT,MAAM;EACN;EACA;;EAEA;EACA,QAAQ;;EAER;EACA,QAAQ;EACR;EACA;EACA;;iBAoCc,6BACd,SACA,MACA,UACA,MACA,kBACA,OACA,WACA,OACA,iBACA,aACA,cACC,kDAA+B,IAAA"}
@@ -1,2 +1,2 @@
1
- import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{ArrowRight as c,ChevronLeft as l,Clock3 as u,Gavel as d,ShoppingBag as f}from"lucide-react";import{useEffect as p,useMemo as m,useRef as h,useState as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";const b={active:`Live now`,draft:`Coming soon`,finished:`Closed`};function x({images:e,autoRotate:t=!1,fallback:n,name:i}){let a=m(()=>{let t=[...new Set(e?.filter(Boolean))];return!t.length&&n&&t.push(n),t},[e,n]),[o,s]=g(0),{ref:c,visible:l}=r(),[u,d]=g(!0),[f,_]=g(!1),y=h(new Set),b=a.length,x=t&&b?o%b:0;return p(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>d(e.matches);t(),e.addEventListener(`change`,t);let n=c.current?.closest(`article`),r=()=>_(!!n?.matches(`:hover, :focus-within`)),i=e=>_(!!(n?.matches(`:hover`)||e.relatedTarget instanceof Node&&n?.contains(e.relatedTarget)));return r(),n?.addEventListener(`mouseenter`,r),n?.addEventListener(`mouseleave`,r),n?.addEventListener(`focusin`,r),n?.addEventListener(`focusout`,i),()=>{e.removeEventListener(`change`,t),n?.removeEventListener(`mouseenter`,r),n?.removeEventListener(`mouseleave`,r),n?.removeEventListener(`focusin`,r),n?.removeEventListener(`focusout`,i)}},[c]),p(()=>{if(!t||b<2||!l||u||f)return;let e=window.setInterval(()=>{s(e=>y.current.has(a[(e+1)%b]??``)?(e+1)%b:e)},5e3);return()=>window.clearInterval(e)},[t,b,a,l,u,f]),v(`div`,{className:`lockerverse-auctions__catalog-images`,ref:c,children:b?[x,...t&&b>1?[(x+1)%b]:[]].map(e=>v(`img`,{alt:e===x?i:``,"aria-hidden":e!==x,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===x,height:500,loading:`lazy`,onLoad:()=>y.current.add(a[e]??``),src:a[e],width:640},a[e])):null})}function S({icon:e,label:t,value:n}){return y(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[y(`dt`,{children:[e,t]}),v(`dd`,{children:n})]})}function C({auction:t,status:n=e(t),item:r}){let i=``;return n===`draft`&&(i=!r&&Date.parse(t.startAt)<=Date.now()?`Next opens `:`Opens `),n===`active`&&(i=r?`Closes `:`Ends `),y(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[i,a(t,n,r)]})}function w(e,t){if(e.saleMode===`buy_now`){let r=o(e),i=t===`active`?`Buy now`:b[t];return{chip:r?`Sold out`:i,cta:r?`Sold out`:{active:`Buy now`,draft:`Preview item`,finished:`View item`}[t],price:n(e.buyNowPriceAmount??0),priceLabel:`Buy Now`,secondary:e.availableQuantity===null?`Available`:String(e.availableQuantity)}}return{chip:t===`active`?`Live`:b[t],cta:{active:`Bid now`,draft:`Preview item`,finished:`View item`}[t],price:t===`finished`&&!e.maxBidAmount?`No bids`:n(e.maxBidAmount??0),priceLabel:t===`finished`?`Final bid`:`Current`,secondary:n(e.minBidAmount??0)}}function T({auction:n,item:r,onSelect:i,href:a,autoRotateImages:o=!1,theme:l=`dark`,className:p,style:m,showDescription:h=!0,showMetrics:g=!0,showTiming:_=!0}){s(r.startAt??n.startAt,r.endAt??n.endAt);let b=e(n,r),T=r.saleMode===`buy_now`,E=w(r,b);return v(`div`,{className:[`lockerverse-auctions`,`lockerverse-auctions--card`,p].filter(Boolean).join(` `),"data-lockerverse-theme":l,style:m,children:y(`article`,{className:`lockerverse-auctions__catalog-card`,children:[a?v(`a`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,href:a,onClick:e=>{i&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),i())},children:y(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View `,r.name]})}):v(`button`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,onClick:i,type:`button`}),y(`div`,{className:`lockerverse-auctions__catalog-media`,children:[v(x,{autoRotate:o,fallback:r.image||n.configuration.image||n.community?.banner||n.community?.thumbnail,images:r.images,name:r.name}),y(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[v(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":b===`active`,children:E.chip}),_?v(C,{auction:n,item:r,status:b}):null]}),g?y(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[v(S,{icon:v(T?f:d,{"aria-hidden":`true`,size:16}),label:E.priceLabel,value:E.price}),v(S,{icon:v(u,{"aria-hidden":`true`,size:16}),label:T?`Available`:`Floor`,value:E.secondary})]}):null]}),y(`div`,{className:`lockerverse-auctions__catalog-body`,children:[v(`h3`,{children:r.name}),h?v(t,{className:`lockerverse-auctions__catalog-description`,description:r.description||`View auction item details.`}):null,v(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:y(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[E.cta,v(c,{"aria-hidden":`true`,size:16})]})})]})]})})}const E=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function D({auction:e,onSelectItem:t,filter:n,onFilterChange:r,getFilterHref:i,getItemHref:a,autoRotateImages:o=!1,theme:s=`dark`,style:c,className:l,showFilters:u=!0,showHeader:d=!0,showLineup:f=!0,onBack:p,renderItem:m}){return v(`section`,{"aria-label":e.name,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,l].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:c,children:v(O,{auction:e,...t?{onSelectItem:t}:{},...n?{filter:n}:{},...r?{onFilterChange:r}:{},...i?{getFilterHref:i}:{},...a?{getItemHref:a}:{},autoRotateImages:o,showFilters:u,showHeader:d,showLineup:f,theme:s,...c?{style:c}:{},...p?{onBack:p}:{},...m?{renderItem:m}:{}})})}function O({auction:n,onSelectItem:r,filter:o,onFilterChange:c,getFilterHref:u,getItemHref:d,autoRotateImages:f=!1,theme:m=`dark`,style:b,showFilters:x=!0,showHeader:S=!0,showLineup:C=!0,onBack:w,renderItem:D}){s(n.startAt,n.endAt,n.items);let[O,k]=g({auctionId:n.id,value:`all`}),A=h(null),j=h(null),M=x?o??(O.auctionId===n.id?O.value:`all`):`all`;p(()=>{k({auctionId:n.id,value:`all`})},[n.id,x]);let N=e=>{k({auctionId:n.id,value:e}),c?.(e)},P=i(n),F=!!w;p(()=>{F&&(A.current??j.current)?.focus()},[n.id,F,S]);let I=b?Object.fromEntries(Object.entries(b).filter(([e])=>e.startsWith(`--lockerverse-`))):void 0,L=[...n.items].sort((e,t)=>e.position-t.position||e.createdAt.localeCompare(t.createdAt)),R=L.filter(t=>M===`all`||e(n,t)===M);return y(_,{children:[w?y(`button`,{className:`lockerverse-auctions__catalog-back`,onClick:w,ref:j,type:`button`,children:[v(l,{"aria-hidden":`true`,size:16}),`Auctions`]}):null,S?y(`header`,{className:`lockerverse-auctions__catalog-header`,children:[v(`h2`,{ref:A,tabIndex:-1,children:n.name}),y(`p`,{className:`lockerverse-auctions__catalog-period`,children:[a({...n,items:[]},`draft`),` —`,` `,a(n,`active`)]}),n.status!==`finished`&&P?y(`p`,{className:`lockerverse-auctions__catalog-next`,children:[`Next opens `,a(n,`draft`,P)]}):null,n.description?v(t,{description:n.description}):null]}):null,C?y(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[y(`div`,{children:[v(`h3`,{children:`Auction lineup`}),v(`p`,{children:`Browse the current collection.`})]}),y(`span`,{children:[R.length,` `,R.length===1?`item`:`items`]})]}):null,x?v(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:E.map(t=>{let r=u?.(t.value),i=y(_,{children:[t.label,v(`span`,{children:t.value===`all`?L.length:L.filter(r=>e(n,r)===t.value).length})]});return r?v(`a`,{"aria-current":M===t.value?`page`:void 0,href:r,onClick:e=>{c&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),N(t.value))},children:i},t.value):v(`button`,{"aria-pressed":M===t.value,onClick:()=>N(t.value),type:`button`,children:i},t.value)})}):null,R.length?v(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:R.map(t=>{let i={auction:n,item:t,onSelect:()=>r?.(n,t),status:e(n,t),theme:m};d&&(i.href=d(n,t)),I&&(i.style=I);let{onSelect:a,...o}=i;return v(`li`,{children:D?D(i):v(T,{...o,...r?{onSelect:a}:{},autoRotateImages:f})},t.id)})}):v(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`})]})}export{S as a,x as i,D as n,b as o,T as r,C as s,O as t};
1
+ import{a as e,c as t,i as n,n as r,o as i,r as a,s as o,t as s}from"./use-auction-boundary.js";import{ArrowRight as c,ChevronLeft as l,Clock3 as u,Gavel as d,ShoppingBag as f}from"lucide-react";import{useEffect as p,useMemo as m,useRef as h,useState as g}from"react";import{Fragment as _,jsx as v,jsxs as y}from"react/jsx-runtime";const b={active:`Live now`,draft:`Coming soon`,finished:`Closed`};function x({images:e,autoRotate:t=!1,fallback:n,name:i}){let a=m(()=>{let t=[...new Set(e?.filter(Boolean))];return!t.length&&n&&t.push(n),t},[e,n]),[o,s]=g(0),{ref:c,visible:l}=r(),[u,d]=g(!0),[f,_]=g(!1),y=h(new Set),b=a.length,x=t&&b?o%b:0;return p(()=>{let e=window.matchMedia(`(prefers-reduced-motion: reduce)`),t=()=>d(e.matches);t(),e.addEventListener(`change`,t);let n=c.current?.closest(`article`),r=()=>_(!!n?.matches(`:hover, :focus-within`)),i=e=>_(!!(n?.matches(`:hover`)||e.relatedTarget instanceof Node&&n?.contains(e.relatedTarget)));return r(),n?.addEventListener(`mouseenter`,r),n?.addEventListener(`mouseleave`,r),n?.addEventListener(`focusin`,r),n?.addEventListener(`focusout`,i),()=>{e.removeEventListener(`change`,t),n?.removeEventListener(`mouseenter`,r),n?.removeEventListener(`mouseleave`,r),n?.removeEventListener(`focusin`,r),n?.removeEventListener(`focusout`,i)}},[c]),p(()=>{if(!t||b<2||!l||u||f)return;let e=window.setInterval(()=>{s(e=>y.current.has(a[(e+1)%b]??``)?(e+1)%b:e)},5e3);return()=>window.clearInterval(e)},[t,b,a,l,u,f]),v(`div`,{className:`lockerverse-auctions__catalog-images`,ref:c,children:b?[x,...t&&b>1?[(x+1)%b]:[]].map(e=>v(`img`,{alt:e===x?i:``,"aria-hidden":e!==x,className:`lockerverse-auctions__catalog-photo`,"data-visible":e===x,height:500,loading:`lazy`,onLoad:()=>y.current.add(a[e]??``),src:a[e],width:640},a[e])):null})}function S({icon:e,label:t,value:n}){return y(`div`,{className:`lockerverse-auctions__catalog-metric`,children:[y(`dt`,{children:[e,t]}),v(`dd`,{children:n})]})}function C({auction:t,status:n=e(t),item:r}){let i=``;return n===`draft`&&(i=!r&&Date.parse(t.startAt)<=Date.now()?`Next opens `:`Opens `),n===`active`&&(i=r?`Closes `:`Ends `),y(`span`,{className:`lockerverse-auctions__catalog-timing`,children:[i,a(t,n,r)]})}function w(e,t){if(e.saleMode===`buy_now`){let r=o(e),i=t===`active`?`Buy now`:b[t];return{chip:r?`Sold out`:i,cta:r?`Sold out`:{active:`Buy now`,draft:`Preview item`,finished:`View item`}[t],price:n(e.buyNowPriceAmount??0),priceLabel:`Buy Now`,secondary:e.availableQuantity===null?`Available`:String(e.availableQuantity)}}return{chip:t===`active`?`Live`:b[t],cta:{active:`Bid now`,draft:`Preview item`,finished:`View item`}[t],price:t===`finished`&&!e.maxBidAmount?`No bids`:n(e.maxBidAmount??0),priceLabel:t===`finished`?`Final bid`:`Current`,secondary:n(e.minBidAmount??0)}}function T({auction:n,item:r,onSelect:i,href:a,autoRotateImages:o=!1,theme:l=`dark`,className:p,style:m,showDescription:h=!0,showMetrics:g=!0,showTiming:_=!0}){s(r.startAt??n.startAt,r.endAt??n.endAt);let b=e(n,r),T=r.saleMode===`buy_now`,E=w(r,b);return v(`div`,{className:[`lockerverse-auctions`,`lockerverse-auctions--card`,p].filter(Boolean).join(` `),"data-lockerverse-theme":l,style:m,children:y(`article`,{className:`lockerverse-auctions__catalog-card`,children:[a?v(`a`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,href:a,onClick:e=>{i&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),i())},children:y(`span`,{className:`lockerverse-auctions__visually-hidden`,children:[`View `,r.name]})}):v(`button`,{"aria-label":`View ${r.name}`,className:`lockerverse-auctions__catalog-select`,onClick:i,type:`button`}),y(`div`,{className:`lockerverse-auctions__catalog-media`,children:[v(x,{autoRotate:o,fallback:r.image||n.configuration.image||n.community?.banner||n.community?.thumbnail,images:r.images,name:r.name}),y(`div`,{className:`lockerverse-auctions__catalog-chips`,children:[v(`span`,{className:`lockerverse-auctions__catalog-chip`,"data-live":b===`active`,children:E.chip}),_?v(C,{auction:n,item:r,status:b}):null]}),g?y(`dl`,{className:`lockerverse-auctions__catalog-metrics`,children:[v(S,{icon:v(T?f:d,{"aria-hidden":`true`,size:16}),label:E.priceLabel,value:E.price}),v(S,{icon:v(u,{"aria-hidden":`true`,size:16}),label:T?`Available`:`Floor`,value:E.secondary})]}):null]}),y(`div`,{className:`lockerverse-auctions__catalog-body`,children:[v(`h3`,{children:r.name}),h?v(t,{className:`lockerverse-auctions__catalog-description`,description:r.description||`View auction item details.`}):null,v(`div`,{className:`lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item`,children:y(`span`,{className:`lockerverse-auctions__catalog-cta`,children:[E.cta,v(c,{"aria-hidden":`true`,size:16})]})})]})]})})}const E=[{label:`All`,value:`all`},{label:`Live`,value:`active`},{label:`Upcoming`,value:`draft`},{label:`Closed`,value:`finished`}];function D({auction:e,onSelectItem:t,filter:n,onFilterChange:r,getFilterHref:i,getItemHref:a,autoRotateImages:o=!1,theme:s=`dark`,style:c,className:l,showFilters:u=!0,showHeader:d=!0,showLineup:f=!1,onBack:p,renderItem:m}){return v(`section`,{"aria-label":e.name,className:[`lockerverse-auctions`,`lockerverse-auctions--catalog`,l].filter(Boolean).join(` `),"data-lockerverse-theme":s,style:c,children:v(O,{auction:e,...t?{onSelectItem:t}:{},...n?{filter:n}:{},...r?{onFilterChange:r}:{},...i?{getFilterHref:i}:{},...a?{getItemHref:a}:{},autoRotateImages:o,showFilters:u,showHeader:d,showLineup:f,theme:s,...c?{style:c}:{},...p?{onBack:p}:{},...m?{renderItem:m}:{}})})}function O({auction:n,onSelectItem:r,filter:o,onFilterChange:c,getFilterHref:u,getItemHref:d,autoRotateImages:f=!1,theme:m=`dark`,style:b,showFilters:x=!0,showHeader:S=!0,showLineup:C=!1,onBack:w,renderItem:D}){s(n.startAt,n.endAt,n.items);let[O,k]=g({auctionId:n.id,value:`all`}),A=h(null),j=h(null),M=x?o??(O.auctionId===n.id?O.value:`all`):`all`;p(()=>{k({auctionId:n.id,value:`all`})},[n.id,x]);let N=e=>{k({auctionId:n.id,value:e}),c?.(e)},P=i(n),F=!!w;p(()=>{F&&(A.current??j.current)?.focus()},[n.id,F,S]);let I=b?Object.fromEntries(Object.entries(b).filter(([e])=>e.startsWith(`--lockerverse-`))):void 0,L=[...n.items].sort((e,t)=>e.position-t.position||e.createdAt.localeCompare(t.createdAt)),R=L.filter(t=>M===`all`||e(n,t)===M);return y(_,{children:[w?y(`button`,{className:`lockerverse-auctions__catalog-back`,onClick:w,ref:j,type:`button`,children:[v(l,{"aria-hidden":`true`,size:16}),`Auctions`]}):null,S?y(`header`,{className:`lockerverse-auctions__catalog-header`,children:[v(`h2`,{ref:A,tabIndex:-1,children:n.name}),n.status!==`finished`&&P?y(`p`,{className:`lockerverse-auctions__catalog-next`,children:[`Next opens `,a(n,`draft`,P)]}):null,n.description?v(t,{description:n.description}):null]}):null,C?y(`div`,{className:`lockerverse-auctions__catalog-lineup`,children:[y(`div`,{children:[v(`h3`,{children:`Auction lineup`}),v(`p`,{children:`Browse the current collection.`})]}),y(`span`,{children:[R.length,` `,R.length===1?`item`:`items`]})]}):null,x?v(`fieldset`,{"aria-label":`Filter auction items`,className:`lockerverse-auctions__catalog-filters`,children:E.map(t=>{let r=u?.(t.value),i=y(_,{children:[t.label,v(`span`,{children:t.value===`all`?L.length:L.filter(r=>e(n,r)===t.value).length})]});return r?v(`a`,{"aria-current":M===t.value?`page`:void 0,href:r,onClick:e=>{c&&e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&(e.preventDefault(),N(t.value))},children:i},t.value):v(`button`,{"aria-pressed":M===t.value,onClick:()=>N(t.value),type:`button`,children:i},t.value)})}):null,R.length?v(`ul`,{className:`lockerverse-auctions__catalog-grid`,children:R.map(t=>{let i={auction:n,item:t,onSelect:()=>r?.(n,t),status:e(n,t),theme:m};d&&(i.href=d(n,t)),I&&(i.style=I);let{onSelect:a,...o}=i;return v(`li`,{children:D?D(i):v(T,{...o,...r?{onSelect:a}:{},autoRotateImages:f})},t.id)})}):v(`p`,{className:`lockerverse-auctions__catalog-empty`,children:`No items match this auction view.`})]})}export{S as a,x as i,D as n,b as o,T as r,C as s,O as t};
2
2
  //# sourceMappingURL=lockerverse-auction.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lockerverse-auction.js","names":["formatMoney"],"sources":["../src/auction-catalog-parts.tsx","../src/lockerverse-auction-item-card.tsx","../src/lockerverse-auction.tsx"],"sourcesContent":["import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { useAuctionVisibility } from \"./use-auction-visibility.ts\";\nexport const STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\nexport function CatalogImage({\n images,\n autoRotate = false,\n fallback,\n name,\n}: {\n images?: string[];\n autoRotate?: boolean;\n fallback?: string | null | undefined;\n name: string;\n}) {\n const photos = useMemo(() => {\n const unique = [...new Set(images?.filter(Boolean))];\n if (!unique.length && fallback) {\n unique.push(fallback);\n }\n return unique;\n }, [images, fallback]);\n const [index, setIndex] = useState(0);\n const { ref: imageRef, visible } = useAuctionVisibility<HTMLDivElement>();\n const [reducedMotion, setReducedMotion] = useState(true);\n const [interacting, setInteracting] = useState(false);\n const loaded = useRef(new Set<string>());\n const count = photos.length;\n const current = autoRotate && count ? index % count : 0;\n useEffect(() => {\n const motion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const updateMotion = () => setReducedMotion(motion.matches);\n updateMotion();\n motion.addEventListener(\"change\", updateMotion);\n const card = imageRef.current?.closest(\"article\");\n const updateInteraction = () =>\n setInteracting(Boolean(card?.matches(\":hover, :focus-within\")));\n const leaveFocus = (event: FocusEvent) =>\n setInteracting(\n Boolean(\n card?.matches(\":hover\") ||\n (event.relatedTarget instanceof Node &&\n card?.contains(event.relatedTarget))\n )\n );\n updateInteraction();\n card?.addEventListener(\"mouseenter\", updateInteraction);\n card?.addEventListener(\"mouseleave\", updateInteraction);\n card?.addEventListener(\"focusin\", updateInteraction);\n card?.addEventListener(\"focusout\", leaveFocus);\n return () => {\n motion.removeEventListener(\"change\", updateMotion);\n card?.removeEventListener(\"mouseenter\", updateInteraction);\n card?.removeEventListener(\"mouseleave\", updateInteraction);\n card?.removeEventListener(\"focusin\", updateInteraction);\n card?.removeEventListener(\"focusout\", leaveFocus);\n };\n }, [imageRef]);\n useEffect(() => {\n if (!autoRotate || count < 2 || !visible || reducedMotion || interacting) {\n return;\n }\n const timer = window.setInterval(() => {\n setIndex((previous) =>\n loaded.current.has(photos[(previous + 1) % count] ?? \"\")\n ? (previous + 1) % count\n : previous\n );\n }, 5000);\n return () => window.clearInterval(timer);\n }, [autoRotate, count, photos, visible, reducedMotion, interacting]);\n return (\n <div className=\"lockerverse-auctions__catalog-images\" ref={imageRef}>\n {count\n ? [\n current,\n ...(autoRotate && count > 1 ? [(current + 1) % count] : []),\n ].map((photo) => (\n <img\n alt={photo === current ? name : \"\"}\n aria-hidden={photo !== current}\n className=\"lockerverse-auctions__catalog-photo\"\n data-visible={photo === current}\n height={500}\n key={photos[photo]}\n loading=\"lazy\"\n onLoad={() => loaded.current.add(photos[photo] ?? \"\")}\n src={photos[photo]}\n width={640}\n />\n ))\n : null}\n </div>\n );\n}\nexport function Metric({\n icon,\n label,\n value,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"lockerverse-auctions__catalog-metric\">\n <dt>\n {icon}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n );\n}\nexport function Timing({\n auction,\n status = getAuctionDisplayStatus(auction),\n item,\n}: {\n auction: Auction;\n status?: LockerverseAuctionStatus;\n item?: LockerverseAuctionItem;\n}) {\n let label = \"\";\n if (status === \"draft\") {\n label =\n !item && Date.parse(auction.startAt) <= Date.now()\n ? \"Next opens \"\n : \"Opens \";\n }\n if (status === \"active\") {\n label = item ? \"Closes \" : \"Ends \";\n }\n return (\n <span className=\"lockerverse-auctions__catalog-timing\">\n {label}\n {formatAuctionBoundary(auction, status, item)}\n </span>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Clock3, Gavel, ShoppingBag } from \"lucide-react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemCardProps = {\n auction: Auction;\n item: AuctionItem;\n onSelect?: () => void;\n href?: string;\n /** Rotate photos every five seconds. Static by default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n /** Applied to the scoped card container. */\n className?: string;\n style?: LockerverseStyle;\n showDescription?: boolean;\n showMetrics?: boolean;\n showTiming?: boolean;\n};\nfunction itemCardDisplay(item: AuctionItem, status: LockerverseAuctionStatus) {\n if (item.saleMode === \"buy_now\") {\n const soldOut = isAuctionItemSoldOut(item);\n const availabilityLabel =\n status === \"active\" ? \"Buy now\" : STATUS_LABELS[status];\n const label = soldOut ? \"Sold out\" : availabilityLabel;\n return {\n chip: label,\n cta: soldOut\n ? \"Sold out\"\n : { active: \"Buy now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price: formatMoney(item.buyNowPriceAmount ?? 0),\n priceLabel: \"Buy Now\",\n secondary:\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n };\n }\n return {\n chip: status === \"active\" ? \"Live\" : STATUS_LABELS[status],\n cta: { active: \"Bid now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price:\n status === \"finished\" && !item.maxBidAmount\n ? \"No bids\"\n : formatMoney(item.maxBidAmount ?? 0),\n priceLabel: status === \"finished\" ? \"Final bid\" : \"Current\",\n secondary: formatMoney(item.minBidAmount ?? 0),\n };\n}\nexport function LockerverseAuctionItemCard({\n auction,\n item,\n onSelect,\n href,\n autoRotateImages = false,\n theme = \"dark\",\n className,\n style,\n showDescription = true,\n showMetrics = true,\n showTiming = true,\n}: LockerverseAuctionItemCardProps) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const buyNow = item.saleMode === \"buy_now\";\n const display = itemCardDisplay(item, status);\n return (\n <div\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--card\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View {item.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage\n autoRotate={autoRotateImages}\n fallback={\n item.image ||\n auction.configuration.image ||\n auction.community?.banner ||\n auction.community?.thumbnail\n }\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span\n className=\"lockerverse-auctions__catalog-chip\"\n data-live={status === \"active\"}\n >\n {display.chip}\n </span>\n {showTiming ? (\n <Timing auction={auction} item={item} status={status} />\n ) : null}\n </div>\n {showMetrics ? (\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={\n buyNow ? (\n <ShoppingBag aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )\n }\n label={display.priceLabel}\n value={display.price}\n />\n <Metric\n icon={<Clock3 aria-hidden=\"true\" size={16} />}\n label={buyNow ? \"Available\" : \"Floor\"}\n value={display.secondary}\n />\n </dl>\n ) : null}\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{item.name}</h3>\n {showDescription ? (\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={item.description || \"View auction item details.\"}\n />\n ) : null}\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n </div>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n getNextAuctionItem,\n} from \"./auction-display.ts\";\nimport { LockerverseAuctionItemCard } from \"./lockerverse-auction-item-card.tsx\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemRenderContext = {\n auction: Auction;\n item: AuctionItem;\n /** Effective auction and item status, including elapsed closing dates. */\n status: LockerverseAuctionStatus;\n /** Calls the host selection callback when one is supplied. Use href for native navigation. */\n onSelect: () => void;\n href?: string;\n /** Parent theme and Lockerverse CSS custom properties for default-card reuse. */\n theme: LockerverseTheme;\n style?: LockerverseStyle;\n};\nexport type LockerverseAuctionProps = {\n auction: Auction;\n onSelectItem?: (auction: Auction, item: AuctionItem) => void;\n /** Controlled item status filter. Omit to use the internal filter state. */\n filter?: LockerverseAuctionItemFilter;\n onFilterChange?: (filter: LockerverseAuctionItemFilter) => void;\n /** Native links preserve opening filters and items in another tab. */\n getFilterHref?: (filter: LockerverseAuctionItemFilter) => string;\n getItemHref?: (auction: Auction, item: AuctionItem) => string;\n /** Rotate catalog photos. Static images are the default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n showFilters?: boolean;\n showHeader?: boolean;\n showLineup?: boolean;\n onBack?: () => void;\n /** Replace the card inside each list item. Keep onSelect connected to your item view. */\n renderItem?: (context: LockerverseAuctionItemRenderContext) => ReactNode;\n};\nconst FILTERS = [\n { label: \"All\", value: \"all\" },\n { label: \"Live\", value: \"active\" },\n { label: \"Upcoming\", value: \"draft\" },\n { label: \"Closed\", value: \"finished\" },\n] as const;\nexport type LockerverseAuctionItemFilter = (typeof FILTERS)[number][\"value\"];\n\n/** Display one loaded auction. Fetching and item navigation stay with the host. */\nexport function LockerverseAuction({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = true,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n return (\n <section\n aria-label={auction.name}\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <AuctionContent\n auction={auction}\n {...(onSelectItem ? { onSelectItem } : {})}\n {...(controlledFilter ? { filter: controlledFilter } : {})}\n {...(onFilterChange ? { onFilterChange } : {})}\n {...(getFilterHref ? { getFilterHref } : {})}\n {...(getItemHref ? { getItemHref } : {})}\n autoRotateImages={autoRotateImages}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n {...(onBack ? { onBack } : {})}\n {...(renderItem ? { renderItem } : {})}\n />\n </section>\n );\n}\n\n/** Shared content without a second themed container when used in the browser. */\nexport function AuctionContent({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n showFilters = true,\n showHeader = true,\n showLineup = true,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const [filterState, setFilterState] = useState<{\n auctionId: string;\n value: LockerverseAuctionItemFilter;\n }>({ auctionId: auction.id, value: \"all\" });\n const headingRef = useRef<HTMLHeadingElement>(null);\n const backRef = useRef<HTMLButtonElement>(null);\n const filter = showFilters\n ? (controlledFilter ??\n (filterState.auctionId === auction.id ? filterState.value : \"all\"))\n : \"all\";\n useEffect(() => {\n setFilterState({ auctionId: auction.id, value: \"all\" });\n }, [auction.id, showFilters]);\n const changeFilter = (value: LockerverseAuctionItemFilter) => {\n setFilterState({ auctionId: auction.id, value });\n onFilterChange?.(value);\n };\n const nextItem = getNextAuctionItem(auction);\n const focusHeading = Boolean(onBack);\n useEffect(() => {\n if (focusHeading) {\n (headingRef.current ?? backRef.current)?.focus();\n }\n }, [auction.id, focusHeading, showHeader]);\n const cardStyle = style\n ? Object.fromEntries(\n Object.entries(style).filter(([key]) =>\n key.startsWith(\"--lockerverse-\")\n )\n )\n : undefined;\n const items = [...auction.items].sort(\n (left, right) =>\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n const filtered = items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(auction, item) === filter\n );\n return (\n <>\n {onBack ? (\n <button\n className=\"lockerverse-auctions__catalog-back\"\n onClick={onBack}\n ref={backRef}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={16} />\n Auctions\n </button>\n ) : null}\n {showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n {auction.name}\n </h2>\n <p className=\"lockerverse-auctions__catalog-period\">\n {formatAuctionBoundary({ ...auction, items: [] }, \"draft\")} —{\" \"}\n {formatAuctionBoundary(auction, \"active\")}\n </p>\n {auction.status !== \"finished\" && nextItem ? (\n <p className=\"lockerverse-auctions__catalog-next\">\n Next opens {formatAuctionBoundary(auction, \"draft\", nextItem)}\n </p>\n ) : null}\n {auction.description ? (\n <AuctionDescription description={auction.description} />\n ) : null}\n </header>\n ) : null}\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {filtered.length} {filtered.length === 1 ? \"item\" : \"items\"}\n </span>\n </div>\n ) : null}\n {showFilters ? (\n <fieldset\n aria-label=\"Filter auction items\"\n className=\"lockerverse-auctions__catalog-filters\"\n >\n {FILTERS.map((option) => {\n const href = getFilterHref?.(option.value);\n const label = (\n <>\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(auction, item) ===\n option.value\n ).length}\n </span>\n </>\n );\n return href ? (\n <a\n aria-current={filter === option.value ? \"page\" : undefined}\n href={href}\n key={option.value}\n onClick={(event) => {\n if (\n onFilterChange &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n changeFilter(option.value);\n }\n }}\n >\n {label}\n </a>\n ) : (\n <button\n aria-pressed={filter === option.value}\n key={option.value}\n onClick={() => changeFilter(option.value)}\n type=\"button\"\n >\n {label}\n </button>\n );\n })}\n </fieldset>\n ) : null}\n {filtered.length ? (\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {filtered.map((item) => {\n const context: LockerverseAuctionItemRenderContext = {\n auction,\n item,\n onSelect: () => onSelectItem?.(auction, item),\n status: getAuctionDisplayStatus(auction, item),\n theme,\n };\n if (getItemHref) {\n context.href = getItemHref(auction, item);\n }\n if (cardStyle) {\n context.style = cardStyle;\n }\n const { onSelect, ...cardContext } = context;\n return (\n <li key={item.id}>\n {renderItem ? (\n renderItem(context)\n ) : (\n <LockerverseAuctionItemCard\n {...cardContext}\n {...(onSelectItem ? { onSelect } : {})}\n autoRotateImages={autoRotateImages}\n />\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"lockerverse-auctions__catalog-empty\">\n No items match this auction view.\n </p>\n )}\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"lockerverse-auction.js","names":["formatMoney"],"sources":["../src/auction-catalog-parts.tsx","../src/lockerverse-auction-item-card.tsx","../src/lockerverse-auction.tsx"],"sourcesContent":["import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { type ReactNode, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n} from \"./auction-display.ts\";\nimport { useAuctionVisibility } from \"./use-auction-visibility.ts\";\nexport const STATUS_LABELS = {\n active: \"Live now\",\n draft: \"Coming soon\",\n finished: \"Closed\",\n} satisfies Record<LockerverseAuctionStatus, string>;\nexport function CatalogImage({\n images,\n autoRotate = false,\n fallback,\n name,\n}: {\n images?: string[];\n autoRotate?: boolean;\n fallback?: string | null | undefined;\n name: string;\n}) {\n const photos = useMemo(() => {\n const unique = [...new Set(images?.filter(Boolean))];\n if (!unique.length && fallback) {\n unique.push(fallback);\n }\n return unique;\n }, [images, fallback]);\n const [index, setIndex] = useState(0);\n const { ref: imageRef, visible } = useAuctionVisibility<HTMLDivElement>();\n const [reducedMotion, setReducedMotion] = useState(true);\n const [interacting, setInteracting] = useState(false);\n const loaded = useRef(new Set<string>());\n const count = photos.length;\n const current = autoRotate && count ? index % count : 0;\n useEffect(() => {\n const motion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\n const updateMotion = () => setReducedMotion(motion.matches);\n updateMotion();\n motion.addEventListener(\"change\", updateMotion);\n const card = imageRef.current?.closest(\"article\");\n const updateInteraction = () =>\n setInteracting(Boolean(card?.matches(\":hover, :focus-within\")));\n const leaveFocus = (event: FocusEvent) =>\n setInteracting(\n Boolean(\n card?.matches(\":hover\") ||\n (event.relatedTarget instanceof Node &&\n card?.contains(event.relatedTarget))\n )\n );\n updateInteraction();\n card?.addEventListener(\"mouseenter\", updateInteraction);\n card?.addEventListener(\"mouseleave\", updateInteraction);\n card?.addEventListener(\"focusin\", updateInteraction);\n card?.addEventListener(\"focusout\", leaveFocus);\n return () => {\n motion.removeEventListener(\"change\", updateMotion);\n card?.removeEventListener(\"mouseenter\", updateInteraction);\n card?.removeEventListener(\"mouseleave\", updateInteraction);\n card?.removeEventListener(\"focusin\", updateInteraction);\n card?.removeEventListener(\"focusout\", leaveFocus);\n };\n }, [imageRef]);\n useEffect(() => {\n if (!autoRotate || count < 2 || !visible || reducedMotion || interacting) {\n return;\n }\n const timer = window.setInterval(() => {\n setIndex((previous) =>\n loaded.current.has(photos[(previous + 1) % count] ?? \"\")\n ? (previous + 1) % count\n : previous\n );\n }, 5000);\n return () => window.clearInterval(timer);\n }, [autoRotate, count, photos, visible, reducedMotion, interacting]);\n return (\n <div className=\"lockerverse-auctions__catalog-images\" ref={imageRef}>\n {count\n ? [\n current,\n ...(autoRotate && count > 1 ? [(current + 1) % count] : []),\n ].map((photo) => (\n <img\n alt={photo === current ? name : \"\"}\n aria-hidden={photo !== current}\n className=\"lockerverse-auctions__catalog-photo\"\n data-visible={photo === current}\n height={500}\n key={photos[photo]}\n loading=\"lazy\"\n onLoad={() => loaded.current.add(photos[photo] ?? \"\")}\n src={photos[photo]}\n width={640}\n />\n ))\n : null}\n </div>\n );\n}\nexport function Metric({\n icon,\n label,\n value,\n}: {\n icon: ReactNode;\n label: string;\n value: string;\n}) {\n return (\n <div className=\"lockerverse-auctions__catalog-metric\">\n <dt>\n {icon}\n {label}\n </dt>\n <dd>{value}</dd>\n </div>\n );\n}\nexport function Timing({\n auction,\n status = getAuctionDisplayStatus(auction),\n item,\n}: {\n auction: Auction;\n status?: LockerverseAuctionStatus;\n item?: LockerverseAuctionItem;\n}) {\n let label = \"\";\n if (status === \"draft\") {\n label =\n !item && Date.parse(auction.startAt) <= Date.now()\n ? \"Next opens \"\n : \"Opens \";\n }\n if (status === \"active\") {\n label = item ? \"Closes \" : \"Ends \";\n }\n return (\n <span className=\"lockerverse-auctions__catalog-timing\">\n {label}\n {formatAuctionBoundary(auction, status, item)}\n </span>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ArrowRight, Clock3, Gavel, ShoppingBag } from \"lucide-react\";\nimport {\n CatalogImage,\n Metric,\n STATUS_LABELS,\n Timing,\n} from \"./auction-catalog-parts.tsx\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionMoney as formatMoney,\n getAuctionDisplayStatus,\n isAuctionItemSoldOut,\n} from \"./auction-display.ts\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemCardProps = {\n auction: Auction;\n item: AuctionItem;\n onSelect?: () => void;\n href?: string;\n /** Rotate photos every five seconds. Static by default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n /** Applied to the scoped card container. */\n className?: string;\n style?: LockerverseStyle;\n showDescription?: boolean;\n showMetrics?: boolean;\n showTiming?: boolean;\n};\nfunction itemCardDisplay(item: AuctionItem, status: LockerverseAuctionStatus) {\n if (item.saleMode === \"buy_now\") {\n const soldOut = isAuctionItemSoldOut(item);\n const availabilityLabel =\n status === \"active\" ? \"Buy now\" : STATUS_LABELS[status];\n const label = soldOut ? \"Sold out\" : availabilityLabel;\n return {\n chip: label,\n cta: soldOut\n ? \"Sold out\"\n : { active: \"Buy now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price: formatMoney(item.buyNowPriceAmount ?? 0),\n priceLabel: \"Buy Now\",\n secondary:\n item.availableQuantity === null\n ? \"Available\"\n : String(item.availableQuantity),\n };\n }\n return {\n chip: status === \"active\" ? \"Live\" : STATUS_LABELS[status],\n cta: { active: \"Bid now\", draft: \"Preview item\", finished: \"View item\" }[\n status\n ],\n price:\n status === \"finished\" && !item.maxBidAmount\n ? \"No bids\"\n : formatMoney(item.maxBidAmount ?? 0),\n priceLabel: status === \"finished\" ? \"Final bid\" : \"Current\",\n secondary: formatMoney(item.minBidAmount ?? 0),\n };\n}\nexport function LockerverseAuctionItemCard({\n auction,\n item,\n onSelect,\n href,\n autoRotateImages = false,\n theme = \"dark\",\n className,\n style,\n showDescription = true,\n showMetrics = true,\n showTiming = true,\n}: LockerverseAuctionItemCardProps) {\n useAuctionBoundary(\n item.startAt ?? auction.startAt,\n item.endAt ?? auction.endAt\n );\n const status = getAuctionDisplayStatus(auction, item);\n const buyNow = item.saleMode === \"buy_now\";\n const display = itemCardDisplay(item, status);\n return (\n <div\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--card\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <article className=\"lockerverse-auctions__catalog-card\">\n {href ? (\n <a\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n href={href}\n onClick={(event) => {\n if (\n onSelect &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n onSelect();\n }\n }}\n >\n <span className=\"lockerverse-auctions__visually-hidden\">\n View {item.name}\n </span>\n </a>\n ) : (\n <button\n aria-label={`View ${item.name}`}\n className=\"lockerverse-auctions__catalog-select\"\n onClick={onSelect}\n type=\"button\"\n />\n )}\n <div className=\"lockerverse-auctions__catalog-media\">\n <CatalogImage\n autoRotate={autoRotateImages}\n fallback={\n item.image ||\n auction.configuration.image ||\n auction.community?.banner ||\n auction.community?.thumbnail\n }\n images={item.images}\n name={item.name}\n />\n <div className=\"lockerverse-auctions__catalog-chips\">\n <span\n className=\"lockerverse-auctions__catalog-chip\"\n data-live={status === \"active\"}\n >\n {display.chip}\n </span>\n {showTiming ? (\n <Timing auction={auction} item={item} status={status} />\n ) : null}\n </div>\n {showMetrics ? (\n <dl className=\"lockerverse-auctions__catalog-metrics\">\n <Metric\n icon={\n buyNow ? (\n <ShoppingBag aria-hidden=\"true\" size={16} />\n ) : (\n <Gavel aria-hidden=\"true\" size={16} />\n )\n }\n label={display.priceLabel}\n value={display.price}\n />\n <Metric\n icon={<Clock3 aria-hidden=\"true\" size={16} />}\n label={buyNow ? \"Available\" : \"Floor\"}\n value={display.secondary}\n />\n </dl>\n ) : null}\n </div>\n <div className=\"lockerverse-auctions__catalog-body\">\n <h3>{item.name}</h3>\n {showDescription ? (\n <AuctionDescription\n className=\"lockerverse-auctions__catalog-description\"\n description={item.description || \"View auction item details.\"}\n />\n ) : null}\n <div className=\"lockerverse-auctions__catalog-footer lockerverse-auctions__catalog-footer--item\">\n <span className=\"lockerverse-auctions__catalog-cta\">\n {display.cta}\n <ArrowRight aria-hidden=\"true\" size={16} />\n </span>\n </div>\n </div>\n </article>\n </div>\n );\n}\n","import type {\n LockerverseAuction as Auction,\n LockerverseAuctionItem as AuctionItem,\n LockerverseAuctionStatus,\n} from \"@lockerverse/sdk/auctions\";\nimport { ChevronLeft } from \"lucide-react\";\nimport { type ReactNode, useEffect, useRef, useState } from \"react\";\nimport { AuctionDescription } from \"./auction-description.tsx\";\nimport {\n formatAuctionBoundary,\n getAuctionDisplayStatus,\n getNextAuctionItem,\n} from \"./auction-display.ts\";\nimport { LockerverseAuctionItemCard } from \"./lockerverse-auction-item-card.tsx\";\nimport type { LockerverseStyle, LockerverseTheme } from \"./theme.ts\";\nimport { useAuctionBoundary } from \"./use-auction-boundary.ts\";\n\nexport type LockerverseAuctionItemRenderContext = {\n auction: Auction;\n item: AuctionItem;\n /** Effective auction and item status, including elapsed closing dates. */\n status: LockerverseAuctionStatus;\n /** Calls the host selection callback when one is supplied. Use href for native navigation. */\n onSelect: () => void;\n href?: string;\n /** Parent theme and Lockerverse CSS custom properties for default-card reuse. */\n theme: LockerverseTheme;\n style?: LockerverseStyle;\n};\nexport type LockerverseAuctionProps = {\n auction: Auction;\n onSelectItem?: (auction: Auction, item: AuctionItem) => void;\n /** Controlled item status filter. Omit to use the internal filter state. */\n filter?: LockerverseAuctionItemFilter;\n onFilterChange?: (filter: LockerverseAuctionItemFilter) => void;\n /** Native links preserve opening filters and items in another tab. */\n getFilterHref?: (filter: LockerverseAuctionItemFilter) => string;\n getItemHref?: (auction: Auction, item: AuctionItem) => string;\n /** Rotate catalog photos. Static images are the default. */\n autoRotateImages?: boolean;\n theme?: LockerverseTheme;\n style?: LockerverseStyle;\n className?: string;\n showFilters?: boolean;\n showHeader?: boolean;\n /** Show the optional catalog introduction and count. Hidden by default. */\n showLineup?: boolean;\n onBack?: () => void;\n /** Replace the card inside each list item. Keep onSelect connected to your item view. */\n renderItem?: (context: LockerverseAuctionItemRenderContext) => ReactNode;\n};\nconst FILTERS = [\n { label: \"All\", value: \"all\" },\n { label: \"Live\", value: \"active\" },\n { label: \"Upcoming\", value: \"draft\" },\n { label: \"Closed\", value: \"finished\" },\n] as const;\nexport type LockerverseAuctionItemFilter = (typeof FILTERS)[number][\"value\"];\n\n/** Display one loaded auction. Fetching and item navigation stay with the host. */\nexport function LockerverseAuction({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n className,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n return (\n <section\n aria-label={auction.name}\n className={[\n \"lockerverse-auctions\",\n \"lockerverse-auctions--catalog\",\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n data-lockerverse-theme={theme}\n style={style}\n >\n <AuctionContent\n auction={auction}\n {...(onSelectItem ? { onSelectItem } : {})}\n {...(controlledFilter ? { filter: controlledFilter } : {})}\n {...(onFilterChange ? { onFilterChange } : {})}\n {...(getFilterHref ? { getFilterHref } : {})}\n {...(getItemHref ? { getItemHref } : {})}\n autoRotateImages={autoRotateImages}\n showFilters={showFilters}\n showHeader={showHeader}\n showLineup={showLineup}\n theme={theme}\n {...(style ? { style } : {})}\n {...(onBack ? { onBack } : {})}\n {...(renderItem ? { renderItem } : {})}\n />\n </section>\n );\n}\n\n/** Shared content without a second themed container when used in the browser. */\nexport function AuctionContent({\n auction,\n onSelectItem,\n filter: controlledFilter,\n onFilterChange,\n getFilterHref,\n getItemHref,\n autoRotateImages = false,\n theme = \"dark\",\n style,\n showFilters = true,\n showHeader = true,\n showLineup = false,\n onBack,\n renderItem,\n}: LockerverseAuctionProps) {\n useAuctionBoundary(auction.startAt, auction.endAt, auction.items);\n const [filterState, setFilterState] = useState<{\n auctionId: string;\n value: LockerverseAuctionItemFilter;\n }>({ auctionId: auction.id, value: \"all\" });\n const headingRef = useRef<HTMLHeadingElement>(null);\n const backRef = useRef<HTMLButtonElement>(null);\n const filter = showFilters\n ? (controlledFilter ??\n (filterState.auctionId === auction.id ? filterState.value : \"all\"))\n : \"all\";\n useEffect(() => {\n setFilterState({ auctionId: auction.id, value: \"all\" });\n }, [auction.id, showFilters]);\n const changeFilter = (value: LockerverseAuctionItemFilter) => {\n setFilterState({ auctionId: auction.id, value });\n onFilterChange?.(value);\n };\n const nextItem = getNextAuctionItem(auction);\n const focusHeading = Boolean(onBack);\n useEffect(() => {\n if (focusHeading) {\n (headingRef.current ?? backRef.current)?.focus();\n }\n }, [auction.id, focusHeading, showHeader]);\n const cardStyle = style\n ? Object.fromEntries(\n Object.entries(style).filter(([key]) =>\n key.startsWith(\"--lockerverse-\")\n )\n )\n : undefined;\n const items = [...auction.items].sort(\n (left, right) =>\n left.position - right.position ||\n left.createdAt.localeCompare(right.createdAt)\n );\n const filtered = items.filter(\n (item) =>\n filter === \"all\" || getAuctionDisplayStatus(auction, item) === filter\n );\n return (\n <>\n {onBack ? (\n <button\n className=\"lockerverse-auctions__catalog-back\"\n onClick={onBack}\n ref={backRef}\n type=\"button\"\n >\n <ChevronLeft aria-hidden=\"true\" size={16} />\n Auctions\n </button>\n ) : null}\n {showHeader ? (\n <header className=\"lockerverse-auctions__catalog-header\">\n <h2 ref={headingRef} tabIndex={-1}>\n {auction.name}\n </h2>\n {auction.status !== \"finished\" && nextItem ? (\n <p className=\"lockerverse-auctions__catalog-next\">\n Next opens {formatAuctionBoundary(auction, \"draft\", nextItem)}\n </p>\n ) : null}\n {auction.description ? (\n <AuctionDescription description={auction.description} />\n ) : null}\n </header>\n ) : null}\n {showLineup ? (\n <div className=\"lockerverse-auctions__catalog-lineup\">\n <div>\n <h3>Auction lineup</h3>\n <p>Browse the current collection.</p>\n </div>\n <span>\n {filtered.length} {filtered.length === 1 ? \"item\" : \"items\"}\n </span>\n </div>\n ) : null}\n {showFilters ? (\n <fieldset\n aria-label=\"Filter auction items\"\n className=\"lockerverse-auctions__catalog-filters\"\n >\n {FILTERS.map((option) => {\n const href = getFilterHref?.(option.value);\n const label = (\n <>\n {option.label}\n <span>\n {option.value === \"all\"\n ? items.length\n : items.filter(\n (item) =>\n getAuctionDisplayStatus(auction, item) ===\n option.value\n ).length}\n </span>\n </>\n );\n return href ? (\n <a\n aria-current={filter === option.value ? \"page\" : undefined}\n href={href}\n key={option.value}\n onClick={(event) => {\n if (\n onFilterChange &&\n event.button === 0 &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.shiftKey &&\n !event.altKey\n ) {\n event.preventDefault();\n changeFilter(option.value);\n }\n }}\n >\n {label}\n </a>\n ) : (\n <button\n aria-pressed={filter === option.value}\n key={option.value}\n onClick={() => changeFilter(option.value)}\n type=\"button\"\n >\n {label}\n </button>\n );\n })}\n </fieldset>\n ) : null}\n {filtered.length ? (\n <ul className=\"lockerverse-auctions__catalog-grid\">\n {filtered.map((item) => {\n const context: LockerverseAuctionItemRenderContext = {\n auction,\n item,\n onSelect: () => onSelectItem?.(auction, item),\n status: getAuctionDisplayStatus(auction, item),\n theme,\n };\n if (getItemHref) {\n context.href = getItemHref(auction, item);\n }\n if (cardStyle) {\n context.style = cardStyle;\n }\n const { onSelect, ...cardContext } = context;\n return (\n <li key={item.id}>\n {renderItem ? (\n renderItem(context)\n ) : (\n <LockerverseAuctionItemCard\n {...cardContext}\n {...(onSelectItem ? { onSelect } : {})}\n autoRotateImages={autoRotateImages}\n />\n )}\n </li>\n );\n })}\n </ul>\n ) : (\n <p className=\"lockerverse-auctions__catalog-empty\">\n No items match this auction view.\n </p>\n )}\n </>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,10 @@
1
1
  import { CreateLockerverseAuctionOptions, LockerverseAuction, LockerverseAuctionClient, LockerverseSdkError } from "@lockerverse/sdk/auctions";
2
+ //#region src/use-auction-return-refresh.d.ts
3
+ type AuctionRefreshOptions = {
4
+ /** Refresh after a hidden-to-visible transition. Defaults to true. */
5
+ refreshOnReturn?: boolean;
6
+ };
7
+ //#endregion
2
8
  //#region src/use-lockerverse-auctions.d.ts
3
9
  type UseLockerverseAuctionsResult = {
4
10
  client: LockerverseAuctionClient;
@@ -7,7 +13,7 @@ type UseLockerverseAuctionsResult = {
7
13
  error: LockerverseSdkError | null;
8
14
  refresh: () => void;
9
15
  };
10
- declare function useLockerverseAuctions(options: CreateLockerverseAuctionOptions): UseLockerverseAuctionsResult;
16
+ declare function useLockerverseAuctions(options: CreateLockerverseAuctionOptions, refreshOptions?: AuctionRefreshOptions): UseLockerverseAuctionsResult;
11
17
  //#endregion
12
- export { useLockerverseAuctions as n, UseLockerverseAuctionsResult as t };
18
+ export { useLockerverseAuctions as n, AuctionRefreshOptions as r, UseLockerverseAuctionsResult as t };
13
19
  //# sourceMappingURL=use-lockerverse-auctions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-lockerverse-auctions.d.ts","names":[],"sources":["../src/use-lockerverse-auctions.ts"],"mappings":";;KAUY;EACV,QAAQ;EACR,UAAU;EACV;EACA,OAAO;EACP;;iBAQc,uBACd,SAAS,kCACR"}
1
+ {"version":3,"file":"use-lockerverse-auctions.d.ts","names":[],"sources":["../src/use-auction-return-refresh.ts","../src/use-lockerverse-auctions.ts"],"mappings":";;KAEY;;EAEV;;;;KCUU;EACV,QAAQ;EACR,UAAU;EACV;EACA,OAAO;EACP;;iBAQc,uBACd,SAAS,iCACT,iBAAgB,wBACf"}
@@ -1,2 +1,2 @@
1
- import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseAuctionClient as a}from"@lockerverse/sdk/auctions";function o(o){e(`auctions`,{apiBaseUrl:o.apiBaseUrl,communitySlug:o.communitySlug,environment:o.environment,mediaBaseUrl:o.mediaBaseUrl,slug:``});let s=r(o.onError);s.current=o.onError;let[c]=i(()=>a({...o,onError:e=>s.current?.(e)})),[l,u]=i(0),[d,f]=i({auctions:null,error:null});n(()=>{let e=!0;return c.list().then(t=>{e&&f({auctions:t,error:null})},t=>{e&&f({auctions:null,error:t})}),()=>{e=!1}},[c,l]);let p=t(()=>{f({auctions:null,error:null}),u(e=>e+1)},[]);return{...d,client:c,loading:d.auctions===null&&d.error===null,refresh:p}}export{o as t};
1
+ import{t as e}from"./immutable-resource-identity.js";import{useCallback as t,useEffect as n,useRef as r,useState as i}from"react";import{createLockerverseAuctionClient as a}from"@lockerverse/sdk/auctions";function o(e,{refreshOnReturn:i=!0}){let a=r(e);a.current=e;let o=r({active:!1,pending:new Set,queued:!1,reserved:!1}),s=t(()=>{let{current:e}=o;!(e.active&&e.queued)||e.reserved||e.pending.size>0||document.visibilityState!==`visible`||(e.reserved=!0,a.current())},[]);return n(()=>{let{current:e}=o;if(e.active=i,!i)return;let t=document.visibilityState===`hidden`,n=()=>{let n=t;t=document.visibilityState===`hidden`,n&&!t&&(e.queued=!0,s())};return document.addEventListener(`visibilitychange`,n),()=>{e.active=!1,e.queued=!1,e.reserved=!1,document.removeEventListener(`visibilitychange`,n)}},[i,s]),t(()=>{let{current:e}=o,t=Symbol(`auction read`);return e.pending.add(t),e.queued=!1,e.reserved=!1,()=>{e.pending.delete(t),s()}},[s])}function s(s,c={}){e(`auctions`,{apiBaseUrl:s.apiBaseUrl,communitySlug:s.communitySlug,environment:s.environment,mediaBaseUrl:s.mediaBaseUrl,slug:``});let l=r(s.onError);l.current=s.onError;let[u]=i(()=>a({...s,onError:e=>l.current?.(e)})),d=r(0),[f,p]=i(0),[m,h]=i({auctions:null,error:null,loading:!0}),g=t(()=>{d.current+=1,h(e=>({...e,error:null,loading:!0})),p(e=>e+1)},[]),_=o(g,c);return n(()=>{let e=!0,t=d.current,n=_();return u.list().then(n=>{e&&t===d.current&&h({auctions:n,error:null,loading:!1})},n=>{e&&t===d.current&&h(e=>({...e,error:n,loading:!1}))}).finally(n),()=>{e=!1}},[u,f,_]),{...m,client:u,refresh:g}}export{o as n,s as t};
2
2
  //# sourceMappingURL=use-lockerverse-auctions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-lockerverse-auctions.js","names":[],"sources":["../src/use-lockerverse-auctions.ts"],"sourcesContent":["import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\n\nexport type UseLockerverseAuctionsResult = {\n client: LockerverseAuctionClient;\n auctions: LockerverseAuction[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\ntype AuctionLoadState = Pick<\n UseLockerverseAuctionsResult,\n \"auctions\" | \"error\"\n>;\n\nexport function useLockerverseAuctions(\n options: CreateLockerverseAuctionOptions\n): UseLockerverseAuctionsResult {\n useImmutableResourceIdentity(\"auctions\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n mediaBaseUrl: options.mediaBaseUrl,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<AuctionLoadState>({\n auctions: null,\n error: null,\n });\n useEffect(() => {\n let active = true;\n client.list().then(\n (auctions) => {\n if (active) {\n setState({ auctions, error: null });\n }\n },\n (error: LockerverseSdkError) => {\n if (active) {\n setState({ auctions: null, error });\n }\n }\n );\n return () => {\n active = false;\n };\n }, [client, revision]);\n const refresh = useCallback(() => {\n setState({ auctions: null, error: null });\n setRevision((value) => value + 1);\n }, []);\n return {\n ...state,\n client,\n loading: state.auctions === null && state.error === null,\n refresh,\n };\n}\n"],"mappings":"6MAuBA,SAAgB,EACd,EAC8B,CAC9B,EAA6B,WAAY,CACvC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,aAAc,EAAQ,aACtB,KAAM,EACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA2B,CACnD,SAAU,KACV,MAAO,IACT,CAAC,EACD,MAAgB,CACd,IAAI,EAAS,GAab,OAZA,EAAO,KAAK,CAAC,CAAC,KACX,GAAa,CACR,GACF,EAAS,CAAE,WAAU,MAAO,IAAK,CAAC,CAEtC,EACC,GAA+B,CAC1B,GACF,EAAS,CAAE,SAAU,KAAM,OAAM,CAAC,CAEtC,CACF,MACa,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,CAAQ,CAAC,EACrB,IAAM,EAAU,MAAkB,CAChC,EAAS,CAAE,SAAU,KAAM,MAAO,IAAK,CAAC,EACxC,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACL,MAAO,CACL,GAAG,EACH,SACA,QAAS,EAAM,WAAa,MAAQ,EAAM,QAAU,KACpD,SACF,CACF"}
1
+ {"version":3,"file":"use-lockerverse-auctions.js","names":[],"sources":["../src/use-auction-return-refresh.ts","../src/use-lockerverse-auctions.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from \"react\";\n\nexport type AuctionRefreshOptions = {\n /** Refresh after a hidden-to-visible transition. Defaults to true. */\n refreshOnReturn?: boolean;\n};\n\n/** Browser lifecycle only; each hook keeps ownership of its data and stale-response guard. */\nexport function useAuctionReturnRefresh(\n refresh: () => void,\n { refreshOnReturn = true }: AuctionRefreshOptions\n) {\n const refreshRef = useRef(refresh);\n refreshRef.current = refresh;\n const lifecycle = useRef<{\n active: boolean;\n queued: boolean;\n reserved: boolean;\n pending: Set<symbol>;\n }>({\n active: false,\n pending: new Set<symbol>(),\n queued: false,\n reserved: false,\n });\n const schedule = useCallback(() => {\n const { current } = lifecycle;\n if (\n // biome-ignore lint/suspicious/noUnnecessaryConditions: Effects and visibility callbacks mutate this ref after the callback is created.\n !(current.active && current.queued) ||\n current.reserved ||\n current.pending.size > 0 ||\n document.visibilityState !== \"visible\"\n ) {\n return;\n }\n // Reserve before React starts the next effect, so repeated events coalesce.\n current.reserved = true;\n refreshRef.current();\n }, []);\n\n useEffect(() => {\n const { current } = lifecycle;\n current.active = refreshOnReturn;\n if (!refreshOnReturn) {\n return;\n }\n let hidden = document.visibilityState === \"hidden\";\n const onVisibilityChange = () => {\n const wasHidden = hidden;\n hidden = document.visibilityState === \"hidden\";\n if (wasHidden && !hidden) {\n current.queued = true;\n schedule();\n }\n };\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\n return () => {\n current.active = false;\n current.queued = false;\n current.reserved = false;\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\n };\n }, [refreshOnReturn, schedule]);\n\n const startRead = useCallback(() => {\n const { current } = lifecycle;\n const request = Symbol(\"auction read\");\n current.pending.add(request);\n // A request started after a return satisfies that return, including a manual read.\n current.queued = false;\n current.reserved = false;\n return () => {\n current.pending.delete(request);\n schedule();\n };\n }, [schedule]);\n return startRead;\n}\n","import {\n type CreateLockerverseAuctionOptions,\n createLockerverseAuctionClient,\n type LockerverseAuction,\n type LockerverseAuctionClient,\n type LockerverseSdkError,\n} from \"@lockerverse/sdk/auctions\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useImmutableResourceIdentity } from \"./immutable-resource-identity.ts\";\nimport {\n type AuctionRefreshOptions,\n useAuctionReturnRefresh,\n} from \"./use-auction-return-refresh.ts\";\n\nexport type UseLockerverseAuctionsResult = {\n client: LockerverseAuctionClient;\n auctions: LockerverseAuction[] | null;\n loading: boolean;\n error: LockerverseSdkError | null;\n refresh: () => void;\n};\n\ntype AuctionLoadState = Pick<\n UseLockerverseAuctionsResult,\n \"auctions\" | \"error\" | \"loading\"\n>;\n\nexport function useLockerverseAuctions(\n options: CreateLockerverseAuctionOptions,\n refreshOptions: AuctionRefreshOptions = {}\n): UseLockerverseAuctionsResult {\n useImmutableResourceIdentity(\"auctions\", {\n apiBaseUrl: options.apiBaseUrl,\n communitySlug: options.communitySlug,\n environment: options.environment,\n mediaBaseUrl: options.mediaBaseUrl,\n slug: \"\",\n });\n const onErrorRef = useRef(options.onError);\n onErrorRef.current = options.onError;\n const [client] = useState(() =>\n createLockerverseAuctionClient({\n ...options,\n onError: (error) => onErrorRef.current?.(error),\n })\n );\n const generation = useRef(0);\n const [revision, setRevision] = useState(0);\n const [state, setState] = useState<AuctionLoadState>({\n auctions: null,\n error: null,\n loading: true,\n });\n const refresh = useCallback(() => {\n generation.current += 1;\n setState((current) => ({ ...current, error: null, loading: true }));\n setRevision((value) => value + 1);\n }, []);\n const startRead = useAuctionReturnRefresh(refresh, refreshOptions);\n\n useEffect(() => {\n let active = true;\n const requestGeneration = generation.current;\n const settleRead = startRead();\n client\n .list()\n .then(\n (auctions) => {\n if (active && requestGeneration === generation.current) {\n setState({ auctions, error: null, loading: false });\n }\n },\n (error: LockerverseSdkError) => {\n if (active && requestGeneration === generation.current) {\n setState((current) => ({ ...current, error, loading: false }));\n }\n }\n )\n .finally(settleRead);\n return () => {\n active = false;\n };\n }, [client, revision, startRead]);\n\n return {\n ...state,\n client,\n refresh,\n };\n}\n"],"mappings":"6MAQA,SAAgB,EACd,EACA,CAAE,kBAAkB,IACpB,CACA,IAAM,EAAa,EAAO,CAAO,EACjC,EAAW,QAAU,EACrB,IAAM,EAAY,EAKf,CACD,OAAQ,GACR,QAAS,IAAI,IACb,OAAQ,GACR,SAAU,EACZ,CAAC,EACK,EAAW,MAAkB,CACjC,GAAM,CAAE,WAAY,EAGlB,EAAE,EAAQ,QAAU,EAAQ,SAC5B,EAAQ,UACR,EAAQ,QAAQ,KAAO,GACvB,SAAS,kBAAoB,YAK/B,EAAQ,SAAW,GACnB,EAAW,QAAQ,EACrB,EAAG,CAAC,CAAC,EAsCL,OApCA,MAAgB,CACd,GAAM,CAAE,WAAY,EAEpB,GADA,EAAQ,OAAS,EACb,CAAC,EACH,OAEF,IAAI,EAAS,SAAS,kBAAoB,SACpC,MAA2B,CAC/B,IAAM,EAAY,EAClB,EAAS,SAAS,kBAAoB,SAClC,GAAa,CAAC,IAChB,EAAQ,OAAS,GACjB,EAAS,EAEb,EAEA,OADA,SAAS,iBAAiB,mBAAoB,CAAkB,MACnD,CACX,EAAQ,OAAS,GACjB,EAAQ,OAAS,GACjB,EAAQ,SAAW,GACnB,SAAS,oBAAoB,mBAAoB,CAAkB,CACrE,CACF,EAAG,CAAC,EAAiB,CAAQ,CAAC,EAEZ,MAAkB,CAClC,GAAM,CAAE,WAAY,EACd,EAAU,OAAO,cAAc,EAKrC,OAJA,EAAQ,QAAQ,IAAI,CAAO,EAE3B,EAAQ,OAAS,GACjB,EAAQ,SAAW,OACN,CACX,EAAQ,QAAQ,OAAO,CAAO,EAC9B,EAAS,CACX,CACF,EAAG,CAAC,CAAQ,CACG,CACjB,CCnDA,SAAgB,EACd,EACA,EAAwC,CAAC,EACX,CAC9B,EAA6B,WAAY,CACvC,WAAY,EAAQ,WACpB,cAAe,EAAQ,cACvB,YAAa,EAAQ,YACrB,aAAc,EAAQ,aACtB,KAAM,EACR,CAAC,EACD,IAAM,EAAa,EAAO,EAAQ,OAAO,EACzC,EAAW,QAAU,EAAQ,QAC7B,GAAM,CAAC,GAAU,MACf,EAA+B,CAC7B,GAAG,EACH,QAAU,GAAU,EAAW,UAAU,CAAK,CAChD,CAAC,CACH,EACM,EAAa,EAAO,CAAC,EACrB,CAAC,EAAU,GAAe,EAAS,CAAC,EACpC,CAAC,EAAO,GAAY,EAA2B,CACnD,SAAU,KACV,MAAO,KACP,QAAS,EACX,CAAC,EACK,EAAU,MAAkB,CAChC,EAAW,SAAW,EACtB,EAAU,IAAa,CAAE,GAAG,EAAS,MAAO,KAAM,QAAS,EAAK,EAAE,EAClE,EAAa,GAAU,EAAQ,CAAC,CAClC,EAAG,CAAC,CAAC,EACC,EAAY,EAAwB,EAAS,CAAc,EA0BjE,OAxBA,MAAgB,CACd,IAAI,EAAS,GACP,EAAoB,EAAW,QAC/B,EAAa,EAAU,EAgB7B,OAfA,EACG,KAAK,CAAC,CACN,KACE,GAAa,CACR,GAAU,IAAsB,EAAW,SAC7C,EAAS,CAAE,WAAU,MAAO,KAAM,QAAS,EAAM,CAAC,CAEtD,EACC,GAA+B,CAC1B,GAAU,IAAsB,EAAW,SAC7C,EAAU,IAAa,CAAE,GAAG,EAAS,QAAO,QAAS,EAAM,EAAE,CAEjE,CACF,CAAC,CACA,QAAQ,CAAU,MACR,CACX,EAAS,EACX,CACF,EAAG,CAAC,EAAQ,EAAU,CAAS,CAAC,EAEzB,CACL,GAAG,EACH,SACA,SACF,CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lockerverse/react",
3
- "version": "0.2.127-dev.1",
3
+ "version": "0.2.130-dev.1",
4
4
  "description": "Tree-shakable React payment and signup UI for Lockerverse",
5
5
  "repository": {
6
6
  "type": "git",
@@ -127,7 +127,7 @@
127
127
  "embla-carousel-react": "8.6.0",
128
128
  "lucide-react": "0.536.0",
129
129
  "valibot": "1.4.2",
130
- "@lockerverse/sdk": "0.2.127-dev.1"
130
+ "@lockerverse/sdk": "0.2.130-dev.1"
131
131
  },
132
132
  "devDependencies": {
133
133
  "@size-limit/file": "13.0.3",