-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSharedWith.tsx
81 lines (70 loc) · 2.72 KB
/
SharedWith.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import React, { useState, useEffect, useCallback } from 'react';
import { Modal, Button, ListGroup } from 'react-bootstrap';
import { getSharedWithAddresses, revokeTokenAccess, revokeAllSharedAccess, getMaxUsersToRemove } from '../Blockchain/contract';
import { formatAddress } from './helpers';
import { toast } from 'react-toastify'
interface SharedAccessModalProps {
tokenId: number;
open: boolean;
onClose: () => void;
}
const fetchSharedAddresses = async (tokenId: number) => {
const addresses = await getSharedWithAddresses(tokenId);
return addresses;
};
export const SharedWith: React.FC<SharedAccessModalProps> = ({ tokenId, open, onClose }) => {
const [sharedAddresses, setSharedAddresses] = useState<string[]>([]);
const loadSharedAddresses = useCallback(async () => {
try {
const addresses = await fetchSharedAddresses(tokenId);
setSharedAddresses(addresses);
} catch (error) {
console.error('Error fetching shared addresses:', error);
}
}, [tokenId]);
useEffect(() => {
if (open) {
void loadSharedAddresses(); // Using void to handle the promise
}
}, [open, loadSharedAddresses]);
const handleRevokeAccess = async (address: string) => {
const isSuccessRevoke = await revokeTokenAccess(tokenId, address);
if (isSuccessRevoke) {
toast.success(`Revoke access for ${formatAddress(address)} on NFT#${tokenId} has succeeded!`);
setSharedAddresses(prev => prev.filter(item => item !== address));
}
};
const handleRevokeAllAccess = async () => {
if (sharedAddresses.length == 0) {
toast.error(`No shared access for NFT#${tokenId} !`);
} else {
const maxToRemove = await getMaxUsersToRemove();
const isSuccessRevokeAll = await revokeAllSharedAccess(tokenId, maxToRemove);
if (isSuccessRevokeAll) {
toast.success(`Revoke all access for token NFT#${tokenId} has succeeded!`);
setSharedAddresses([]);
}
}
};
return (
<Modal show={open} onHide={onClose} centered>
<Modal.Header closeButton>
<Modal.Title>Shared With for NFT#{tokenId}</Modal.Title>
</Modal.Header>
<Modal.Body>
<ListGroup>
{sharedAddresses.map(address => (
<ListGroup.Item key={address} className="d-flex justify-content-between align-items-center">
{formatAddress(address)}
<Button variant="danger" onClick={() => handleRevokeAccess(address)}>Revoke</Button>
</ListGroup.Item>
))}
</ListGroup>
</Modal.Body>
<Modal.Footer>
<Button variant="danger" onClick={handleRevokeAllAccess}>Revoke All</Button>
<Button variant="secondary" onClick={onClose}>Close</Button>
</Modal.Footer>
</Modal>
);
};