Skip to content

Commit f140c48

Browse files
committed
feat: refresh solana balances
1 parent 3abb0ec commit f140c48

File tree

4 files changed

+128
-6
lines changed

4 files changed

+128
-6
lines changed

src/components/AccountList/index.css

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,3 +298,25 @@
298298
overflow: hidden;
299299
text-overflow: ellipsis;
300300
}
301+
302+
.token-assets-title {
303+
display: flex;
304+
flex-direction: row;
305+
justify-content: space-between;
306+
align-items: center;
307+
margin-bottom: 8px;
308+
}
309+
310+
.token-assets-title > .title {
311+
color: #ffffff !important;
312+
}
313+
314+
.token-assets-title > .refresh.disabled {
315+
color: #5a5a5afe !important;
316+
cursor: not-allowed;
317+
}
318+
319+
.token-assets-title > .refresh {
320+
color: #9fbfe5fe !important;
321+
cursor: pointer;
322+
}

src/components/AccountList/index.tsx

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { ReactComponent as SolanaToken } from './assets/solana-token.svg';
1111
import { ReactComponent as SpToken } from './assets/sp-token.svg';
1212
import PassportInfo from '../PassportInfo';
1313
import SelectActivePassportPopup from '../SelectActivePassportPopup';
14+
import { refreshSolanaBalances } from '../../services/wallets';
15+
import { CoNET_Data } from '../../utils/globals';
1416

