-
Notifications
You must be signed in to change notification settings - Fork 1
/
StreamTicketTokenSelector.tsx
113 lines (106 loc) · 3.84 KB
/
StreamTicketTokenSelector.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { BareComponentProps } from '@0xflair/react-common';
import { NftToken } from '@0xflair/react-data-query';
import { Fragment } from 'react';
import { useStreamContext } from '../providers';
type Props = BareComponentProps;
export const StreamTicketTokenSelector = ({ as, ...attributes }: Props) => {
const {
data: {
walletAddress,
ticketTokens,
selectedTicketTokenIds,
selectedTicketTokens,
ticketTokenSymbol,
ticketTokenAddress,
},
setSelectedTicketTokens,
} = useStreamContext();
const Component =
as || (attributes.className || attributes.style ? 'span' : Fragment);
return (
<Component {...attributes}>
{ticketTokens?.length ? (
ticketTokens.map((token) => (
<div
key={token.tokenId}
className="ticket-token relative flex gap-2 items-start py-4"
>
<div className="token-checkbox flex items-center h-5">
<input
id={`token-${token.tokenId}`}
name={`token-${token.tokenId}`}
type="checkbox"
className="focus:ring-indigo-500 h-4 w-4 text-indigo-600 border-gray-300 rounded"
checked={Boolean(
selectedTicketTokenIds?.find(
(t) => t.toString() === token.tokenId?.toString(),
),
)}
onChange={(e) => {
const { checked } = e.target;
if (checked) {
if (
!selectedTicketTokens?.find(
(t) =>
t.tokenId?.toString() === token.tokenId?.toString(),
)
) {
setSelectedTicketTokens([
...(selectedTicketTokens || []),
token,
]);
}
} else {
setSelectedTicketTokens(
selectedTicketTokens?.filter(
(t) =>
t.tokenId?.toString() !== token.tokenId?.toString(),
) || [],
);
}
}}
/>
</div>
<div className="token-label text-sm">
<label
htmlFor={`token-${token.tokenId}`}
className="font-medium text-gray-700 select-none"
>
{ticketTokenSymbol?.toString()} # {token.tokenId?.toString()}
</label>
</div>
</div>
))
) : (
<div className="ticket-token-input col-span-2 relative flex flex-col gap-4 items-start py-4">
<h3 className="text-sm font-medium text-gray-700">
Manually enter Token IDs
</h3>
<div className="token-input flex items-center w-full">
<input
id="token-input"
name="token-input"
type="text"
className="focus:ring-indigo-500 focus:border-indigo-500 block w-full shadow-sm sm:text-sm border-gray-300 rounded-md"
placeholder="123, 456, 789"
defaultValue={selectedTicketTokenIds?.join(', ')}
onChange={(e) => {
const { value } = e.target;
const tokenIds = value
.split(',')
.map((t) => t.trim())
.filter((t) => t.length);
const newTokens: NftToken[] = tokenIds.map((tokenId) => ({
tokenId: tokenId,
contractAddress: ticketTokenAddress?.toString() || '',
ownerAddress: walletAddress?.toString() || '',
}));
setSelectedTicketTokens(newTokens);
}}
/>
</div>
</div>
)}
</Component>
);
};