Skip to content

Commit

Permalink
feat: fetch EVM NFTs from OnFinality
Browse files Browse the repository at this point in the history
  • Loading branch information
tien committed Dec 16, 2023
1 parent cc72990 commit ff1b3c8
Show file tree
Hide file tree
Showing 14 changed files with 4,236 additions and 5,840 deletions.
4 changes: 2 additions & 2 deletions apps/web/src/domains/nfts/worker.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
createAcalaNftAsyncGenerator,
createBitCountryNftAsyncGenerator,
createEvmNftAsyncGenerator,
createOnfinalityNftGenerator,
createRmrk2NftAsyncGenerator,
createStatemineNftAsyncGenerator,
createUniqueNetworkNftAsyncGenerator,
Expand All @@ -14,7 +14,7 @@ const subscribeNfts = (address: string, options: { batchSize: number }) =>
new Observable<Nft | { error: unknown }>(observer => {
const promises = (
address.startsWith('0x')
? [createEvmNftAsyncGenerator]
? [createOnfinalityNftGenerator]
: [
createAcalaNftAsyncGenerator,
createBitCountryNftAsyncGenerator,
Expand Down
66 changes: 66 additions & 0 deletions packages/nft/generated/gql/onfinality/fragment-masking.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import type { ResultOf, DocumentTypeDecoration, TypedDocumentNode } from '@graphql-typed-document-node/core'
import type { FragmentDefinitionNode } from 'graphql'
import type { Incremental } from './graphql.js'

export type FragmentType<TDocumentType extends DocumentTypeDecoration<any, any>> =
TDocumentType extends DocumentTypeDecoration<infer TType, any>
? [TType] extends [{ ' $fragmentName'?: infer TKey }]
? TKey extends string
? { ' $fragmentRefs'?: { [key in TKey]: TType } }
: never
: never
: never

// return non-nullable if `fragmentType` is non-nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>
): TType
// return nullable if `fragmentType` is nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null | undefined
): TType | null | undefined
// return array of non-nullable if `fragmentType` is array of non-nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
): ReadonlyArray<TType>
// return array of nullable if `fragmentType` is array of nullable
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>> | null | undefined
): ReadonlyArray<TType> | null | undefined
export function useFragment<TType>(
_documentNode: DocumentTypeDecoration<TType, any>,
fragmentType:
| FragmentType<DocumentTypeDecoration<TType, any>>
| ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>
| null
| undefined
): TType | ReadonlyArray<TType> | null | undefined {
return fragmentType as any
}

export function makeFragmentData<F extends DocumentTypeDecoration<any, any>, FT extends ResultOf<F>>(
data: FT,
_fragment: F
): FragmentType<F> {
return data as FragmentType<F>
}
export function isFragmentReady<TQuery, TFrag>(
queryNode: DocumentTypeDecoration<TQuery, any>,
fragmentNode: TypedDocumentNode<TFrag>,
data: FragmentType<TypedDocumentNode<Incremental<TFrag>, any>> | null | undefined
): data is FragmentType<typeof fragmentNode> {
const deferredFields = (queryNode as { __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> } }).__meta__
?.deferredFields

if (!deferredFields) return true

const fragDef = fragmentNode.definitions[0] as FragmentDefinitionNode | undefined
const fragName = fragDef?.name?.value

const fields = (fragName && deferredFields[fragName]) || []
return fields.length > 0 && fields.every(field => data && field in data)
}
50 changes: 50 additions & 0 deletions packages/nft/generated/gql/onfinality/gql.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/* eslint-disable */
import * as types from './graphql.js'
import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'

/**
* Map of all GraphQL operations in the project.
*
* This map has several performance disadvantages:
* 1. It is not tree-shakeable, so it will include all operations in the project.
* 2. It is not minifiable, so the string of a GraphQL query will be multiple times inside the bundle.
* 3. It does not support dead code elimination, so it will add unused operations.
*
* Therefore it is highly recommended to use the babel or swc plugin for production.
*/
const documents = {
'\n query nfts($address: String!, $after: Cursor, $first: Int) {\n nfts(after: $after, first: $first, filter: { currentOwner: { equalToInsensitive: $address } }) {\n edges {\n node {\n id\n tokenId\n collection {\n id\n name\n contractType\n contractAddress\n networkId\n totalSupply\n }\n metadata {\n name\n description\n imageUri\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n ':
types.NftsDocument,
}

/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*
*
* @example
* ```ts
* const query = graphql(`query GetUser($id: ID!) { user(id: $id) { name } }`);
* ```
*
* The query argument is unknown!
* Please regenerate the types.
*/
export function graphql(source: string): unknown

/**
* The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
*/
export function graphql(
source: '\n query nfts($address: String!, $after: Cursor, $first: Int) {\n nfts(after: $after, first: $first, filter: { currentOwner: { equalToInsensitive: $address } }) {\n edges {\n node {\n id\n tokenId\n collection {\n id\n name\n contractType\n contractAddress\n networkId\n totalSupply\n }\n metadata {\n name\n description\n imageUri\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n '
): (typeof documents)['\n query nfts($address: String!, $after: Cursor, $first: Int) {\n nfts(after: $after, first: $first, filter: { currentOwner: { equalToInsensitive: $address } }) {\n edges {\n node {\n id\n tokenId\n collection {\n id\n name\n contractType\n contractAddress\n networkId\n totalSupply\n }\n metadata {\n name\n description\n imageUri\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n ']

export function graphql(source: string) {
return (documents as any)[source] ?? {}
}

export type DocumentType<TDocumentNode extends DocumentNode<any, any>> = TDocumentNode extends DocumentNode<
infer TType,
any
>
? TType
: never
Loading

0 comments on commit ff1b3c8

Please sign in to comment.