1517
interface AccountListProps {
1618
showMainWallet?: boolean;
@@ -21,11 +23,12 @@ interface AccountListProps {
2123

2224
export default function AccountList({ showMainWallet = true, simplifiedView = false, spInUsd = 0, solInUsd = 0 }: AccountListProps) {
2325
const [openAccountList, setOpenAccountList] = useState<string[]>([]);
24-
const { profiles, activePassport } = useDaemonContext();
26+
const { profiles, activePassport, setProfiles } = useDaemonContext();
2527

2628
const [mainAccountAddressCopied, setMainAccountAddressCopied] = useState(false);
2729
const [solanaAccountAddressCopied, setSolanaAccountAddressCopied] = useState(false);
2830
const [passportToChange, setPassportToChange] = useState();
31+
const [isRefreshingSolanaBalances, setIsRefreshingSolanaBalances] = useState(false);
2932

3033
const { isSelectPassportPopupOpen, setIsSelectPassportPopupOpen } = useDaemonContext();
3134

@@ -39,12 +42,12 @@ export default function AccountList({ showMainWallet = true, simplifiedView = fa
3942
e.preventDefault();
4043

4144
if (account === 'main') {
42-
navigator.clipboard.writeText(profiles?.[0].keyID);
45+
navigator.clipboard.writeText(profiles?.[0]?.keyID);
4346
setMainAccountAddressCopied(true);
4447
}
4548

4649
if (account === 'solana') {
47-
navigator.clipboard.writeText(profiles?.[1].keyID);
50+
navigator.clipboard.writeText(profiles?.[1]?.keyID);
4851
setSolanaAccountAddressCopied(true);
4952
}
5053

@@ -54,6 +57,40 @@ export default function AccountList({ showMainWallet = true, simplifiedView = fa
5457
}, 2000)
5558
}
5659

60+
async function handleRefreshSolanaBalances() {
61+
setIsRefreshingSolanaBalances(true);
62+
63+
try {
64+
await refreshSolanaBalances(profiles?.[1]);
65+
66+
const tmpData = CoNET_Data;
67+
68+
if (!tmpData) {
69+
return;
70+
}
71+
72+
tmpData.profiles[1] = profiles?.[1];
73+
74+
setProfiles(tmpData.profiles);
75+
} catch (ex) {
76+
console.log(ex);
77+
}
78+
79+
setTimeout(() => setIsRefreshingSolanaBalances(false), 2000);
80+
}
81+
82+
const renderRefreshButton = () => {
83+
if (!profiles?.[1]?.keyID) {
84+
return <p className='refresh disabled'>Refresh</p>
85+
}
86+
87+
if (isRefreshingSolanaBalances) {
88+
return <p className='refresh'>Refreshing...</p>
89+
}
90+
91+
return <p className='refresh' onClick={handleRefreshSolanaBalances}>Refresh</p>
92+
}
93+
5794
return (
5895
<div className="account-list">
5996
{showMainWallet &&
@@ -88,7 +125,9 @@ export default function AccountList({ showMainWallet = true, simplifiedView = fa
88125
</div>
89126
<div className="info-card">
90127
<div className="info-wrapper">
91-
<p>Token assets</p>
128+
<div className='token-assets-title'>
129+
<p className='title'>Token assets</p>
130+
</div>
92131
<div>
93132
<div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>
94133
<ConetToken />
@@ -193,7 +232,10 @@ export default function AccountList({ showMainWallet = true, simplifiedView = fa
193232

194233
<div className="info-card">
195234
<div className="info-wrapper">
196-
<p>Token assets</p>
235+
<div className='token-assets-title'>
236+
<p className='title'>Token assets</p>
237+
{renderRefreshButton()}
238+
</div>
197239
<div>
198240
<div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>
199241
<SpToken />
@@ -216,6 +258,7 @@ export default function AccountList({ showMainWallet = true, simplifiedView = fa
216258
)
217259
}
218260
</div>
261+
219262
<div>
220263
<div style={{ display: 'flex', alignItems: 'center', gap: '4px' }}>
221264
<SolanaToken />

src/services/listeners.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,4 +360,4 @@ const scan_spl_balance = async (walletAddr: string, tokenAddress: string) => {
360360
}
361361
};
362362

363-
export { listenProfileVer };
363+
export { listenProfileVer, scanSolanaSol, scanSolanaSp };

src/services/wallets.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import * as Bip39 from "bip39";
1818

1919
import { Keypair } from "@solana/web3.js";
2020
import Bs58 from "bs58";
21+
import { scanSolanaSol, scanSolanaSp } from "./listeners";
2122

2223
const PouchDB = require("pouchdb").default;
2324

@@ -585,6 +586,61 @@ const getPassportsInfo = async (
585586
}
586587
};
587588

589+
const refreshSolanaBalances = async (solanaProfile: profile) => {
590+
try {
591+
const [sol, sp] = await Promise.all([
592+
scanSolanaSol(solanaProfile.keyID),
593+
scanSolanaSp(solanaProfile.keyID),
594+
]);
595+
596+
if (solanaProfile.tokens?.sol) {
597+
solanaProfile.tokens.sol.balance = sol === false ? "" : sol?.toFixed(6);
598+
} else {
599+
solanaProfile.tokens.sol = {
600+
balance: sol === false ? "" : sol?.toFixed(6),
601+
network: "Solana Mainnet",
602+
decimal: 18,
603+
contract: "",
604+
name: "sol",
605+
};
606+
}
607+
608+
if (solanaProfile.tokens?.sp) {
609+
solanaProfile.tokens.sp.balance =
610+
sp === false ? "" : parseFloat(sp).toFixed(6);
611+
} else {
612+
solanaProfile.tokens.sp = {
613+
balance: sp === false ? "" : parseFloat(sp).toFixed(6),
614+
network: "Solana Mainnet",
615+
decimal: 18,
616+
contract: "",
617+
name: "sp",
618+
};
619+
}
620+
621+
const temp = CoNET_Data;
622+
623+
if (!temp) {
624+
return false;
625+
}
626+
627+
temp.profiles[1] = {
628+
...temp.profiles[1],
629+
tokens: {
630+
...temp.profiles[1].tokens,
631+
sp: solanaProfile.tokens.sp,
632+
sol: solanaProfile.tokens.sol,
633+
},
634+
};
635+
636+
setCoNET_Data(temp);
637+
638+
return true;
639+
} catch (ex) {
640+
return false;
641+
}
642+
};
643+
588644
export {
589645
createOrGetWallet,
590646
createGPGKey,
@@ -596,4 +652,5 @@ export {
596652
getFaucet,
597653
getVpnTimeUsed,
598654
getPassportsInfoForProfile,
655+
refreshSolanaBalances,
599656
};

0 commit comments

Comments
 (0)