@medialane/ui 0.304.0 → 0.305.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-page.cjs +151 -0
- package/dist/components/account-page.cjs.map +1 -0
- package/dist/components/account-page.d.cts +15 -0
- package/dist/components/account-page.d.ts +15 -0
- package/dist/components/account-page.js +117 -0
- package/dist/components/account-page.js.map +1 -0
- package/dist/components/button.d.cts +1 -1
- package/dist/components/button.d.ts +1 -1
- package/dist/components/creator-page.cjs +47 -68
- package/dist/components/creator-page.cjs.map +1 -1
- package/dist/components/creator-page.d.cts +2 -3
- package/dist/components/creator-page.d.ts +2 -3
- package/dist/components/creator-page.js +48 -69
- package/dist/components/creator-page.js.map +1 -1
- 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/sheet.d.cts +1 -1
- package/dist/components/sheet.d.ts +1 -1
- package/dist/components/underline-tabs.cjs +62 -0
- package/dist/components/underline-tabs.cjs.map +1 -0
- package/dist/components/underline-tabs.d.cts +20 -0
- package/dist/components/underline-tabs.d.ts +20 -0
- package/dist/components/underline-tabs.js +28 -0
- package/dist/components/underline-tabs.js.map +1 -0
- package/dist/index.cjs +8 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/media-wallet/use-erc20-balance.d.cts +1 -1
- package/dist/utils/media-wallet/use-erc20-balance.d.ts +1 -1
- package/dist/utils/query-keys.cjs +1 -0
- package/dist/utils/query-keys.cjs.map +1 -1
- package/dist/utils/query-keys.d.cts +1 -0
- package/dist/utils/query-keys.d.ts +1 -0
- package/dist/utils/query-keys.js +1 -0
- package/dist/utils/query-keys.js.map +1 -1
- package/dist/utils/use-tokens.cjs +23 -0
- package/dist/utils/use-tokens.cjs.map +1 -1
- package/dist/utils/use-tokens.d.cts +180 -1
- package/dist/utils/use-tokens.d.ts +180 -1
- package/dist/utils/use-tokens.js +23 -1
- package/dist/utils/use-tokens.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as swr_infinite from 'swr/infinite';
|
|
1
2
|
import * as _medialane_sdk from '@medialane/sdk';
|
|
2
3
|
import * as swr from 'swr';
|
|
3
4
|
import * as zod from 'zod';
|
|
@@ -356,10 +357,188 @@ declare function useTokensByOwner(address: string | null, page?: number, limit?:
|
|
|
356
357
|
supply?: string | undefined;
|
|
357
358
|
}[]>>;
|
|
358
359
|
};
|
|
360
|
+
declare function useOwnedTokens(address: string | null, limit?: number): {
|
|
361
|
+
tokens: {
|
|
362
|
+
chain: string;
|
|
363
|
+
tokenId: string;
|
|
364
|
+
owner: string | null;
|
|
365
|
+
tokenUri: string | null;
|
|
366
|
+
contractAddress: string;
|
|
367
|
+
id: string;
|
|
368
|
+
createdAt: string;
|
|
369
|
+
updatedAt: string;
|
|
370
|
+
metadataStatus: "PENDING" | "FETCHING" | "FETCHED" | "FAILED";
|
|
371
|
+
standard: "ERC721" | "ERC1155" | null;
|
|
372
|
+
metadata: {
|
|
373
|
+
name: string | null;
|
|
374
|
+
description: string | null;
|
|
375
|
+
image: string | null;
|
|
376
|
+
author: string | null;
|
|
377
|
+
animationUrl: string | null;
|
|
378
|
+
attributes: zod.objectOutputType<{
|
|
379
|
+
trait_type: zod.ZodString;
|
|
380
|
+
value: zod.ZodUnion<[zod.ZodString, zod.ZodNumber, zod.ZodBoolean]>;
|
|
381
|
+
display_type: zod.ZodOptional<zod.ZodString>;
|
|
382
|
+
}, zod.ZodTypeAny, "passthrough">[] | null;
|
|
383
|
+
ipType: string | null;
|
|
384
|
+
licenseType: string | null;
|
|
385
|
+
commercialUse: boolean | null;
|
|
386
|
+
externalUrl: string | null;
|
|
387
|
+
};
|
|
388
|
+
balances: {
|
|
389
|
+
amount: string;
|
|
390
|
+
owner: string;
|
|
391
|
+
}[] | null;
|
|
392
|
+
activeOrders: {
|
|
393
|
+
status: "ACTIVE" | "FULFILLED" | "CANCELLED" | "EXPIRED";
|
|
394
|
+
chain: string;
|
|
395
|
+
offerer: string;
|
|
396
|
+
nftContract: string | null;
|
|
397
|
+
price: {
|
|
398
|
+
currency: string | null;
|
|
399
|
+
raw: string | null;
|
|
400
|
+
formatted: string | null;
|
|
401
|
+
decimals: number;
|
|
402
|
+
};
|
|
403
|
+
endTime: string;
|
|
404
|
+
fulfiller: string | null;
|
|
405
|
+
orderHash: string;
|
|
406
|
+
startTime: string;
|
|
407
|
+
txHash: {
|
|
408
|
+
created: string | null;
|
|
409
|
+
fulfilled: string | null;
|
|
410
|
+
cancelled: string | null;
|
|
411
|
+
};
|
|
412
|
+
token: {
|
|
413
|
+
name: string | null;
|
|
414
|
+
description: string | null;
|
|
415
|
+
image: string | null;
|
|
416
|
+
animationUrl: string | null;
|
|
417
|
+
} | null;
|
|
418
|
+
offer: {
|
|
419
|
+
token: string;
|
|
420
|
+
itemType: string;
|
|
421
|
+
identifier: string;
|
|
422
|
+
startAmount: string;
|
|
423
|
+
endAmount: string;
|
|
424
|
+
};
|
|
425
|
+
id: string;
|
|
426
|
+
consideration: {
|
|
427
|
+
recipient: string;
|
|
428
|
+
token: string;
|
|
429
|
+
itemType: string;
|
|
430
|
+
identifier: string;
|
|
431
|
+
startAmount: string;
|
|
432
|
+
endAmount: string;
|
|
433
|
+
};
|
|
434
|
+
nftTokenId: string | null;
|
|
435
|
+
createdBlockNumber: string;
|
|
436
|
+
remainingAmount: string | null;
|
|
437
|
+
createdAt: string;
|
|
438
|
+
updatedAt: string;
|
|
439
|
+
parentOrderHash?: string | null | undefined;
|
|
440
|
+
counterOfferMessage?: string | null | undefined;
|
|
441
|
+
hasActiveCounterOffer?: boolean | undefined;
|
|
442
|
+
}[];
|
|
443
|
+
holderCount?: number | undefined;
|
|
444
|
+
supply?: string | undefined;
|
|
445
|
+
}[];
|
|
446
|
+
total: number | null;
|
|
447
|
+
isLoading: boolean;
|
|
448
|
+
isLoadingMore: boolean;
|
|
449
|
+
hasMore: boolean;
|
|
450
|
+
loadMore: () => undefined;
|
|
451
|
+
error: any;
|
|
452
|
+
mutate: swr_infinite.SWRInfiniteKeyedMutator<_medialane_sdk.ApiResponse<{
|
|
453
|
+
chain: string;
|
|
454
|
+
tokenId: string;
|
|
455
|
+
owner: string | null;
|
|
456
|
+
tokenUri: string | null;
|
|
457
|
+
contractAddress: string;
|
|
458
|
+
id: string;
|
|
459
|
+
createdAt: string;
|
|
460
|
+
updatedAt: string;
|
|
461
|
+
metadataStatus: "PENDING" | "FETCHING" | "FETCHED" | "FAILED";
|
|
462
|
+
standard: "ERC721" | "ERC1155" | null;
|
|
463
|
+
metadata: {
|
|
464
|
+
name: string | null;
|
|
465
|
+
description: string | null;
|
|
466
|
+
image: string | null;
|
|
467
|
+
author: string | null;
|
|
468
|
+
animationUrl: string | null;
|
|
469
|
+
attributes: zod.objectOutputType<{
|
|
470
|
+
trait_type: zod.ZodString;
|
|
471
|
+
value: zod.ZodUnion<[zod.ZodString, zod.ZodNumber, zod.ZodBoolean]>;
|
|
472
|
+
display_type: zod.ZodOptional<zod.ZodString>;
|
|
473
|
+
}, zod.ZodTypeAny, "passthrough">[] | null;
|
|
474
|
+
ipType: string | null;
|
|
475
|
+
licenseType: string | null;
|
|
476
|
+
commercialUse: boolean | null;
|
|
477
|
+
externalUrl: string | null;
|
|
478
|
+
};
|
|
479
|
+
balances: {
|
|
480
|
+
amount: string;
|
|
481
|
+
owner: string;
|
|
482
|
+
}[] | null;
|
|
483
|
+
activeOrders: {
|
|
484
|
+
status: "ACTIVE" | "FULFILLED" | "CANCELLED" | "EXPIRED";
|
|
485
|
+
chain: string;
|
|
486
|
+
offerer: string;
|
|
487
|
+
nftContract: string | null;
|
|
488
|
+
price: {
|
|
489
|
+
currency: string | null;
|
|
490
|
+
raw: string | null;
|
|
491
|
+
formatted: string | null;
|
|
492
|
+
decimals: number;
|
|
493
|
+
};
|
|
494
|
+
endTime: string;
|
|
495
|
+
fulfiller: string | null;
|
|
496
|
+
orderHash: string;
|
|
497
|
+
startTime: string;
|
|
498
|
+
txHash: {
|
|
499
|
+
created: string | null;
|
|
500
|
+
fulfilled: string | null;
|
|
501
|
+
cancelled: string | null;
|
|
502
|
+
};
|
|
503
|
+
token: {
|
|
504
|
+
name: string | null;
|
|
505
|
+
description: string | null;
|
|
506
|
+
image: string | null;
|
|
507
|
+
animationUrl: string | null;
|
|
508
|
+
} | null;
|
|
509
|
+
offer: {
|
|
510
|
+
token: string;
|
|
511
|
+
itemType: string;
|
|
512
|
+
identifier: string;
|
|
513
|
+
startAmount: string;
|
|
514
|
+
endAmount: string;
|
|
515
|
+
};
|
|
516
|
+
id: string;
|
|
517
|
+
consideration: {
|
|
518
|
+
recipient: string;
|
|
519
|
+
token: string;
|
|
520
|
+
itemType: string;
|
|
521
|
+
identifier: string;
|
|
522
|
+
startAmount: string;
|
|
523
|
+
endAmount: string;
|
|
524
|
+
};
|
|
525
|
+
nftTokenId: string | null;
|
|
526
|
+
createdBlockNumber: string;
|
|
527
|
+
remainingAmount: string | null;
|
|
528
|
+
createdAt: string;
|
|
529
|
+
updatedAt: string;
|
|
530
|
+
parentOrderHash?: string | null | undefined;
|
|
531
|
+
counterOfferMessage?: string | null | undefined;
|
|
532
|
+
hasActiveCounterOffer?: boolean | undefined;
|
|
533
|
+
}[];
|
|
534
|
+
holderCount?: number | undefined;
|
|
535
|
+
supply?: string | undefined;
|
|
536
|
+
}[]>[]>;
|
|
537
|
+
};
|
|
359
538
|
declare function useTokenHistory(contract: string | null, tokenId: string | null): {
|
|
360
539
|
history: _medialane_sdk.ApiActivity[];
|
|
361
540
|
isLoading: boolean;
|
|
362
541
|
error: any;
|
|
363
542
|
};
|
|
364
543
|
|
|
365
|
-
export { useToken, useTokenBalance, useTokenHistory, useTokensByOwner };
|
|
544
|
+
export { useOwnedTokens, useToken, useTokenBalance, useTokenHistory, useTokensByOwner };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import * as swr_infinite from 'swr/infinite';
|
|
1
2
|
import * as _medialane_sdk from '@medialane/sdk';
|
|
2
3
|
import * as swr from 'swr';
|
|
3
4
|
import * as zod from 'zod';
|
|
@@ -356,10 +357,188 @@ declare function useTokensByOwner(address: string | null, page?: number, limit?:
|
|
|
356
357
|
supply?: string | undefined;
|
|
357
358
|
}[]>>;
|
|
358
359
|
};
|
|
360
|
+
declare function useOwnedTokens(address: string | null, limit?: number): {
|
|
361
|
+
tokens: {
|
|
362
|
+
chain: string;
|
|
363
|
+
tokenId: string;
|
|
364
|
+
owner: string | null;
|
|
365
|
+
tokenUri: string | null;
|
|
366
|
+
contractAddress: string;
|
|
367
|
+
id: string;
|
|
368
|
+
createdAt: string;
|
|
369
|
+
updatedAt: string;
|
|
370
|
+
metadataStatus: "PENDING" | "FETCHING" | "FETCHED" | "FAILED";
|
|
371
|
+
standard: "ERC721" | "ERC1155" | null;
|
|
372
|
+
metadata: {
|
|
373
|
+
name: string | null;
|
|
374
|
+
description: string | null;
|
|
375
|
+
image: string | null;
|
|
376
|
+
author: string | null;
|
|
377
|
+
animationUrl: string | null;
|
|
378
|
+
attributes: zod.objectOutputType<{
|
|
379
|
+
trait_type: zod.ZodString;
|
|
380
|
+
value: zod.ZodUnion<[zod.ZodString, zod.ZodNumber, zod.ZodBoolean]>;
|
|
381
|
+
display_type: zod.ZodOptional<zod.ZodString>;
|
|
382
|
+
}, zod.ZodTypeAny, "passthrough">[] | null;
|
|
383
|
+
ipType: string | null;
|
|
384
|
+
licenseType: string | null;
|
|
385
|
+
commercialUse: boolean | null;
|
|
386
|
+
externalUrl: string | null;
|
|
387
|
+
};
|
|
388
|
+
balances: {
|
|
389
|
+
amount: string;
|
|
390
|
+
owner: string;
|
|
391
|
+
}[] | null;
|
|
392
|
+
activeOrders: {
|
|
393
|
+
status: "ACTIVE" | "FULFILLED" | "CANCELLED" | "EXPIRED";
|
|
394
|
+
chain: string;
|
|
395
|
+
offerer: string;
|
|
396
|
+
nftContract: string | null;
|
|
397
|
+
price: {
|
|
398
|
+
currency: string | null;
|
|
399
|
+
raw: string | null;
|
|
400
|
+
formatted: string | null;
|
|
401
|
+
decimals: number;
|
|
402
|
+
};
|
|
403
|
+
endTime: string;
|
|
404
|
+
fulfiller: string | null;
|
|
405
|
+
orderHash: string;
|
|
406
|
+
startTime: string;
|
|
407
|
+
txHash: {
|
|
408
|
+
created: string | null;
|
|
409
|
+
fulfilled: string | null;
|
|
410
|
+
cancelled: string | null;
|
|
411
|
+
};
|
|
412
|
+
token: {
|
|
413
|
+
name: string | null;
|
|
414
|
+
description: string | null;
|
|
415
|
+
image: string | null;
|
|
416
|
+
animationUrl: string | null;
|
|
417
|
+
} | null;
|
|
418
|
+
offer: {
|
|
419
|
+
token: string;
|
|
420
|
+
itemType: string;
|
|
421
|
+
identifier: string;
|
|
422
|
+
startAmount: string;
|
|
423
|
+
endAmount: string;
|
|
424
|
+
};
|
|
425
|
+
id: string;
|
|
426
|
+
consideration: {
|
|
427
|
+
recipient: string;
|
|
428
|
+
token: string;
|
|
429
|
+
itemType: string;
|
|
430
|
+
identifier: string;
|
|
431
|
+
startAmount: string;
|
|
432
|
+
endAmount: string;
|
|
433
|
+
};
|
|
434
|
+
nftTokenId: string | null;
|
|
435
|
+
createdBlockNumber: string;
|
|
436
|
+
remainingAmount: string | null;
|
|
437
|
+
createdAt: string;
|
|
438
|
+
updatedAt: string;
|
|
439
|
+
parentOrderHash?: string | null | undefined;
|
|
440
|
+
counterOfferMessage?: string | null | undefined;
|
|
441
|
+
hasActiveCounterOffer?: boolean | undefined;
|
|
442
|
+
}[];
|
|
443
|
+
holderCount?: number | undefined;
|
|
444
|
+
supply?: string | undefined;
|
|
445
|
+
}[];
|
|
446
|
+
total: number | null;
|
|
447
|
+
isLoading: boolean;
|
|
448
|
+
isLoadingMore: boolean;
|
|
449
|
+
hasMore: boolean;
|
|
450
|
+
loadMore: () => undefined;
|
|
451
|
+
error: any;
|
|
452
|
+
mutate: swr_infinite.SWRInfiniteKeyedMutator<_medialane_sdk.ApiResponse<{
|
|
453
|
+
chain: string;
|
|
454
|
+
tokenId: string;
|
|
455
|
+
owner: string | null;
|
|
456
|
+
tokenUri: string | null;
|
|
457
|
+
contractAddress: string;
|
|
458
|
+
id: string;
|
|
459
|
+
createdAt: string;
|
|
460
|
+
updatedAt: string;
|
|
461
|
+
metadataStatus: "PENDING" | "FETCHING" | "FETCHED" | "FAILED";
|
|
462
|
+
standard: "ERC721" | "ERC1155" | null;
|
|
463
|
+
metadata: {
|
|
464
|
+
name: string | null;
|
|
465
|
+
description: string | null;
|
|
466
|
+
image: string | null;
|
|
467
|
+
author: string | null;
|
|
468
|
+
animationUrl: string | null;
|
|
469
|
+
attributes: zod.objectOutputType<{
|
|
470
|
+
trait_type: zod.ZodString;
|
|
471
|
+
value: zod.ZodUnion<[zod.ZodString, zod.ZodNumber, zod.ZodBoolean]>;
|
|
472
|
+
display_type: zod.ZodOptional<zod.ZodString>;
|
|
473
|
+
}, zod.ZodTypeAny, "passthrough">[] | null;
|
|
474
|
+
ipType: string | null;
|
|
475
|
+
licenseType: string | null;
|
|
476
|
+
commercialUse: boolean | null;
|
|
477
|
+
externalUrl: string | null;
|
|
478
|
+
};
|
|
479
|
+
balances: {
|
|
480
|
+
amount: string;
|
|
481
|
+
owner: string;
|
|
482
|
+
}[] | null;
|
|
483
|
+
activeOrders: {
|
|
484
|
+
status: "ACTIVE" | "FULFILLED" | "CANCELLED" | "EXPIRED";
|
|
485
|
+
chain: string;
|
|
486
|
+
offerer: string;
|
|
487
|
+
nftContract: string | null;
|
|
488
|
+
price: {
|
|
489
|
+
currency: string | null;
|
|
490
|
+
raw: string | null;
|
|
491
|
+
formatted: string | null;
|
|
492
|
+
decimals: number;
|
|
493
|
+
};
|
|
494
|
+
endTime: string;
|
|
495
|
+
fulfiller: string | null;
|
|
496
|
+
orderHash: string;
|
|
497
|
+
startTime: string;
|
|
498
|
+
txHash: {
|
|
499
|
+
created: string | null;
|
|
500
|
+
fulfilled: string | null;
|
|
501
|
+
cancelled: string | null;
|
|
502
|
+
};
|
|
503
|
+
token: {
|
|
504
|
+
name: string | null;
|
|
505
|
+
description: string | null;
|
|
506
|
+
image: string | null;
|
|
507
|
+
animationUrl: string | null;
|
|
508
|
+
} | null;
|
|
509
|
+
offer: {
|
|
510
|
+
token: string;
|
|
511
|
+
itemType: string;
|
|
512
|
+
identifier: string;
|
|
513
|
+
startAmount: string;
|
|
514
|
+
endAmount: string;
|
|
515
|
+
};
|
|
516
|
+
id: string;
|
|
517
|
+
consideration: {
|
|
518
|
+
recipient: string;
|
|
519
|
+
token: string;
|
|
520
|
+
itemType: string;
|
|
521
|
+
identifier: string;
|
|
522
|
+
startAmount: string;
|
|
523
|
+
endAmount: string;
|
|
524
|
+
};
|
|
525
|
+
nftTokenId: string | null;
|
|
526
|
+
createdBlockNumber: string;
|
|
527
|
+
remainingAmount: string | null;
|
|
528
|
+
createdAt: string;
|
|
529
|
+
updatedAt: string;
|
|
530
|
+
parentOrderHash?: string | null | undefined;
|
|
531
|
+
counterOfferMessage?: string | null | undefined;
|
|
532
|
+
hasActiveCounterOffer?: boolean | undefined;
|
|
533
|
+
}[];
|
|
534
|
+
holderCount?: number | undefined;
|
|
535
|
+
supply?: string | undefined;
|
|
536
|
+
}[]>[]>;
|
|
537
|
+
};
|
|
359
538
|
declare function useTokenHistory(contract: string | null, tokenId: string | null): {
|
|
360
539
|
history: _medialane_sdk.ApiActivity[];
|
|
361
540
|
isLoading: boolean;
|
|
362
541
|
error: any;
|
|
363
542
|
};
|
|
364
543
|
|
|
365
|
-
export { useToken, useTokenBalance, useTokenHistory, useTokensByOwner };
|
|
544
|
+
export { useOwnedTokens, useToken, useTokenBalance, useTokenHistory, useTokensByOwner };
|
package/dist/utils/use-tokens.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import useSWR from "swr";
|
|
4
|
+
import useSWRInfinite from "swr/infinite";
|
|
4
5
|
import { useMedialaneClient } from "./use-medialane-client.js";
|
|
5
|
-
import { queryKeys } from "./query-keys.js";
|
|
6
|
+
import { QUERY_PREFIX, queryKeys } from "./query-keys.js";
|
|
6
7
|
const EMPTY_TOKENS = [];
|
|
7
8
|
const INDEXING_POLL_MS = 1e4;
|
|
8
9
|
const INDEXING_WINDOW_MS = 6e4;
|
|
@@ -57,6 +58,26 @@ function useTokensByOwner(address, page = 1, limit = 20, refreshMs = 6e4) {
|
|
|
57
58
|
mutate
|
|
58
59
|
};
|
|
59
60
|
}
|
|
61
|
+
function useOwnedTokens(address, limit = 20) {
|
|
62
|
+
const client = useMedialaneClient();
|
|
63
|
+
const { data, error, isLoading, isValidating, setSize, mutate } = useSWRInfinite(
|
|
64
|
+
(index) => address ? [QUERY_PREFIX.tokensOwnedPages, address, limit, index + 1] : null,
|
|
65
|
+
([, owner, pageSize, page]) => client.api.tokens.ownedBy(owner, { page, limit: pageSize }),
|
|
66
|
+
{ revalidateOnFocus: false, revalidateFirstPage: false }
|
|
67
|
+
);
|
|
68
|
+
const tokens = data ? data.flatMap((page) => page.data) : EMPTY_TOKENS;
|
|
69
|
+
const total = data?.[0]?.meta?.total ?? null;
|
|
70
|
+
return {
|
|
71
|
+
tokens,
|
|
72
|
+
total,
|
|
73
|
+
isLoading,
|
|
74
|
+
isLoadingMore: isValidating,
|
|
75
|
+
hasMore: total !== null && tokens.length < total,
|
|
76
|
+
loadMore: () => void setSize((size) => size + 1),
|
|
77
|
+
error,
|
|
78
|
+
mutate
|
|
79
|
+
};
|
|
80
|
+
}
|
|
60
81
|
function useTokenHistory(contract, tokenId) {
|
|
61
82
|
const client = useMedialaneClient();
|
|
62
83
|
const { data, error, isLoading } = useSWR(
|
|
@@ -67,6 +88,7 @@ function useTokenHistory(contract, tokenId) {
|
|
|
67
88
|
return { history: data?.data ?? [], isLoading, error };
|
|
68
89
|
}
|
|
69
90
|
export {
|
|
91
|
+
useOwnedTokens,
|
|
70
92
|
useToken,
|
|
71
93
|
useTokenBalance,
|
|
72
94
|
useTokenHistory,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/use-tokens.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport useSWR from \"swr\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { queryKeys } from \"./query-keys.js\";\n\nconst EMPTY_TOKENS: ApiToken[] = [];\n\nconst INDEXING_POLL_MS = 10_000;\nconst INDEXING_WINDOW_MS = 60_000;\n\nfunction isNotIndexedYet(error: unknown): boolean {\n return Boolean(\n error && typeof error === \"object\" && (error as { status?: unknown }).status === 404,\n );\n}\n\nexport function useToken( contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient();\n const [startedAt] = useState(() => Date.now());\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.token(contract, tokenId) : null,\n () => client.api.tokens.get(contract!, tokenId!),\n {\n revalidateOnFocus: false,\n shouldRetryOnError: false,\n refreshInterval: (latest) =>\n latest || Date.now() - startedAt > INDEXING_WINDOW_MS ? 0 : INDEXING_POLL_MS,\n }\n );\n\n const token = data ?? null;\n const withinWindow = Date.now() - startedAt <= INDEXING_WINDOW_MS;\n\n return {\n token,\n isLoading,\n isIndexing: !token && isNotIndexedYet(error) && withinWindow,\n error: isNotIndexedYet(error) ? undefined : error,\n mutate,\n };\n}\n\nexport function useTokenBalance(\n contract: string | null,\n tokenId: string | null,\n owner: string | null | undefined,\n) {\n const client = useMedialaneClient();\n\n const { data, mutate } = useSWR(\n contract && tokenId && owner ? queryKeys.tokenBalance(contract, tokenId, owner) : null,\n () => client.api.tokens.balance(contract!, tokenId!, owner!),\n { revalidateOnFocus: false }\n );\n\n return { amount: data?.amount ?? null, mutate };\n}\n\nexport function useTokensByOwner(\n address: string | null,\n page = 1,\n limit = 20,\n refreshMs = 60_000,\n) {\n const client = useMedialaneClient();\n\n const { data, error, isLoading, mutate } = useSWR(\n address ? queryKeys.tokensOwned(address, page, limit) : null,\n () => client.api.tokens.ownedBy(address!, { page: page, limit: limit }),\n { revalidateOnFocus: false, refreshInterval: refreshMs, revalidateOnMount: true }\n );\n\n return {\n tokens: data?.data ?? EMPTY_TOKENS,\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useTokenHistory( contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient();\n\n const { data, error, isLoading } = useSWR(\n contract && tokenId ? queryKeys.tokenHistory(contract, tokenId) : null,\n () => client.api.tokens.history(contract!, tokenId!),\n { revalidateOnFocus: false }\n );\n\n return { history: data?.data ?? [], isLoading, error };\n}\n\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,OAAO,YAAY;
|
|
1
|
+
{"version":3,"sources":["../../src/utils/use-tokens.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport useSWR from \"swr\";\nimport useSWRInfinite from \"swr/infinite\";\nimport type { ApiToken } from \"@medialane/sdk\";\nimport { useMedialaneClient } from \"./use-medialane-client.js\";\nimport { QUERY_PREFIX, queryKeys } from \"./query-keys.js\";\n\nconst EMPTY_TOKENS: ApiToken[] = [];\n\nconst INDEXING_POLL_MS = 10_000;\nconst INDEXING_WINDOW_MS = 60_000;\n\nfunction isNotIndexedYet(error: unknown): boolean {\n return Boolean(\n error && typeof error === \"object\" && (error as { status?: unknown }).status === 404,\n );\n}\n\nexport function useToken( contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient();\n const [startedAt] = useState(() => Date.now());\n\n const { data, error, isLoading, mutate } = useSWR(\n contract && tokenId ? queryKeys.token(contract, tokenId) : null,\n () => client.api.tokens.get(contract!, tokenId!),\n {\n revalidateOnFocus: false,\n shouldRetryOnError: false,\n refreshInterval: (latest) =>\n latest || Date.now() - startedAt > INDEXING_WINDOW_MS ? 0 : INDEXING_POLL_MS,\n }\n );\n\n const token = data ?? null;\n const withinWindow = Date.now() - startedAt <= INDEXING_WINDOW_MS;\n\n return {\n token,\n isLoading,\n isIndexing: !token && isNotIndexedYet(error) && withinWindow,\n error: isNotIndexedYet(error) ? undefined : error,\n mutate,\n };\n}\n\nexport function useTokenBalance(\n contract: string | null,\n tokenId: string | null,\n owner: string | null | undefined,\n) {\n const client = useMedialaneClient();\n\n const { data, mutate } = useSWR(\n contract && tokenId && owner ? queryKeys.tokenBalance(contract, tokenId, owner) : null,\n () => client.api.tokens.balance(contract!, tokenId!, owner!),\n { revalidateOnFocus: false }\n );\n\n return { amount: data?.amount ?? null, mutate };\n}\n\nexport function useTokensByOwner(\n address: string | null,\n page = 1,\n limit = 20,\n refreshMs = 60_000,\n) {\n const client = useMedialaneClient();\n\n const { data, error, isLoading, mutate } = useSWR(\n address ? queryKeys.tokensOwned(address, page, limit) : null,\n () => client.api.tokens.ownedBy(address!, { page: page, limit: limit }),\n { revalidateOnFocus: false, refreshInterval: refreshMs, revalidateOnMount: true }\n );\n\n return {\n tokens: data?.data ?? EMPTY_TOKENS,\n meta: data?.meta,\n isLoading,\n error,\n mutate,\n };\n}\n\nexport function useOwnedTokens(address: string | null, limit = 20) {\n const client = useMedialaneClient();\n\n const { data, error, isLoading, isValidating, setSize, mutate } = useSWRInfinite(\n (index) => (address ? ([QUERY_PREFIX.tokensOwnedPages, address, limit, index + 1] as const) : null),\n ([, owner, pageSize, page]) => client.api.tokens.ownedBy(owner, { page, limit: pageSize }),\n { revalidateOnFocus: false, revalidateFirstPage: false },\n );\n\n const tokens = data ? data.flatMap((page) => page.data) : EMPTY_TOKENS;\n const total = data?.[0]?.meta?.total ?? null;\n\n return {\n tokens,\n total,\n isLoading,\n isLoadingMore: isValidating,\n hasMore: total !== null && tokens.length < total,\n loadMore: () => void setSize((size) => size + 1),\n error,\n mutate,\n };\n}\n\nexport function useTokenHistory( contract: string | null, tokenId: string | null) {\n const client = useMedialaneClient();\n\n const { data, error, isLoading } = useSWR(\n contract && tokenId ? queryKeys.tokenHistory(contract, tokenId) : null,\n () => client.api.tokens.history(contract!, tokenId!),\n { revalidateOnFocus: false }\n );\n\n return { history: data?.data ?? [], isLoading, error };\n}\n\n"],"mappings":"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","names":[]}
|