preview messages in the stepper & navigation changes

Change-Id: Ic0a60899890af7a6c17467965f05f4d9cbc05825
This commit is contained in:
chase-45 2021-09-01 17:38:36 -04:00 committed by Evan Gray
parent 50bbc77836
commit 0b517e9c76
6 changed files with 163 additions and 13 deletions

View File

@ -151,7 +151,13 @@ const parsePayload = (arr: Buffer) => ({
targetChain: arr.readUInt16BE(99) as ChainId,
});
function RecoveryDialogContent({ onClose }: { onClose: () => void }) {
function RecoveryDialogContent({
onClose,
disabled,
}: {
onClose: () => void;
disabled: boolean;
}) {
const dispatch = useDispatch();
const { provider } = useEthereumProvider();
const currentSourceChain = useSelector(selectTransferSourceChain);
@ -408,7 +414,7 @@ function RecoveryDialogContent({ onClose }: { onClose: () => void }) {
onClick={handleRecoverClick}
variant="contained"
color="primary"
disabled={!enableRecovery}
disabled={!enableRecovery || disabled}
>
Recover
</Button>
@ -420,9 +426,11 @@ function RecoveryDialogContent({ onClose }: { onClose: () => void }) {
export default function Recovery({
open,
setOpen,
disabled,
}: {
open: boolean;
setOpen: (open: boolean) => void;
disabled: boolean;
}) {
const classes = useStyles();
const handleOpenClick = useCallback(() => {
@ -438,7 +446,7 @@ export default function Recovery({
</Fab>
<Dialog open={open} onClose={handleCloseClick} maxWidth="md" fullWidth>
<DialogTitle>Recovery</DialogTitle>
<RecoveryDialogContent onClose={handleCloseClick} />
<RecoveryDialogContent onClose={handleCloseClick} disabled={disabled} />
</Dialog>
</>
);

View File

@ -0,0 +1,24 @@
import { makeStyles, Typography } from "@material-ui/core";
const useStyles = makeStyles((theme) => ({
description: {
textAlign: "center",
},
}));
export default function RedeemPreview() {
const classes = useStyles();
const explainerString =
"Success! The redeem transaction was submitted. The tokens will become available once the transaction confirms.";
return (
<Typography
component="div"
variant="subtitle2"
className={classes.description}
>
{explainerString}
</Typography>
);
}

View File

@ -0,0 +1,23 @@
import { makeStyles, Typography } from "@material-ui/core";
const useStyles = makeStyles((theme) => ({
description: {
textAlign: "center",
},
}));
export default function SendPreview() {
const classes = useStyles();
const explainerString = "The tokens have been sent!";
return (
<Typography
component="div"
variant="subtitle2"
className={classes.description}
>
{explainerString}
</Typography>
);
}

View File

@ -0,0 +1,46 @@
import { makeStyles, Typography } from "@material-ui/core";
import { useSelector } from "react-redux";
import {
selectTransferAmount,
selectTransferSourceChain,
selectTransferSourceParsedTokenAccount,
} from "../../store/selectors";
import { CHAINS_BY_ID } from "../../utils/consts";
import { shortenAddress } from "../../utils/solana";
const useStyles = makeStyles((theme) => ({
description: {
textAlign: "center",
},
}));
export default function SourcePreview() {
const classes = useStyles();
const sourceChain = useSelector(selectTransferSourceChain);
const sourceParsedTokenAccount = useSelector(
selectTransferSourceParsedTokenAccount
);
const sourceAmount = useSelector(selectTransferAmount);
const plural = parseInt(sourceAmount) !== 1;
const explainerString = sourceParsedTokenAccount
? `You will transfer ${sourceAmount} token${
plural ? "s" : ""
} of ${shortenAddress(
sourceParsedTokenAccount?.mintKey
)}, from ${shortenAddress(sourceParsedTokenAccount?.publicKey)} on ${
CHAINS_BY_ID[sourceChain].name
}`
: "Step complete.";
return (
<Typography
component="div"
variant="subtitle2"
className={classes.description}
>
{explainerString}
</Typography>
);
}

View File

@ -0,0 +1,38 @@
import { makeStyles, Typography } from "@material-ui/core";
import { useSelector } from "react-redux";
import {
selectTransferTargetAddressHex,
selectTransferTargetChain,
} from "../../store/selectors";
import { hexToNativeString } from "../../utils/array";
import { CHAINS_BY_ID } from "../../utils/consts";
import { shortenAddress } from "../../utils/solana";
const useStyles = makeStyles((theme) => ({
description: {
textAlign: "center",
},
}));
export default function TargetPreview() {
const classes = useStyles();
const targetChain = useSelector(selectTransferTargetChain);
const targetAddress = useSelector(selectTransferTargetAddressHex); //TODO convert to readable
const targetAddressNative = hexToNativeString(targetAddress, targetChain);
const explainerString = targetAddressNative
? `to ${shortenAddress(targetAddressNative)} on ${
CHAINS_BY_ID[targetChain].name
}`
: "Step complete.";
return (
<Typography
component="div"
variant="subtitle2"
className={classes.description}
>
{explainerString}
</Typography>
);
}

View File

@ -23,7 +23,10 @@ import Redeem from "./Redeem";
import Send from "./Send";
import Source from "./Source";
import Target from "./Target";
import SourcePreview from "./SourcePreview";
import TargetPreview from "./TargetPreview";
import SendPreview from "./SendPreview";
import RedeemPreview from "./RedeemPreview";
// TODO: ensure that both wallets are connected to the same known network
// TODO: loaders and such, navigation block?
// TODO: refresh displayed token amount after transfer somehow, could be resolved by having different components appear
@ -62,27 +65,31 @@ function Transfer() {
orientation="vertical"
className={classes.rootContainer}
>
<Step>
<Step expanded={activeStep >= 0} disabled={preventNavigation}>
<StepButton onClick={() => dispatch(setStep(0))}>Source</StepButton>
<StepContent>
<Source setIsRecoveryOpen={setIsRecoveryOpen} />
{activeStep === 0 ? (
<Source setIsRecoveryOpen={setIsRecoveryOpen} />
) : (
<SourcePreview />
)}
</StepContent>
</Step>
<Step>
<Step expanded={activeStep >= 1} disabled={preventNavigation}>
<StepButton onClick={() => dispatch(setStep(1))}>Target</StepButton>
<StepContent>
<Target />
{activeStep === 1 ? <Target /> : <TargetPreview />}
</StepContent>
</Step>
<Step>
<Step expanded={activeStep >= 2}>
<StepButton onClick={() => dispatch(setStep(2))}>
Send tokens
</StepButton>
<StepContent>
<Send />
{activeStep === 2 ? <Send /> : <SendPreview />}
</StepContent>
</Step>
<Step>
<Step expanded={activeStep >= 3}>
<StepButton
onClick={() => dispatch(setStep(3))}
disabled={!isSendComplete}
@ -90,11 +97,15 @@ function Transfer() {
Redeem tokens
</StepButton>
<StepContent>
<Redeem />
{activeStep === 3 ? <Redeem /> : <RedeemPreview />}
</StepContent>
</Step>
</Stepper>
<Recovery open={isRecoveryOpen} setOpen={setIsRecoveryOpen} />
<Recovery
open={isRecoveryOpen}
setOpen={setIsRecoveryOpen}
disabled={preventNavigation}
/>
</Container>
);
}