@medialane/ui 0.289.0 → 0.291.0

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.
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ "use client";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var listings_grid_exports = {};
31
+ __export(listings_grid_exports, {
32
+ ListingsGrid: () => ListingsGrid
33
+ });
34
+ module.exports = __toCommonJS(listings_grid_exports);
35
+ var import_jsx_runtime = require("react/jsx-runtime");
36
+ var import_react = require("react");
37
+ var import_sdk = require("@medialane/sdk");
38
+ var import_link = __toESM(require("./link.js"), 1);
39
+ var import_button = require("./button.js");
40
+ var import_listing_card = require("./listing-card.js");
41
+ var import_listing_card_menu = require("./listing-card-menu.js");
42
+ var import_load_more_sentinel = require("./load-more-sentinel.js");
43
+ var import_medialane_app = require("./medialane-app.js");
44
+ var import_use_orders = require("../utils/use-orders.js");
45
+ var import_use_image_url = require("../utils/use-image-url.js");
46
+ var import_use_usd_prices = require("../utils/use-usd-prices.js");
47
+ var import_empty_messages = require("../utils/empty-messages.js");
48
+ const PAGE_SIZE = 15;
49
+ const BACKEND_PAGE_SIZE = 50;
50
+ function MarketplaceListingCard({ order, onBuy }) {
51
+ const resolveImage = (0, import_use_image_url.useImageUrl)();
52
+ const usdPrices = (0, import_use_usd_prices.useUsdPrices)();
53
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
54
+ import_listing_card.ListingCard,
55
+ {
56
+ order,
57
+ onBuy,
58
+ overflowMenu: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card_menu.ListingCardMenu, { order }),
59
+ imageUrl: resolveImage(order.token?.image),
60
+ usdValue: (0, import_use_usd_prices.usdValueFor)(order.price?.formatted, order.price?.currency, usdPrices)
61
+ }
62
+ );
63
+ }
64
+ function ListingsGrid({ sort = "recent", currency, orderType = "", minPrice, maxPrice, initialOrders, onBuy }) {
65
+ const { walletAddress } = (0, import_medialane_app.useMedialaneApp)();
66
+ const [backendPage, setBackendPage] = (0, import_react.useState)(1);
67
+ const [visiblePages, setVisiblePages] = (0, import_react.useState)(1);
68
+ const [allOrders, setAllOrders] = (0, import_react.useState)(initialOrders ?? []);
69
+ const prevFilters = (0, import_react.useRef)({ sort, currency, orderType, minPrice, maxPrice });
70
+ (0, import_react.useEffect)(() => {
71
+ const f = prevFilters.current;
72
+ if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {
73
+ prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };
74
+ setBackendPage(1);
75
+ setVisiblePages(1);
76
+ setAllOrders([]);
77
+ }
78
+ }, [sort, currency, orderType, minPrice, maxPrice]);
79
+ const { orders, meta, isLoading } = (0, import_use_orders.useOrders)({
80
+ status: "ACTIVE",
81
+ sort,
82
+ ...currency ? { currency } : {},
83
+ ...minPrice ? { minPrice } : {},
84
+ ...maxPrice ? { maxPrice } : {},
85
+ page: backendPage,
86
+ limit: BACKEND_PAGE_SIZE
87
+ });
88
+ (0, import_react.useEffect)(() => {
89
+ if (isLoading) return;
90
+ if (backendPage === 1) {
91
+ setAllOrders(orders);
92
+ } else {
93
+ setAllOrders((prev) => {
94
+ const existing = new Set(prev.map((o) => o.orderHash));
95
+ const newItems = orders.filter((o) => !existing.has(o.orderHash));
96
+ return newItems.length > 0 ? [...prev, ...newItems] : prev;
97
+ });
98
+ }
99
+ }, [orders, isLoading, backendPage]);
100
+ const filteredOrders = orderType === "offers" ? allOrders.filter((o) => o.offer.itemType === "ERC20") : allOrders.filter((o) => o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155");
101
+ const visibleLimit = visiblePages * PAGE_SIZE;
102
+ const displayedOrders = filteredOrders.slice(0, visibleLimit);
103
+ const isInitialLoading = isLoading && allOrders.length === 0;
104
+ const isLoadingMore = isLoading && allOrders.length > 0;
105
+ const backendTotal = meta?.total ?? 0;
106
+ const hasBackendMore = backendTotal > 0 ? allOrders.length < backendTotal : orders.length === BACKEND_PAGE_SIZE;
107
+ const hasBufferedOrders = filteredOrders.length > displayedOrders.length;
108
+ const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;
109
+ (0, import_react.useEffect)(() => {
110
+ if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;
111
+ setBackendPage((p) => p + 1);
112
+ }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);
113
+ const isOwner = (order) => !!walletAddress && !!order.offerer && (0, import_sdk.normalizeAddress)("STARKNET", order.offerer) === (0, import_sdk.normalizeAddress)("STARKNET", walletAddress);
114
+ const handleLoadMore = () => {
115
+ setVisiblePages((p) => p + 1);
116
+ };
117
+ if (isInitialLoading || filteredOrders.length === 0 && hasBackendMore) {
118
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}, i)) });
119
+ }
120
+ if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {
121
+ const empty = orderType === "offers" ? import_empty_messages.emptyMessages.offers : import_empty_messages.emptyMessages.listings;
122
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex flex-col items-center justify-center py-24 gap-4 text-center", children: [
123
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-2xl font-bold", children: empty.title }),
124
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground max-w-sm", children: empty.description }),
125
+ orderType !== "offers" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_button.Button, { variant: "outline", asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_link.default, { href: "/create", children: "Create & List" }) })
126
+ ] });
127
+ }
128
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "space-y-6", children: [
129
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: [
130
+ displayedOrders.map((order) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MarketplaceListingCard, { order, onBuy: isOwner(order) ? void 0 : onBuy }, order.orderHash)),
131
+ isLoadingMore && Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_listing_card.ListingCardSkeleton, {}, `loading-${i}`))
132
+ ] }),
133
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_load_more_sentinel.LoadMoreSentinel, { hasMore, isLoading: isLoadingMore, onLoadMore: handleLoadMore }),
134
+ !hasMore && filteredOrders.length > PAGE_SIZE && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "text-center text-xs text-muted-foreground", children: [
135
+ "All ",
136
+ filteredOrders.length,
137
+ " ",
138
+ orderType === "offers" ? "offers" : "listings",
139
+ " shown"
140
+ ] })
141
+ ] }) });
142
+ }
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ ListingsGrid
146
+ });
147
+ //# sourceMappingURL=listings-grid.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/listings-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { normalizeAddress, type ApiOrder, type SortOrder } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Button } from \"./button.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\nimport { useUsdPrices, usdValueFor } from \"../utils/use-usd-prices.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 15;\nconst BACKEND_PAGE_SIZE = 50;\n\nexport interface ListingsGridProps {\n sort?: string;\n currency?: string;\n orderType?: string;\n minPrice?: string;\n maxPrice?: string;\n\n initialOrders?: ApiOrder[];\n onBuy: (order: ApiOrder) => void;\n}\n\nfunction MarketplaceListingCard({ order, onBuy }: { order: ApiOrder; onBuy?: (order: ApiOrder) => void }) {\n const resolveImage = useImageUrl();\n const usdPrices = useUsdPrices();\n return (\n <ListingCard\n order={order}\n onBuy={onBuy}\n overflowMenu={<ListingCardMenu order={order} />}\n imageUrl={resolveImage(order.token?.image)}\n usdValue={usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)}\n />\n );\n}\n\nexport function ListingsGrid({ sort = \"recent\", currency, orderType = \"\", minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps) {\n const { walletAddress } = useMedialaneApp();\n const [backendPage, setBackendPage] = useState(1);\n const [visiblePages, setVisiblePages] = useState(1);\n const [allOrders, setAllOrders] = useState<ApiOrder[]>(initialOrders ?? []);\n\n const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });\n useEffect(() => {\n const f = prevFilters.current;\n if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {\n prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };\n setBackendPage(1);\n setVisiblePages(1);\n setAllOrders([]);\n }\n }, [sort, currency, orderType, minPrice, maxPrice]);\n\n const { orders, meta, isLoading } = useOrders({\n status: \"ACTIVE\",\n sort: sort as SortOrder,\n ...(currency ? { currency } : {}),\n ...(minPrice ? { minPrice } : {}),\n ...(maxPrice ? { maxPrice } : {}),\n page: backendPage,\n limit: BACKEND_PAGE_SIZE,\n });\n\n useEffect(() => {\n if (isLoading) return;\n if (backendPage === 1) {\n setAllOrders(orders);\n } else {\n setAllOrders((prev) => {\n const existing = new Set(prev.map((o) => o.orderHash));\n const newItems = orders.filter((o) => !existing.has(o.orderHash));\n return newItems.length > 0 ? [...prev, ...newItems] : prev;\n });\n }\n }, [orders, isLoading, backendPage]);\n\n const filteredOrders = orderType === \"offers\"\n ? allOrders.filter((o) => o.offer.itemType === \"ERC20\")\n : allOrders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n\n const visibleLimit = visiblePages * PAGE_SIZE;\n const displayedOrders = filteredOrders.slice(0, visibleLimit);\n\n const isInitialLoading = isLoading && allOrders.length === 0;\n const isLoadingMore = isLoading && allOrders.length > 0;\n const backendTotal = meta?.total ?? 0;\n const hasBackendMore = backendTotal > 0\n ? allOrders.length < backendTotal\n : orders.length === BACKEND_PAGE_SIZE;\n const hasBufferedOrders = filteredOrders.length > displayedOrders.length;\n const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;\n\n useEffect(() => {\n if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;\n setBackendPage((p) => p + 1);\n }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);\n\n const isOwner = (order: ApiOrder) =>\n !!walletAddress && !!order.offerer && normalizeAddress(\"STARKNET\", order.offerer) === normalizeAddress(\"STARKNET\", walletAddress);\n\n const handleLoadMore = () => {\n setVisiblePages((p) => p + 1);\n };\n\n if (isInitialLoading || (filteredOrders.length === 0 && hasBackendMore)) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={i} />\n ))}\n </div>\n );\n }\n\n if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {\n const empty = orderType === \"offers\" ? emptyMessages.offers : emptyMessages.listings;\n return (\n <div className=\"flex flex-col items-center justify-center py-24 gap-4 text-center\">\n <p className=\"text-2xl font-bold\">{empty.title}</p>\n <p className=\"text-muted-foreground max-w-sm\">{empty.description}</p>\n {orderType !== \"offers\" && (\n <Button variant=\"outline\" asChild>\n <Link href=\"/create\">Create &amp; List</Link>\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {displayedOrders.map((order) => (\n <MarketplaceListingCard key={order.orderHash} order={order} onBuy={isOwner(order) ? undefined : onBuy} />\n ))}\n {isLoadingMore &&\n Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={`loading-${i}`} />\n ))}\n </div>\n\n <LoadMoreSentinel hasMore={hasMore} isLoading={isLoadingMore} onLoadMore={handleLoadMore} />\n\n {!hasMore && filteredOrders.length > PAGE_SIZE && (\n <p className=\"text-center text-xs text-muted-foreground\">\n All {filteredOrders.length} {orderType === \"offers\" ? \"offers\" : \"listings\"} shown\n </p>\n )}\n </div>\n </>\n );\n}\n"],"mappings":"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","names":["Link"]}
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ListingsGridProps {
5
+ sort?: string;
6
+ currency?: string;
7
+ orderType?: string;
8
+ minPrice?: string;
9
+ maxPrice?: string;
10
+ initialOrders?: ApiOrder[];
11
+ onBuy: (order: ApiOrder) => void;
12
+ }
13
+ declare function ListingsGrid({ sort, currency, orderType, minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { ListingsGrid, type ListingsGridProps };
@@ -0,0 +1,15 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { ApiOrder } from '@medialane/sdk';
3
+
4
+ interface ListingsGridProps {
5
+ sort?: string;
6
+ currency?: string;
7
+ orderType?: string;
8
+ minPrice?: string;
9
+ maxPrice?: string;
10
+ initialOrders?: ApiOrder[];
11
+ onBuy: (order: ApiOrder) => void;
12
+ }
13
+ declare function ListingsGrid({ sort, currency, orderType, minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps): react_jsx_runtime.JSX.Element;
14
+
15
+ export { ListingsGrid, type ListingsGridProps };
@@ -0,0 +1,113 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useEffect, useRef } from "react";
4
+ import { normalizeAddress } from "@medialane/sdk";
5
+ import Link from "./link.js";
6
+ import { Button } from "./button.js";
7
+ import { ListingCard, ListingCardSkeleton } from "./listing-card.js";
8
+ import { ListingCardMenu } from "./listing-card-menu.js";
9
+ import { LoadMoreSentinel } from "./load-more-sentinel.js";
10
+ import { useMedialaneApp } from "./medialane-app.js";
11
+ import { useOrders } from "../utils/use-orders.js";
12
+ import { useImageUrl } from "../utils/use-image-url.js";
13
+ import { useUsdPrices, usdValueFor } from "../utils/use-usd-prices.js";
14
+ import { emptyMessages } from "../utils/empty-messages.js";
15
+ const PAGE_SIZE = 15;
16
+ const BACKEND_PAGE_SIZE = 50;
17
+ function MarketplaceListingCard({ order, onBuy }) {
18
+ const resolveImage = useImageUrl();
19
+ const usdPrices = useUsdPrices();
20
+ return /* @__PURE__ */ jsx(
21
+ ListingCard,
22
+ {
23
+ order,
24
+ onBuy,
25
+ overflowMenu: /* @__PURE__ */ jsx(ListingCardMenu, { order }),
26
+ imageUrl: resolveImage(order.token?.image),
27
+ usdValue: usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)
28
+ }
29
+ );
30
+ }
31
+ function ListingsGrid({ sort = "recent", currency, orderType = "", minPrice, maxPrice, initialOrders, onBuy }) {
32
+ const { walletAddress } = useMedialaneApp();
33
+ const [backendPage, setBackendPage] = useState(1);
34
+ const [visiblePages, setVisiblePages] = useState(1);
35
+ const [allOrders, setAllOrders] = useState(initialOrders ?? []);
36
+ const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });
37
+ useEffect(() => {
38
+ const f = prevFilters.current;
39
+ if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {
40
+ prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };
41
+ setBackendPage(1);
42
+ setVisiblePages(1);
43
+ setAllOrders([]);
44
+ }
45
+ }, [sort, currency, orderType, minPrice, maxPrice]);
46
+ const { orders, meta, isLoading } = useOrders({
47
+ status: "ACTIVE",
48
+ sort,
49
+ ...currency ? { currency } : {},
50
+ ...minPrice ? { minPrice } : {},
51
+ ...maxPrice ? { maxPrice } : {},
52
+ page: backendPage,
53
+ limit: BACKEND_PAGE_SIZE
54
+ });
55
+ useEffect(() => {
56
+ if (isLoading) return;
57
+ if (backendPage === 1) {
58
+ setAllOrders(orders);
59
+ } else {
60
+ setAllOrders((prev) => {
61
+ const existing = new Set(prev.map((o) => o.orderHash));
62
+ const newItems = orders.filter((o) => !existing.has(o.orderHash));
63
+ return newItems.length > 0 ? [...prev, ...newItems] : prev;
64
+ });
65
+ }
66
+ }, [orders, isLoading, backendPage]);
67
+ const filteredOrders = orderType === "offers" ? allOrders.filter((o) => o.offer.itemType === "ERC20") : allOrders.filter((o) => o.offer.itemType === "ERC721" || o.offer.itemType === "ERC1155");
68
+ const visibleLimit = visiblePages * PAGE_SIZE;
69
+ const displayedOrders = filteredOrders.slice(0, visibleLimit);
70
+ const isInitialLoading = isLoading && allOrders.length === 0;
71
+ const isLoadingMore = isLoading && allOrders.length > 0;
72
+ const backendTotal = meta?.total ?? 0;
73
+ const hasBackendMore = backendTotal > 0 ? allOrders.length < backendTotal : orders.length === BACKEND_PAGE_SIZE;
74
+ const hasBufferedOrders = filteredOrders.length > displayedOrders.length;
75
+ const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;
76
+ useEffect(() => {
77
+ if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;
78
+ setBackendPage((p) => p + 1);
79
+ }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);
80
+ const isOwner = (order) => !!walletAddress && !!order.offerer && normalizeAddress("STARKNET", order.offerer) === normalizeAddress("STARKNET", walletAddress);
81
+ const handleLoadMore = () => {
82
+ setVisiblePages((p) => p + 1);
83
+ };
84
+ if (isInitialLoading || filteredOrders.length === 0 && hasBackendMore) {
85
+ return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(ListingCardSkeleton, {}, i)) });
86
+ }
87
+ if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {
88
+ const empty = orderType === "offers" ? emptyMessages.offers : emptyMessages.listings;
89
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center py-24 gap-4 text-center", children: [
90
+ /* @__PURE__ */ jsx("p", { className: "text-2xl font-bold", children: empty.title }),
91
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground max-w-sm", children: empty.description }),
92
+ orderType !== "offers" && /* @__PURE__ */ jsx(Button, { variant: "outline", asChild: true, children: /* @__PURE__ */ jsx(Link, { href: "/create", children: "Create & List" }) })
93
+ ] });
94
+ }
95
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-6", children: [
96
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4", children: [
97
+ displayedOrders.map((order) => /* @__PURE__ */ jsx(MarketplaceListingCard, { order, onBuy: isOwner(order) ? void 0 : onBuy }, order.orderHash)),
98
+ isLoadingMore && Array.from({ length: PAGE_SIZE }).map((_, i) => /* @__PURE__ */ jsx(ListingCardSkeleton, {}, `loading-${i}`))
99
+ ] }),
100
+ /* @__PURE__ */ jsx(LoadMoreSentinel, { hasMore, isLoading: isLoadingMore, onLoadMore: handleLoadMore }),
101
+ !hasMore && filteredOrders.length > PAGE_SIZE && /* @__PURE__ */ jsxs("p", { className: "text-center text-xs text-muted-foreground", children: [
102
+ "All ",
103
+ filteredOrders.length,
104
+ " ",
105
+ orderType === "offers" ? "offers" : "listings",
106
+ " shown"
107
+ ] })
108
+ ] }) });
109
+ }
110
+ export {
111
+ ListingsGrid
112
+ };
113
+ //# sourceMappingURL=listings-grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/listings-grid.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useEffect, useRef } from \"react\";\nimport { normalizeAddress, type ApiOrder, type SortOrder } from \"@medialane/sdk\";\nimport Link from \"./link.js\";\nimport { Button } from \"./button.js\";\nimport { ListingCard, ListingCardSkeleton } from \"./listing-card.js\";\nimport { ListingCardMenu } from \"./listing-card-menu.js\";\nimport { LoadMoreSentinel } from \"./load-more-sentinel.js\";\nimport { useMedialaneApp } from \"./medialane-app.js\";\nimport { useOrders } from \"../utils/use-orders.js\";\nimport { useImageUrl } from \"../utils/use-image-url.js\";\nimport { useUsdPrices, usdValueFor } from \"../utils/use-usd-prices.js\";\nimport { emptyMessages } from \"../utils/empty-messages.js\";\n\nconst PAGE_SIZE = 15;\nconst BACKEND_PAGE_SIZE = 50;\n\nexport interface ListingsGridProps {\n sort?: string;\n currency?: string;\n orderType?: string;\n minPrice?: string;\n maxPrice?: string;\n\n initialOrders?: ApiOrder[];\n onBuy: (order: ApiOrder) => void;\n}\n\nfunction MarketplaceListingCard({ order, onBuy }: { order: ApiOrder; onBuy?: (order: ApiOrder) => void }) {\n const resolveImage = useImageUrl();\n const usdPrices = useUsdPrices();\n return (\n <ListingCard\n order={order}\n onBuy={onBuy}\n overflowMenu={<ListingCardMenu order={order} />}\n imageUrl={resolveImage(order.token?.image)}\n usdValue={usdValueFor(order.price?.formatted, order.price?.currency, usdPrices)}\n />\n );\n}\n\nexport function ListingsGrid({ sort = \"recent\", currency, orderType = \"\", minPrice, maxPrice, initialOrders, onBuy }: ListingsGridProps) {\n const { walletAddress } = useMedialaneApp();\n const [backendPage, setBackendPage] = useState(1);\n const [visiblePages, setVisiblePages] = useState(1);\n const [allOrders, setAllOrders] = useState<ApiOrder[]>(initialOrders ?? []);\n\n const prevFilters = useRef({ sort, currency, orderType, minPrice, maxPrice });\n useEffect(() => {\n const f = prevFilters.current;\n if (f.sort !== sort || f.currency !== currency || f.orderType !== orderType || f.minPrice !== minPrice || f.maxPrice !== maxPrice) {\n prevFilters.current = { sort, currency, orderType, minPrice, maxPrice };\n setBackendPage(1);\n setVisiblePages(1);\n setAllOrders([]);\n }\n }, [sort, currency, orderType, minPrice, maxPrice]);\n\n const { orders, meta, isLoading } = useOrders({\n status: \"ACTIVE\",\n sort: sort as SortOrder,\n ...(currency ? { currency } : {}),\n ...(minPrice ? { minPrice } : {}),\n ...(maxPrice ? { maxPrice } : {}),\n page: backendPage,\n limit: BACKEND_PAGE_SIZE,\n });\n\n useEffect(() => {\n if (isLoading) return;\n if (backendPage === 1) {\n setAllOrders(orders);\n } else {\n setAllOrders((prev) => {\n const existing = new Set(prev.map((o) => o.orderHash));\n const newItems = orders.filter((o) => !existing.has(o.orderHash));\n return newItems.length > 0 ? [...prev, ...newItems] : prev;\n });\n }\n }, [orders, isLoading, backendPage]);\n\n const filteredOrders = orderType === \"offers\"\n ? allOrders.filter((o) => o.offer.itemType === \"ERC20\")\n : allOrders.filter((o) => o.offer.itemType === \"ERC721\" || o.offer.itemType === \"ERC1155\");\n\n const visibleLimit = visiblePages * PAGE_SIZE;\n const displayedOrders = filteredOrders.slice(0, visibleLimit);\n\n const isInitialLoading = isLoading && allOrders.length === 0;\n const isLoadingMore = isLoading && allOrders.length > 0;\n const backendTotal = meta?.total ?? 0;\n const hasBackendMore = backendTotal > 0\n ? allOrders.length < backendTotal\n : orders.length === BACKEND_PAGE_SIZE;\n const hasBufferedOrders = filteredOrders.length > displayedOrders.length;\n const hasMore = hasBufferedOrders || hasBackendMore || isLoadingMore;\n\n useEffect(() => {\n if (isLoading || !hasBackendMore || filteredOrders.length >= visibleLimit) return;\n setBackendPage((p) => p + 1);\n }, [filteredOrders.length, hasBackendMore, isLoading, visibleLimit]);\n\n const isOwner = (order: ApiOrder) =>\n !!walletAddress && !!order.offerer && normalizeAddress(\"STARKNET\", order.offerer) === normalizeAddress(\"STARKNET\", walletAddress);\n\n const handleLoadMore = () => {\n setVisiblePages((p) => p + 1);\n };\n\n if (isInitialLoading || (filteredOrders.length === 0 && hasBackendMore)) {\n return (\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={i} />\n ))}\n </div>\n );\n }\n\n if (filteredOrders.length === 0 && !isLoading && !hasBackendMore) {\n const empty = orderType === \"offers\" ? emptyMessages.offers : emptyMessages.listings;\n return (\n <div className=\"flex flex-col items-center justify-center py-24 gap-4 text-center\">\n <p className=\"text-2xl font-bold\">{empty.title}</p>\n <p className=\"text-muted-foreground max-w-sm\">{empty.description}</p>\n {orderType !== \"offers\" && (\n <Button variant=\"outline\" asChild>\n <Link href=\"/create\">Create &amp; List</Link>\n </Button>\n )}\n </div>\n );\n }\n\n return (\n <>\n <div className=\"space-y-6\">\n <div className=\"grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4\">\n {displayedOrders.map((order) => (\n <MarketplaceListingCard key={order.orderHash} order={order} onBuy={isOwner(order) ? undefined : onBuy} />\n ))}\n {isLoadingMore &&\n Array.from({ length: PAGE_SIZE }).map((_, i) => (\n <ListingCardSkeleton key={`loading-${i}`} />\n ))}\n </div>\n\n <LoadMoreSentinel hasMore={hasMore} isLoading={isLoadingMore} onLoadMore={handleLoadMore} />\n\n {!hasMore && filteredOrders.length > PAGE_SIZE && (\n <p className=\"text-center text-xs text-muted-foreground\">\n All {filteredOrders.length} {orderType === \"offers\" ? \"offers\" : \"listings\"} shown\n </p>\n )}\n </div>\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
@@ -10,7 +10,7 @@ declare const SheetClose: React.ForwardRefExoticComponent<SheetPrimitive.DialogC
10
10
  declare const SheetPortal: React.FC<SheetPrimitive.DialogPortalProps>;
