Skip to content

Commit 436bc06

Browse files
committed
Display ERC-8004 metadata in AppDetails
1 parent 140e255 commit 436bc06

2 files changed

Lines changed: 70 additions & 0 deletions

File tree

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { type FC } from 'react'
2+
import { useQuery } from '@tanstack/react-query'
3+
import axios from 'axios'
4+
import { Skeleton } from '@oasisprotocol/ui-library/src/components/ui/skeleton'
5+
import { RoflInstance } from '../../../nexus/generated/api.ts'
6+
import { useERC8004TokenURI } from '../../../hooks/useERC8004TokenURI.ts'
7+
import { fromMetadataToAgentId, tokenURIToLink } from '../../../utils/rofl-8004.ts'
8+
import { CodeDisplay } from '../../../components/CodeDisplay'
9+
10+
type Props = {
11+
roflInstances: RoflInstance[]
12+
}
13+
14+
export const AppERC8004: FC<Props> = ({ roflInstances }) => {
15+
// TODO: Display all instances
16+
const [instance] = roflInstances
17+
const tokenId = fromMetadataToAgentId(instance.metadata)
18+
const {
19+
isLoading: isLoadingTokenURI,
20+
data: tokenURI,
21+
error: tokenURIError,
22+
} = useERC8004TokenURI(BigInt(tokenId))
23+
24+
const {
25+
data: metadata,
26+
isLoading: isLoadingMetadata,
27+
error: metadataError,
28+
} = useQuery({
29+
queryKey: ['erc8004-metadata', tokenURI],
30+
queryFn: async () => {
31+
if (!tokenURI) throw new Error('No tokenURI available')
32+
const httpLink = tokenURIToLink(tokenURI)
33+
const response = await axios.get(httpLink)
34+
return response.data
35+
},
36+
enabled: !!tokenURI,
37+
})
38+
39+
const isLoading = isLoadingTokenURI || isLoadingMetadata
40+
const error = tokenURIError || metadataError
41+
42+
return (
43+
<div className="space-y-6">
44+
{isLoading && <Skeleton className="w-full h-[400px]" />}
45+
{!isLoading && (
46+
<>
47+
{metadata && (
48+
<div>
49+
<h3 className="text-lg font-semibold mb-2">ERC-8004 Metadata</h3>
50+
<CodeDisplay data={JSON.stringify(metadata, null, '\t')} format="json" />
51+
</div>
52+
)}
53+
{error && <div className="text-red-500">Error loading metadata: {error.message}</div>}
54+
</>
55+
)}
56+
</div>
57+
)
58+
}

src/pages/Dashboard/AppDetails/index.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import { RemoveAppButton } from './RemoveAppButton'
1919
import { Dialog, DialogContent } from '@oasisprotocol/ui-library/src/components/ui/dialog'
2020
import { HelpWidget } from '../../CreateApp/HelpWidget'
2121
import { AddSecret } from '../../../components/SecretsTable/AddSecret'
22+
import { ROFL_8004_METADATA_KEY } from '../../../constants/rofl-8004.ts'
23+
import { AppERC8004 } from './AppERC8004.tsx'
2224

2325
function setDefaultMetadataViewState(metadata: RoflAppMetadata | undefined = {}): ViewMetadataState {
2426
return {
@@ -63,6 +65,10 @@ export const AppDetails: FC = () => {
6365
)
6466
const { data: readme } = useDownloadArtifact(`${id}-readme-md`, token)
6567

68+
const instancesWithERC8004Token =
69+
roflApp?.active_instances.filter(({ metadata }) => metadata?.[ROFL_8004_METADATA_KEY]) ?? []
70+
const hasInstancesWithERC8004Token = instancesWithERC8004Token.length > 0
71+
6672
const editEnabled = !!token && !roflApp?.removed
6773
const removeApp = useRemoveApp()
6874
const updateApp = useUpdateApp()
@@ -176,6 +182,7 @@ export const AppDetails: FC = () => {
176182
<TabsTrigger value="details">Details</TabsTrigger>
177183
<TabsTrigger value="secrets">Secrets</TabsTrigger>
178184
<TabsTrigger value="compose">Manifest</TabsTrigger>
185+
{hasInstancesWithERC8004Token && <TabsTrigger value="erc-8004">ERC-8004</TabsTrigger>}
179186
</TabsList>
180187
</div>
181188
</div>
@@ -211,6 +218,11 @@ export const AppDetails: FC = () => {
211218
composeYaml={composeYaml}
212219
/>
213220
</TabsContent>
221+
{hasInstancesWithERC8004Token && (
222+
<TabsContent value="erc-8004">
223+
<AppERC8004 roflInstances={instancesWithERC8004Token} />
224+
</TabsContent>
225+
)}
214226
</Tabs>
215227
</div>
216228
</>

0 commit comments

Comments
 (0)