stake-ui/src/components/common/OwnedTokenAccountsSelect.tsx

76 lines
2.2 KiB
TypeScript

import React, { useState } from 'react';
import { useSelector } from 'react-redux';
import BN from 'bn.js';
import Select from '@material-ui/core/Select';
import MenuItem from '@material-ui/core/MenuItem';
import { PublicKey } from '@solana/web3.js';
import { State as StoreState } from '../../store/reducer';
import { toDisplay } from '../../utils/tokens';
type Props = {
style?: any;
mint?: PublicKey | null;
decimals?: number;
variant?: 'outlined' | 'standard';
onChange: (from: PublicKey, maxAmount: BN) => void;
};
export default function OwnedTokenAccountsSelect(p: Props) {
const { mint, decimals, variant, onChange, style } = p;
const ownedTokenAccounts = useSelector((state: StoreState) => {
if (!mint) {
return [];
}
return state.common.ownedTokenAccounts.filter(
ota => ota.account.mint.toString() === mint.toString(),
);
});
const [fromAccount, setFromAccount] = useState('');
return (
<Select
style={style}
variant={variant}
fullWidth
value={fromAccount}
onChange={e => {
const pk = e.target.value as string;
setFromAccount(pk);
const pubkey = new PublicKey(pk);
const token = ownedTokenAccounts
.filter(ota => ota.publicKey.equals(pubkey))
.pop();
onChange(pubkey, new BN(token!.account.amount));
}}
>
{ownedTokenAccounts.length === 0 ? (
<MenuItem value={''}>No token accounts found</MenuItem>
) : (
ownedTokenAccounts.map(ownedTokenAccount => {
return (
<MenuItem value={ownedTokenAccount.publicKey.toString()}>
<div
style={{
width: '100%',
display: 'flex',
justifyContent: 'space-between',
overflow: 'hidden',
}}
>
<div>{`${ownedTokenAccount.publicKey}`}</div>
{decimals && (
<div style={{ float: 'right', color: '#ccc' }}>{`${toDisplay(
ownedTokenAccount.account.amount,
decimals ?? 0,
)}`}</div>
)}
</div>
</MenuItem>
);
})
)}
</Select>
);
}