1
- import {
2
- WEB3MAIL_IDAPPS_WHITELIST_SC ,
3
- WEB3TELEGRAM_IDAPPS_WHITELIST_SC ,
4
- } from '@/config/config' ;
5
1
import { Contact as Web3mailContact } from '@iexec/web3mail' ;
6
2
import { Contact as Web3telegramContact } from '@iexec/web3telegram' ;
7
- import { useQuery } from '@tanstack/react-query' ;
8
3
import { Link } from 'react-router-dom' ;
9
- import { LoadingSpinner } from '@/components/LoadingSpinner' ;
10
4
import { Button } from '@/components/ui/button' ;
11
- import { getDataProtectorCoreClient } from '@/externals/iexecSdkClient' ;
12
5
import useUserStore from '@/stores/useUser.store' ;
13
6
import { cn } from '@/utils/style.utils' ;
14
7
@@ -18,63 +11,16 @@ interface ContactItemProps {
18
11
} ;
19
12
}
20
13
21
- const fetchContactDetails = async (
22
- contact : ( Web3telegramContact | Web3mailContact ) & {
23
- contactType : 'mail' | 'telegram' ;
24
- } ,
25
- userAddress : string
26
- ) => {
27
- const dataProtectorCore = await getDataProtectorCoreClient ( ) ;
28
-
29
- const contactProtectedData = await dataProtectorCore . getProtectedData ( {
30
- protectedDataAddress : contact . address ,
31
- } ) ;
32
-
33
- const grantedAccess = await dataProtectorCore . getGrantedAccess ( {
34
- protectedData : contact . address ,
35
- authorizedUser : userAddress ,
36
- authorizedApp :
37
- contact . contactType === 'mail'
38
- ? WEB3MAIL_IDAPPS_WHITELIST_SC
39
- : WEB3TELEGRAM_IDAPPS_WHITELIST_SC ,
40
- } ) ;
41
-
42
- return {
43
- ...contactProtectedData [ 0 ] ,
44
- contactType : contact . contactType ,
45
- volume : grantedAccess . grantedAccess [ 0 ] . volume ,
46
- } ;
47
- } ;
48
-
49
14
export default function ContactItem ( { contact } : ContactItemProps ) {
50
15
const { address : userAddress } = useUserStore ( ) ;
51
16
52
- const {
53
- data : contactDetails ,
54
- isLoading,
55
- isError,
56
- } = useQuery ( {
57
- queryKey : [ 'contactDetails' , contact . address , userAddress ] ,
58
- queryFn : ( ) => fetchContactDetails ( contact , userAddress as string ) ,
59
- enabled : ! ! userAddress ,
60
- refetchOnWindowFocus : false ,
61
- staleTime : 5 * 60 * 1000 , // 5 minutes
62
- } ) ;
63
-
64
- if ( isError ) {
65
- // TODO: Handle error more gracefully. Do not display error in the UI.
66
- console . error ( 'Error loading contact details:' , contact . address ) ;
67
- }
68
-
69
17
return (
70
18
< div
71
19
className = { cn (
72
20
'bg-grey-50 even:*:bg-grey-800 *:border-grey-600 contents text-sm *:flex *:h-full *:items-center *:border-t *:px-5 *:py-3'
73
21
) }
74
22
>
75
- < div className = "truncate" >
76
- { isLoading ? < LoadingSpinner /> : contactDetails ?. name || '(No name)' }
77
- </ div >
23
+ < div className = "truncate" > { contact . name || '(No name)' } </ div >
78
24
< div className = "truncate" >
79
25
< span className = "truncate whitespace-nowrap" > { contact . address } </ span >
80
26
</ div >
@@ -86,7 +32,9 @@ export default function ContactItem({ contact }: ContactItemProps) {
86
32
</ span >
87
33
</ div >
88
34
< div className = "truncate" >
89
- { isLoading ? < LoadingSpinner /> : contactDetails ?. volume || 'N/A' }
35
+ { contact . remainingAccess !== undefined
36
+ ? contact . remainingAccess
37
+ : 'N/A' }
90
38
</ div >
91
39
< div className = "text-primary truncate uppercase" >
92
40
{ contact . contactType }
0 commit comments