11
11
  declare const SheetOverlay: React.ForwardRefExoticComponent<Omit<SheetPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
12
12
  declare const sheetVariants: (props?: ({
13
- side?: "bottom" | "left" | "right" | "top" | null | undefined;
13
+ side?: "left" | "right" | "bottom" | "top" | null | undefined;
14
14
  } & class_variance_authority_types.ClassProp) | undefined) => string;
15
15
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
16
16
  overlayClassName?: string;
package/dist/index.cjs CHANGED
@@ -39,6 +39,7 @@ __export(index_exports, {
39
39
  AlertDescription: () => import_alert.AlertDescription,
40
40
  AlertTitle: () => import_alert.AlertTitle,
41
41
  AnimatedTokenMedia: () => import_animated_token_media.AnimatedTokenMedia,
42
+ ApproveMintDialog: () => import_approve_mint_dialog.ApproveMintDialog,
42
43
  AssetCard: () => import_asset_card.AssetCard,
43
44
  AssetCardSkeleton: () => import_asset_card.AssetCardSkeleton,
44
45
  AssetCollectionBar: () => import_asset_collection_bar.AssetCollectionBar,
@@ -256,6 +257,7 @@ __export(index_exports, {
256
257
  ListingCard: () => import_listing_card.ListingCard,
257
258
  ListingCardMenu: () => import_listing_card_menu.ListingCardMenu,
258
259
  ListingCardSkeleton: () => import_listing_card.ListingCardSkeleton,
260
+ ListingsGrid: () => import_listings_grid.ListingsGrid,
259
261
  LoadMoreSentinel: () => import_load_more_sentinel.LoadMoreSentinel,
260
262
  MEDIA_TYPES: () => import_license_terms_builder.MEDIA_TYPES,
261
263
  MakeOfferPicker: () => import_make_offer_picker.MakeOfferPicker,
@@ -665,6 +667,7 @@ var import_activity = require("./data/activity.js");
665
667
  var import_hero_slider = require("./components/hero-slider.js");
666
668
  var import_activity_ticker = require("./components/activity-ticker.js");
667
669
  var import_listing_card = require("./components/listing-card.js");
670
+ var import_listings_grid = require("./components/listings-grid.js");
668
671
  var import_marketplace_dialog_primitives = require("./components/marketplace-dialog-primitives.js");
669
672
  var import_activity_row = require("./components/activity-row.js");
670
673
  var import_activity_timeline_row = require("./components/activity-timeline-row.js");
@@ -713,6 +716,7 @@ var import_leaderboard_panel = require("./components/rewards/leaderboard-panel.j
713
716
  var import_collection_name_claim = require("./components/collection-name-claim.js");
714
717
  var import_collection_settings = require("./components/collection-settings.js");
715
718
  var import_mint_landing = require("./components/mint-landing.js");
719
+ var import_approve_mint_dialog = require("./components/approve-mint-dialog.js");
716
720
  var import_discover_page = require("./components/discover-page.js");
717
721
  var import_discover_community_section = require("./components/discover-community-section.js");
718
722
  var import_ip_type_nav = require("./components/ip-type-nav.js");
@@ -896,6 +900,7 @@ var import_asset_accents = require("./utils/asset-accents.js");
896
900
  AlertDescription,
897
901
  AlertTitle,
898
902
  AnimatedTokenMedia,
903
+ ApproveMintDialog,
899
904
  AssetCard,
900
905
  AssetCardSkeleton,
901
906
  AssetCollectionBar,
@@ -1113,6 +1118,7 @@ var import_asset_accents = require("./utils/asset-accents.js");
1113
1118
  ListingCard,
1114
1119
  ListingCardMenu,
1115
1120
  ListingCardSkeleton,
1121
+ ListingsGrid,
1116
1122
  LoadMoreSentinel,
1117
1123
  MEDIA_TYPES,
1118
1124
  MakeOfferPicker,