@medialane/ui 0.149.1 → 0.149.2
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.
|
@@ -27,6 +27,7 @@ var import_address_display = require("./address-display.js");
|
|
|
27
27
|
var import_currency_icon = require("./currency-icon.js");
|
|
28
28
|
var import_format = require("../utils/format.js");
|
|
29
29
|
var import_time = require("../utils/time.js");
|
|
30
|
+
var import_same_address = require("../utils/same-address.js");
|
|
30
31
|
var import_cn = require("../utils/cn.js");
|
|
31
32
|
var import_lucide_react = require("lucide-react");
|
|
32
33
|
function ActionButton({
|
|
@@ -57,11 +58,13 @@ function AssetMarketsTab({
|
|
|
57
58
|
onCancelClick,
|
|
58
59
|
onAcceptClick
|
|
59
60
|
}) {
|
|
61
|
+
const liveListings = activeListings.filter((o) => !(0, import_time.isExpired)(o.endTime));
|
|
62
|
+
const liveBids = activeBids.filter((o) => !(0, import_time.isExpired)(o.endTime));
|
|
60
63
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mt-4 space-y-6", children: [
|
|
61
64
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
62
65
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold text-muted-foreground mb-2", children: "Listings" }),
|
|
63
|
-
|
|
64
|
-
const isMyOrder =
|
|
66
|
+
liveListings.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground py-4 text-center", children: "No active listings." }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-xl border border-border divide-y divide-border", children: liveListings.map((order) => {
|
|
67
|
+
const isMyOrder = (0, import_same_address.isSameAddress)(order.offerer, walletAddress);
|
|
65
68
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between px-4 py-3 gap-4", children: [
|
|
66
69
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
|
|
67
70
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { className: "font-bold text-sm inline-flex items-center gap-1.5", children: [
|
|
@@ -82,7 +85,7 @@ function AssetMarketsTab({
|
|
|
82
85
|
] }),
|
|
83
86
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
|
|
84
87
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-xs font-semibold text-muted-foreground mb-2", children: "Offers" }),
|
|
85
|
-
|
|
88
|
+
liveBids.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm text-muted-foreground py-4 text-center", children: "No active offers." }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "rounded-xl border border-border divide-y divide-border", children: liveBids.map((bid) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex items-center justify-between px-4 py-3 gap-4", children: [
|
|
86
89
|
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0", children: [
|
|
87
90
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "font-bold text-sm", children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
88
91
|
(0, import_format.formatDisplayPrice)(bid.price.formatted),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/asset-markets-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { timeUntil } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { Clock, CheckCircle } from \"lucide-react\";\nimport type { ApiOrder } from \"@medialane/sdk\";\n\nfunction ActionButton({\n variant = \"default\",\n className,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: \"default\" | \"destructive\" }) {\n return (\n <button\n className={cn(\n \"inline-flex items-center justify-center h-9 rounded-md px-3 text-xs font-medium transition-colors\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface AssetMarketsTabProps {\n activeListings: ApiOrder[];\n activeBids: ApiOrder[];\n walletAddress?: string;\n isOwner: boolean;\n isProcessing: boolean;\n onBuyClick: (order: ApiOrder) => void;\n onCancelClick: (order: ApiOrder) => void;\n onAcceptClick: (order: ApiOrder) => void;\n}\n\nexport function AssetMarketsTab({\n activeListings,\n activeBids,\n walletAddress,\n isOwner,\n isProcessing,\n onBuyClick,\n onCancelClick,\n onAcceptClick,\n}: AssetMarketsTabProps) {\n return (\n <div className=\"mt-4 space-y-6\">\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Listings</p>\n {
|
|
1
|
+
{"version":3,"sources":["../../src/components/asset-markets-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { Clock, CheckCircle } from \"lucide-react\";\nimport type { ApiOrder } from \"@medialane/sdk\";\n\nfunction ActionButton({\n variant = \"default\",\n className,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: \"default\" | \"destructive\" }) {\n return (\n <button\n className={cn(\n \"inline-flex items-center justify-center h-9 rounded-md px-3 text-xs font-medium transition-colors\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface AssetMarketsTabProps {\n activeListings: ApiOrder[];\n activeBids: ApiOrder[];\n walletAddress?: string;\n isOwner: boolean;\n isProcessing: boolean;\n onBuyClick: (order: ApiOrder) => void;\n onCancelClick: (order: ApiOrder) => void;\n onAcceptClick: (order: ApiOrder) => void;\n}\n\nexport function AssetMarketsTab({\n activeListings,\n activeBids,\n walletAddress,\n isOwner,\n isProcessing,\n onBuyClick,\n onCancelClick,\n onAcceptClick,\n}: AssetMarketsTabProps) {\n // A lapsed order cannot be filled on chain, so it is not offered here\n // either. The indexer only marks orders expired on a slow sweep.\n const liveListings = activeListings.filter((o) => !isExpired(o.endTime));\n const liveBids = activeBids.filter((o) => !isExpired(o.endTime));\n\n return (\n <div className=\"mt-4 space-y-6\">\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Listings</p>\n {liveListings.length === 0 ? (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">No active listings.</p>\n ) : (\n <div className=\"rounded-xl border border-border divide-y divide-border\">\n {liveListings.map((order) => {\n const isMyOrder = isSameAddress(order.offerer, walletAddress);\n return (\n <div key={order.orderHash} className=\"flex items-center justify-between px-4 py-3 gap-4\">\n <div className=\"min-w-0\">\n <p className=\"font-bold text-sm inline-flex items-center gap-1.5\">\n {formatDisplayPrice(order.price.formatted)}\n <CurrencyIcon symbol={order.price.currency ?? \"\"} size={14} />\n </p>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mt-0.5\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(order.endTime)}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <AddressDisplay address={order.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n {isMyOrder ? (\n <ActionButton variant=\"destructive\" disabled={isProcessing} onClick={() => onCancelClick(order)}>\n Cancel\n </ActionButton>\n ) : (\n <ActionButton onClick={() => onBuyClick(order)}>Buy</ActionButton>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Offers</p>\n {liveBids.length === 0 ? (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">No active offers.</p>\n ) : (\n <div className=\"rounded-xl border border-border divide-y divide-border\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between px-4 py-3 gap-4\">\n <div className=\"min-w-0\">\n <p className=\"font-bold text-sm\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mt-0.5\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n {isOwner && (\n <ActionButton disabled={isProcessing} onClick={() => onAcceptClick(bid)}>\n <CheckCircle className=\"h-3.5 w-3.5 mr-1.5\" />\n Accept\n </ActionButton>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { AddressDisplay } from "./address-display.js";
|
|
4
4
|
import { CurrencyIcon } from "./currency-icon.js";
|
|
5
5
|
import { formatDisplayPrice } from "../utils/format.js";
|
|
6
|
-
import { timeUntil } from "../utils/time.js";
|
|
6
|
+
import { isExpired, timeUntil } from "../utils/time.js";
|
|
7
|
+
import { isSameAddress } from "../utils/same-address.js";
|
|
7
8
|
import { cn } from "../utils/cn.js";
|
|
8
9
|
import { Clock, CheckCircle } from "lucide-react";
|
|
9
10
|
function ActionButton({
|
|
@@ -34,11 +35,13 @@ function AssetMarketsTab({
|
|
|
34
35
|
onCancelClick,
|
|
35
36
|
onAcceptClick
|
|
36
37
|
}) {
|
|
38
|
+
const liveListings = activeListings.filter((o) => !isExpired(o.endTime));
|
|
39
|
+
const liveBids = activeBids.filter((o) => !isExpired(o.endTime));
|
|
37
40
|
return /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-6", children: [
|
|
38
41
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
39
42
|
/* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-muted-foreground mb-2", children: "Listings" }),
|
|
40
|
-
|
|
41
|
-
const isMyOrder =
|
|
43
|
+
liveListings.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground py-4 text-center", children: "No active listings." }) : /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-border divide-y divide-border", children: liveListings.map((order) => {
|
|
44
|
+
const isMyOrder = isSameAddress(order.offerer, walletAddress);
|
|
42
45
|
return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 gap-4", children: [
|
|
43
46
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
44
47
|
/* @__PURE__ */ jsxs("p", { className: "font-bold text-sm inline-flex items-center gap-1.5", children: [
|
|
@@ -59,7 +62,7 @@ function AssetMarketsTab({
|
|
|
59
62
|
] }),
|
|
60
63
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
61
64
|
/* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-muted-foreground mb-2", children: "Offers" }),
|
|
62
|
-
|
|
65
|
+
liveBids.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground py-4 text-center", children: "No active offers." }) : /* @__PURE__ */ jsx("div", { className: "rounded-xl border border-border divide-y divide-border", children: liveBids.map((bid) => /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between px-4 py-3 gap-4", children: [
|
|
63
66
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
64
67
|
/* @__PURE__ */ jsx("p", { className: "font-bold text-sm", children: /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
65
68
|
formatDisplayPrice(bid.price.formatted),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/asset-markets-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { timeUntil } from \"../utils/time.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { Clock, CheckCircle } from \"lucide-react\";\nimport type { ApiOrder } from \"@medialane/sdk\";\n\nfunction ActionButton({\n variant = \"default\",\n className,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: \"default\" | \"destructive\" }) {\n return (\n <button\n className={cn(\n \"inline-flex items-center justify-center h-9 rounded-md px-3 text-xs font-medium transition-colors\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface AssetMarketsTabProps {\n activeListings: ApiOrder[];\n activeBids: ApiOrder[];\n walletAddress?: string;\n isOwner: boolean;\n isProcessing: boolean;\n onBuyClick: (order: ApiOrder) => void;\n onCancelClick: (order: ApiOrder) => void;\n onAcceptClick: (order: ApiOrder) => void;\n}\n\nexport function AssetMarketsTab({\n activeListings,\n activeBids,\n walletAddress,\n isOwner,\n isProcessing,\n onBuyClick,\n onCancelClick,\n onAcceptClick,\n}: AssetMarketsTabProps) {\n return (\n <div className=\"mt-4 space-y-6\">\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Listings</p>\n {
|
|
1
|
+
{"version":3,"sources":["../../src/components/asset-markets-tab.tsx"],"sourcesContent":["\"use client\";\n\nimport { AddressDisplay } from \"./address-display.js\";\nimport { CurrencyIcon } from \"./currency-icon.js\";\nimport { formatDisplayPrice } from \"../utils/format.js\";\nimport { isExpired, timeUntil } from \"../utils/time.js\";\nimport { isSameAddress } from \"../utils/same-address.js\";\nimport { cn } from \"../utils/cn.js\";\nimport { Clock, CheckCircle } from \"lucide-react\";\nimport type { ApiOrder } from \"@medialane/sdk\";\n\nfunction ActionButton({\n variant = \"default\",\n className,\n ...props\n}: React.ButtonHTMLAttributes<HTMLButtonElement> & { variant?: \"default\" | \"destructive\" }) {\n return (\n <button\n className={cn(\n \"inline-flex items-center justify-center h-9 rounded-md px-3 text-xs font-medium transition-colors\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n variant === \"destructive\"\n ? \"bg-destructive text-destructive-foreground hover:bg-destructive/90\"\n : \"bg-primary text-primary-foreground hover:bg-primary/90\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface AssetMarketsTabProps {\n activeListings: ApiOrder[];\n activeBids: ApiOrder[];\n walletAddress?: string;\n isOwner: boolean;\n isProcessing: boolean;\n onBuyClick: (order: ApiOrder) => void;\n onCancelClick: (order: ApiOrder) => void;\n onAcceptClick: (order: ApiOrder) => void;\n}\n\nexport function AssetMarketsTab({\n activeListings,\n activeBids,\n walletAddress,\n isOwner,\n isProcessing,\n onBuyClick,\n onCancelClick,\n onAcceptClick,\n}: AssetMarketsTabProps) {\n // A lapsed order cannot be filled on chain, so it is not offered here\n // either. The indexer only marks orders expired on a slow sweep.\n const liveListings = activeListings.filter((o) => !isExpired(o.endTime));\n const liveBids = activeBids.filter((o) => !isExpired(o.endTime));\n\n return (\n <div className=\"mt-4 space-y-6\">\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Listings</p>\n {liveListings.length === 0 ? (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">No active listings.</p>\n ) : (\n <div className=\"rounded-xl border border-border divide-y divide-border\">\n {liveListings.map((order) => {\n const isMyOrder = isSameAddress(order.offerer, walletAddress);\n return (\n <div key={order.orderHash} className=\"flex items-center justify-between px-4 py-3 gap-4\">\n <div className=\"min-w-0\">\n <p className=\"font-bold text-sm inline-flex items-center gap-1.5\">\n {formatDisplayPrice(order.price.formatted)}\n <CurrencyIcon symbol={order.price.currency ?? \"\"} size={14} />\n </p>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mt-0.5\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(order.endTime)}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <AddressDisplay address={order.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n {isMyOrder ? (\n <ActionButton variant=\"destructive\" disabled={isProcessing} onClick={() => onCancelClick(order)}>\n Cancel\n </ActionButton>\n ) : (\n <ActionButton onClick={() => onBuyClick(order)}>Buy</ActionButton>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n <div>\n <p className=\"text-xs font-semibold text-muted-foreground mb-2\">Offers</p>\n {liveBids.length === 0 ? (\n <p className=\"text-sm text-muted-foreground py-4 text-center\">No active offers.</p>\n ) : (\n <div className=\"rounded-xl border border-border divide-y divide-border\">\n {liveBids.map((bid) => (\n <div key={bid.orderHash} className=\"flex items-center justify-between px-4 py-3 gap-4\">\n <div className=\"min-w-0\">\n <p className=\"font-bold text-sm\">\n <span className=\"inline-flex items-center gap-1.5\">\n {formatDisplayPrice(bid.price.formatted)}\n <CurrencyIcon symbol={bid.price.currency ?? \"\"} size={14} />\n </span>\n </p>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mt-0.5\">\n <Clock className=\"h-3 w-3\" />\n {timeUntil(bid.endTime)}\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n <AddressDisplay address={bid.offerer} chars={4} showCopy={false} className=\"text-xs text-muted-foreground\" />\n {isOwner && (\n <ActionButton disabled={isProcessing} onClick={() => onAcceptClick(bid)}>\n <CheckCircle className=\"h-3.5 w-3.5 mr-1.5\" />\n Accept\n </ActionButton>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
|