@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.
- package/dist/components/account/input-otp.d.cts +2 -2
- package/dist/components/account/input-otp.d.ts +2 -2
- package/dist/components/approve-mint-dialog.cjs +150 -0
- package/dist/components/approve-mint-dialog.cjs.map +1 -0
- package/dist/components/approve-mint-dialog.d.cts +27 -0
- package/dist/components/approve-mint-dialog.d.ts +27 -0
- package/dist/components/approve-mint-dialog.js +126 -0
- package/dist/components/approve-mint-dialog.js.map +1 -0
- package/dist/components/button.d.cts +2 -2
- package/dist/components/button.d.ts +2 -2
- package/dist/components/fast-mint/fast-mint.d.cts +2 -2
- package/dist/components/fast-mint/fast-mint.d.ts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.cts +2 -2
- package/dist/components/launchpad/edition-mint-schema.d.ts +2 -2
- package/dist/components/listings-grid.cjs +147 -0
- package/dist/components/listings-grid.cjs.map +1 -0
- package/dist/components/listings-grid.d.cts +15 -0
- package/dist/components/listings-grid.d.ts +15 -0
- package/dist/components/listings-grid.js +113 -0
- package/dist/components/listings-grid.js.map +1 -0
- package/dist/components/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/index.cjs +6 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 & 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 & 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?: "
|
|
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?: "
|
|
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,
|