|
|
|
@ -3,14 +3,16 @@ import reactLogo from "./assets/react.svg";
|
|
|
|
|
import viteLogo from "/vite.svg"; |
|
|
|
|
import "./App.css"; |
|
|
|
|
import { useDropzone } from "react-dropzone"; |
|
|
|
|
import { Box, Input, InputLabel, Tooltip, Typography } from "@mui/material"; |
|
|
|
|
import { Box, CircularProgress, Input, InputLabel, Tooltip, Typography } from "@mui/material"; |
|
|
|
|
import { decryptStoredWallet } from "./utils/decryptWallet"; |
|
|
|
|
import { CountdownCircleTimer } from "react-countdown-circle-timer"; |
|
|
|
|
import Logo1 from "./assets/svgs/Logo1.svg"; |
|
|
|
|
import Logo1Dark from "./assets/svgs/Logo1Dark.svg"; |
|
|
|
|
|
|
|
|
|
import RefreshIcon from '@mui/icons-material/Refresh'; |
|
|
|
|
import Logo2 from "./assets/svgs/Logo2.svg"; |
|
|
|
|
import Copy from "./assets/svgs/Copy.svg"; |
|
|
|
|
import ltcLogo from './assets/ltc.png'; |
|
|
|
|
import qortLogo from './assets/qort.png' |
|
|
|
|
import { CopyToClipboard } from "react-copy-to-clipboard"; |
|
|
|
|
import Download from "./assets/svgs/Download.svg"; |
|
|
|
|
import Logout from "./assets/svgs/Logout.svg"; |
|
|
|
@ -63,13 +65,16 @@ function App() {
|
|
|
|
|
const [extState, setExtstate] = useState<extStates>("not-authenticated"); |
|
|
|
|
const [backupjson, setBackupjson] = useState<any>(null); |
|
|
|
|
const [rawWallet, setRawWallet] = useState<any>(null); |
|
|
|
|
const [ltcBalanceLoading, setLtcBalanceLoading] = useState<boolean>(false); |
|
|
|
|
const [qortBalanceLoading, setQortBalanceLoading] = useState<boolean>(false) |
|
|
|
|
const [decryptedWallet, setdecryptedWallet] = useState<any>(null); |
|
|
|
|
const [requestConnection, setRequestConnection] = useState<any>(null); |
|
|
|
|
const [requestBuyOrder, setRequestBuyOrder] = useState<any>(null); |
|
|
|
|
|
|
|
|
|
const [authenticatedMode, setAuthenticatedMode] = useState('qort') |
|
|
|
|
const [requestAuthentication, setRequestAuthentication] = useState<any>(null); |
|
|
|
|
const [userInfo, setUserInfo] = useState<any>(null); |
|
|
|
|
const [balance, setBalance] = useState<any>(null); |
|
|
|
|
const [ltcBalance, setLtcBalance] = useState<any>(null) |
|
|
|
|
const [paymentTo, setPaymentTo] = useState<string>(""); |
|
|
|
|
const [paymentAmount, setPaymentAmount] = useState<number>(0); |
|
|
|
|
const [paymentPassword, setPaymentPassword] = useState<string>(""); |
|
|
|
@ -92,8 +97,8 @@ function App() {
|
|
|
|
|
const [walletToBeDecryptedError, setWalletToBeDecryptedError] = |
|
|
|
|
useState<string>(""); |
|
|
|
|
const holdRefExtState = useRef<extStates>("not-authenticated") |
|
|
|
|
useEffect(()=> { |
|
|
|
|
if(extState){ |
|
|
|
|
useEffect(() => { |
|
|
|
|
if (extState) { |
|
|
|
|
holdRefExtState.current = extState |
|
|
|
|
} |
|
|
|
|
}, [extState]) |
|
|
|
@ -129,7 +134,7 @@ function App() {
|
|
|
|
|
try { |
|
|
|
|
if (typeof fileContents !== "string") return; |
|
|
|
|
pf = JSON.parse(fileContents); |
|
|
|
|
} catch (e) {} |
|
|
|
|
} catch (e) { } |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
const requiredFields = [ |
|
|
|
@ -167,7 +172,7 @@ function App() {
|
|
|
|
|
wallet = await wallet2.generateSaveWalletData( |
|
|
|
|
password, |
|
|
|
|
crypto.kdfThreads, |
|
|
|
|
() => {} |
|
|
|
|
() => { } |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
setWalletToBeDownloaded({ |
|
|
|
@ -205,10 +210,21 @@ function App() {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const getBalanceFunc = () => { |
|
|
|
|
setQortBalanceLoading(true) |
|
|
|
|
chrome.runtime.sendMessage({ action: "balance" }, (response) => { |
|
|
|
|
if (response && !response?.error) { |
|
|
|
|
setBalance(response); |
|
|
|
|
} |
|
|
|
|
setQortBalanceLoading(false) |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
const getLtcBalanceFunc = () => { |
|
|
|
|
setLtcBalanceLoading(true) |
|
|
|
|
chrome.runtime.sendMessage({ action: "ltcBalance" }, (response) => { |
|
|
|
|
if (response && !response?.error) { |
|
|
|
|
setLtcBalance(response); |
|
|
|
|
} |
|
|
|
|
setLtcBalanceLoading(false) |
|
|
|
|
}); |
|
|
|
|
}; |
|
|
|
|
const sendCoinFunc = () => { |
|
|
|
@ -409,11 +425,11 @@ function App() {
|
|
|
|
|
chrome.runtime.sendMessage({ action: "getWalletInfo" }, (response) => { |
|
|
|
|
if (response && response?.walletInfo) { |
|
|
|
|
setRawWallet(response?.walletInfo); |
|
|
|
|
if(holdRefExtState.current === 'web-app-request-payment' || holdRefExtState.current === 'web-app-request-connection' || holdRefExtState.current === 'web-app-request-buy-order') return |
|
|
|
|
if (holdRefExtState.current === 'web-app-request-payment' || holdRefExtState.current === 'web-app-request-connection' || holdRefExtState.current === 'web-app-request-buy-order') return |
|
|
|
|
setExtstate("authenticated"); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} catch (error) {} finally { |
|
|
|
|
} catch (error) { } finally { |
|
|
|
|
setIsLoading(false) |
|
|
|
|
} |
|
|
|
|
}, []); |
|
|
|
@ -427,7 +443,8 @@ function App() {
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
getBalanceFunc(); |
|
|
|
|
} catch (error) {} |
|
|
|
|
getLtcBalanceFunc() |
|
|
|
|
} catch (error) { } |
|
|
|
|
}, [address]); |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
@ -444,8 +461,8 @@ function App() {
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
setIsLoading(true) |
|
|
|
|
await new Promise<void>((res)=> { |
|
|
|
|
setTimeout(()=> { |
|
|
|
|
await new Promise<void>((res) => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
res() |
|
|
|
|
}, 250) |
|
|
|
|
}) |
|
|
|
@ -487,8 +504,8 @@ function App() {
|
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
setIsLoading(true) |
|
|
|
|
await new Promise<void>((res)=> { |
|
|
|
|
setTimeout(()=> { |
|
|
|
|
await new Promise<void>((res) => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
res() |
|
|
|
|
}, 250) |
|
|
|
|
}) |
|
|
|
@ -496,12 +513,14 @@ function App() {
|
|
|
|
|
const wallet = await res.generateSaveWalletData( |
|
|
|
|
walletToBeDownloadedPassword, |
|
|
|
|
crypto.kdfThreads, |
|
|
|
|
() => {} |
|
|
|
|
() => { } |
|
|
|
|
); |
|
|
|
|
chrome.runtime.sendMessage({ action: "decryptWallet", payload: { |
|
|
|
|
chrome.runtime.sendMessage({ |
|
|
|
|
action: "decryptWallet", payload: { |
|
|
|
|
password: walletToBeDownloadedPassword, |
|
|
|
|
wallet |
|
|
|
|
} }, (response) => { |
|
|
|
|
} |
|
|
|
|
}, (response) => { |
|
|
|
|
if (response && !response?.error) { |
|
|
|
|
setRawWallet(wallet); |
|
|
|
|
setWalletToBeDownloaded({ |
|
|
|
@ -515,7 +534,7 @@ function App() {
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
getBalanceFunc(); |
|
|
|
|
} else if(response?.error){ |
|
|
|
|
} else if (response?.error) { |
|
|
|
|
setIsLoading(false) |
|
|
|
|
setWalletToBeDecryptedError(response.error) |
|
|
|
|
} |
|
|
|
@ -536,7 +555,7 @@ function App() {
|
|
|
|
|
resetAllStates(); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} catch (error) {} |
|
|
|
|
} catch (error) { } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const returnToMain = () => { |
|
|
|
@ -561,6 +580,7 @@ function App() {
|
|
|
|
|
setRequestAuthentication(null); |
|
|
|
|
setUserInfo(null); |
|
|
|
|
setBalance(null); |
|
|
|
|
setLtcBalance(null) |
|
|
|
|
setPaymentTo(""); |
|
|
|
|
setPaymentAmount(0); |
|
|
|
|
setPaymentPassword(""); |
|
|
|
@ -574,19 +594,21 @@ function App() {
|
|
|
|
|
setSendqortState(null); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const authenticateWallet = async()=> { |
|
|
|
|
const authenticateWallet = async () => { |
|
|
|
|
try { |
|
|
|
|
setIsLoading(true) |
|
|
|
|
setWalletToBeDecryptedError('') |
|
|
|
|
await new Promise<void>((res)=> { |
|
|
|
|
setTimeout(()=> { |
|
|
|
|
await new Promise<void>((res) => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
res() |
|
|
|
|
}, 250) |
|
|
|
|
}) |
|
|
|
|
chrome.runtime.sendMessage({ action: "decryptWallet", payload: { |
|
|
|
|
chrome.runtime.sendMessage({ |
|
|
|
|
action: "decryptWallet", payload: { |
|
|
|
|
password: authenticatePassword, |
|
|
|
|
wallet: rawWallet |
|
|
|
|
} }, (response) => { |
|
|
|
|
} |
|
|
|
|
}, (response) => { |
|
|
|
|
if (response && !response?.error) { |
|
|
|
|
setAuthenticatePassword(""); |
|
|
|
|
setExtstate("authenticated"); |
|
|
|
@ -598,7 +620,7 @@ function App() {
|
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
getBalanceFunc(); |
|
|
|
|
} else if(response?.error){ |
|
|
|
|
} else if (response?.error) { |
|
|
|
|
setIsLoading(false) |
|
|
|
|
setWalletToBeDecryptedError(response.error) |
|
|
|
|
} |
|
|
|
@ -684,6 +706,47 @@ function App() {
|
|
|
|
|
<AuthenticatedContainer> |
|
|
|
|
<AuthenticatedContainerInnerLeft> |
|
|
|
|
<Spacer height="48px" /> |
|
|
|
|
|
|
|
|
|
{authenticatedMode === 'ltc' ? ( |
|
|
|
|
<> |
|
|
|
|
<img src={ltcLogo} /> |
|
|
|
|
<Spacer height="32px" /> |
|
|
|
|
<CopyToClipboard text={rawWallet?.ltcAddress}> |
|
|
|
|
<AddressBox> |
|
|
|
|
{rawWallet?.ltcAddress?.slice(0, 6)}... |
|
|
|
|
{rawWallet?.ltcAddress?.slice(-4)} <img src={Copy} /> |
|
|
|
|
</AddressBox> |
|
|
|
|
</CopyToClipboard> |
|
|
|
|
<Spacer height="10px" /> |
|
|
|
|
{ltcBalanceLoading && <CircularProgress color="success" size={16} />} |
|
|
|
|
{ltcBalance && !ltcBalanceLoading && ( |
|
|
|
|
<Box sx={{ |
|
|
|
|
gap: '10px', |
|
|
|
|
display: 'flex', |
|
|
|
|
alignItems: 'center' |
|
|
|
|
}}> |
|
|
|
|
<TextP |
|
|
|
|
sx={{ |
|
|
|
|
textAlign: "center", |
|
|
|
|
lineHeight: "24px", |
|
|
|
|
fontSize: "20px", |
|
|
|
|
fontWeight: 700, |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
{ltcBalance?.toFixed(5)} LTC |
|
|
|
|
</TextP> |
|
|
|
|
<RefreshIcon onClick={getLtcBalanceFunc} sx={{ |
|
|
|
|
fontSize: '16px', |
|
|
|
|
color: 'white', |
|
|
|
|
cursor: 'pointer' |
|
|
|
|
}} /> |
|
|
|
|
</Box> |
|
|
|
|
|
|
|
|
|
)} |
|
|
|
|
|
|
|
|
|
</> |
|
|
|
|
) : ( |
|
|
|
|
<> |
|
|
|
|
<img src={Logo2} /> |
|
|
|
|
<Spacer height="32px" /> |
|
|
|
|
<TextP |
|
|
|
@ -703,6 +766,7 @@ function App() {
|
|
|
|
|
</AddressBox> |
|
|
|
|
</CopyToClipboard> |
|
|
|
|
<Spacer height="10px" /> |
|
|
|
|
{qortBalanceLoading && <CircularProgress color="success" size={16} />} |
|
|
|
|
{balance && ( |
|
|
|
|
<TextP |
|
|
|
|
sx={{ |
|
|
|
@ -716,16 +780,7 @@ function App() {
|
|
|
|
|
</TextP> |
|
|
|
|
)} |
|
|
|
|
|
|
|
|
|
{/* <p>balance: {balance}</p> */} |
|
|
|
|
<Spacer height="55px" /> |
|
|
|
|
|
|
|
|
|
{/* <CustomButton |
|
|
|
|
onClick={() => { |
|
|
|
|
setExtstate("download-wallet"); |
|
|
|
|
}} |
|
|
|
|
> |
|
|
|
|
Download Wallet |
|
|
|
|
</CustomButton> */} |
|
|
|
|
<CustomButton |
|
|
|
|
onClick={() => { |
|
|
|
|
setExtstate("send-qort"); |
|
|
|
@ -733,6 +788,9 @@ function App() {
|
|
|
|
|
> |
|
|
|
|
Transfer QORT |
|
|
|
|
</CustomButton> |
|
|
|
|
</> |
|
|
|
|
)} |
|
|
|
|
|
|
|
|
|
</AuthenticatedContainerInnerLeft> |
|
|
|
|
<AuthenticatedContainerInnerRight> |
|
|
|
|
<Spacer height="20px" /> |
|
|
|
@ -753,6 +811,25 @@ function App() {
|
|
|
|
|
cursor: "pointer", |
|
|
|
|
}} |
|
|
|
|
/> |
|
|
|
|
<Spacer height="20px" /> |
|
|
|
|
{authenticatedMode === 'qort' && ( |
|
|
|
|
<img onClick={() => { |
|
|
|
|
setAuthenticatedMode('ltc') |
|
|
|
|
}} src={ltcLogo} style={{ |
|
|
|
|
cursor: "pointer", |
|
|
|
|
width: '20px', |
|
|
|
|
height: 'auto' |
|
|
|
|
}} /> |
|
|
|
|
)} |
|
|
|
|
{authenticatedMode === 'ltc' && ( |
|
|
|
|
<img onClick={() => { |
|
|
|
|
setAuthenticatedMode('qort') |
|
|
|
|
}} src={qortLogo} style={{ |
|
|
|
|
cursor: "pointer", |
|
|
|
|
width: '20px', |
|
|
|
|
height: 'auto' |
|
|
|
|
}} /> |
|
|
|
|
)} |
|
|
|
|
</AuthenticatedContainerInnerRight> |
|
|
|
|
</AuthenticatedContainer> |
|
|
|
|
)} |
|
|
|
@ -1143,7 +1220,7 @@ function App() {
|
|
|
|
|
style={{ |
|
|
|
|
cursor: "pointer", |
|
|
|
|
}} |
|
|
|
|
onClick={()=> { |
|
|
|
|
onClick={() => { |
|
|
|
|
setRawWallet(null); |
|
|
|
|
setExtstate("not-authenticated"); |
|
|
|
|
}} |
|
|
|
@ -1304,7 +1381,7 @@ function App() {
|
|
|
|
|
style={{ |
|
|
|
|
cursor: "pointer", |
|
|
|
|
}} |
|
|
|
|
onClick={()=> { |
|
|
|
|
onClick={() => { |
|
|
|
|
setExtstate("not-authenticated") |
|
|
|
|
}} |
|
|
|
|
src={Return} |
|
|
|
|