diff --git a/src/modules/[chain]/nft/index.vue b/src/modules/[chain]/nft/index.vue new file mode 100644 index 00000000..bf8fc910 --- /dev/null +++ b/src/modules/[chain]/nft/index.vue @@ -0,0 +1,8 @@ + + + + diff --git a/src/modules/[chain]/nft/nftStore.ts b/src/modules/[chain]/nft/nftStore.ts new file mode 100644 index 00000000..c54b006e --- /dev/null +++ b/src/modules/[chain]/nft/nftStore.ts @@ -0,0 +1,26 @@ + +import { defineStore } from 'pinia'; + +import {useBlockchain} from '@/stores' +import { DEFAULT, NFTRestClient, type PageinatedClasses, type PageinatedNFTs } from './types'; + +export const useNFTModule = defineStore('module-nft', { + state: () => { + return { + nfts: {} as PageinatedNFTs, + classes: {} as PageinatedClasses, + }; + }, + getters: { + chain() { + return useBlockchain() + }, + client() { + const client = new NFTRestClient(this.chain.rest, DEFAULT) + return client + } + }, + actions: { + + } +}); diff --git a/src/modules/[chain]/nft/types.ts b/src/modules/[chain]/nft/types.ts new file mode 100644 index 00000000..044a7b7c --- /dev/null +++ b/src/modules/[chain]/nft/types.ts @@ -0,0 +1,108 @@ + +import { BaseRestClient } from '@/libs/client'; +import { adapter, type AbstractRegistry, type Request } from '@/libs/registry'; +import { PageRequest, type PaginatedResponse } from '@/types'; + +export interface Classes { + id: string, + name: string, + symbol: string, + description: string, + uri: string, + uri_hash: string, + data: { + type_url: string, + value: string + } +} + +export interface NFT { + class_id: string, + id: string, + uri: string, + uri_hash: string, + data: { + type_url: string, + value: string + } + } + +export interface Balance { + amount: string, +} + +export interface PageinatedClasses extends PaginatedResponse { + classes: Classes[], +} + +export interface PageinatedNFTs extends PaginatedResponse { + nfts: NFT[], +} + +export interface NFTRequestRegistry extends AbstractRegistry { + nft_classes: Request; + nft_classes_class_id: Request; + nft_supply_class_id: Request; + nft_classes_nfts: Request; + nft_classes_nfts_class_id_nft_id: Request; + nft_classes_nfts_class_id_nft_id_owner: Request<{ + owner: string + }>; + nft_balance_owner: Request; +} + +export const DEFAULT: NFTRequestRegistry = { + nft_classes: { + url: '/cosmos/nft/v1beta1/classes', + adapter, + }, + nft_classes_class_id: { + url: '/cosmos/nft/v1beta1/classes/{class_id}', + adapter, + }, + nft_supply_class_id: { + url: '/cosmos/nft/v1beta1/supply/{class_id}', + adapter, + }, + nft_classes_nfts: { + url: '/cosmos/nft/v1beta1/nfts', + adapter, + }, + nft_classes_nfts_class_id_nft_id: { + url: '/cosmos/nft/v1beta1/{class_id}/{nft_id}', + adapter, + }, + nft_classes_nfts_class_id_nft_id_owner: { + url: '/cosmos/nft/v1beta1/owner/{class_id}/{nft_id}', + adapter, + }, + nft_balance_owner: { + url: '/cosmos/nft/v1beta1/balance/{owner}/{class_id}', + adapter, + } +}; + +export class NFTRestClient extends BaseRestClient { + getClasses(pr?: PageRequest) { + if(!pr) pr = new PageRequest() + const query = `?${pr.toQueryString()}` + return this.request(this.registry.nft_classes, {}, query); + } + getClassesById(class_id: string) { + return this.request(this.registry.nft_classes_class_id, { class_id }); // `code_id` is a param in above url + } + getNFTs(class_id: string, id: string, page?: PageRequest) { + if(!page) page = new PageRequest() + const query = `?${page.toQueryString()}` + return this.request(this.registry.nft_classes_nfts_class_id_nft_id, { class_id, id }, query); + } + getNFTOwner(class_id: string, id: string) { + return this.request(this.registry.nft_classes_nfts_class_id_nft_id_owner, {class_id, id}); + } + getNFTSupply(class_id: string) { + return this.request(this.registry.nft_supply_class_id, { class_id }); + } + getBalanceOfNFT(class_id: string, owner: string) { + return this.request(this.registry.nft_balance_owner, { class_id, owner }); + } + } \ No newline at end of file diff --git a/src/plugins/i18n/locales/en.json b/src/plugins/i18n/locales/en.json index 82fcd77f..0dfed947 100644 --- a/src/plugins/i18n/locales/en.json +++ b/src/plugins/i18n/locales/en.json @@ -10,6 +10,7 @@ "cosmwasm": "Cosmwasm", "widget": "Widgets", "ibc": "IBC", + "nft": "NFT", "consensus": "Consensus", "supply": "Supply", "account": "Accounts",