Skip to content

Commit a1eadf4

Browse files
authored
Merge pull request #124 from iExecBlockchainComputing/fix/too-many-request-and-code-refactor
feat: code refactor and request fetching optimisation
2 parents 97e4e4a + 21d7cfb commit a1eadf4

File tree

6 files changed

+173
-137
lines changed

6 files changed

+173
-137
lines changed

package-lock.json

Lines changed: 36 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"@fontsource/space-mono": "^5.2.5",
2424
"@graphql-codegen/introspection": "^4.0.3",
2525
"@iexec/dataprotector": "^2.0.0-beta.12",
26-
"@iexec/web3mail": "^1.2.0",
26+
"@iexec/web3mail": "^1.2.2",
2727
"@iexec/web3telegram": "^0.0.3-alpha",
2828
"@radix-ui/react-dialog": "^1.1.6",
2929
"@radix-ui/react-label": "^2.1.2",

src/modules/myData/protectedData/GrantAccessModal.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,9 @@ export default function GrantAccessModal({
9393
queryClient.invalidateQueries({
9494
queryKey: ['granted access', protectedData.address, userAddress],
9595
});
96+
queryClient.invalidateQueries({
97+
queryKey: ['fetchContacts', userAddress],
98+
});
9699
navigate(`/my-data/${protectedData.address}`);
97100
toast({
98101
title: 'You have successfully authorized a new user.',

src/views/contact/ContactItem.tsx

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import {
2+
WEB3MAIL_IDAPPS_WHITELIST_SC,
3+
WEB3TELEGRAM_IDAPPS_WHITELIST_SC,
4+
} from '@/config/config';
5+
import { Contact as Web3mailContact } from '@iexec/web3mail';
6+
import { Contact as Web3telegramContact } from '@iexec/web3telegram';
7+
import { useQuery } from '@tanstack/react-query';
8+
import { Link } from 'react-router-dom';
9+
import { LoadingSpinner } from '@/components/LoadingSpinner';
10+
import { Button } from '@/components/ui/button';
11+
import { getDataProtectorCoreClient } from '@/externals/iexecSdkClient';
12+
import useUserStore from '@/stores/useUser.store';
13+
import { cn } from '@/utils/style.utils';
14+
15+
interface ContactItemProps {
16+
contact: (Web3telegramContact | Web3mailContact) & {
17+
contactType: 'mail' | 'telegram';
18+
};
19+
}
20+
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+
export default function ContactItem({ contact }: ContactItemProps) {
50+
const { address: userAddress } = useUserStore();
51+
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+
return (
70+
<div
71+
className={cn(
72+
'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+
)}
74+
>
75+
<div className="truncate">
76+
{isLoading ? <LoadingSpinner /> : contactDetails?.name || '(No name)'}
77+
</div>
78+
<div className="truncate">
79+
<span className="truncate whitespace-nowrap">{contact.address}</span>
80+
</div>
81+
<div className="truncate">
82+
<span className="truncate whitespace-nowrap">
83+
{contact.owner === userAddress
84+
? `(Mine) ${contact.owner}`
85+
: contact.owner}
86+
</span>
87+
</div>
88+
<div className="truncate">
89+
{isLoading ? <LoadingSpinner /> : contactDetails?.volume || 'N/A'}
90+
</div>
91+
<div className="text-primary truncate uppercase">
92+
{contact.contactType}
93+
</div>
94+
<div className="justify-end">
95+
<Button asChild variant="discreet_outline">
96+
<Link to={`/contacts/${contact.address}/send-message`}>Send</Link>
97+
</Button>
98+
</div>
99+
</div>
100+
);
101+
}

0 commit comments

Comments
 (0)