Source.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { makeStyles, MenuItem, TextField } from "@material-ui/core";
  2. import { useCallback } from "react";
  3. import { useDispatch, useSelector } from "react-redux";
  4. import { useBetaContext } from "../../contexts/BetaContext";
  5. import {
  6. incrementStep,
  7. setSourceAsset,
  8. setSourceChain,
  9. } from "../../store/attestSlice";
  10. import {
  11. selectAttestIsSourceComplete,
  12. selectAttestShouldLockFields,
  13. selectAttestSourceAsset,
  14. selectAttestSourceChain,
  15. } from "../../store/selectors";
  16. import { BETA_CHAINS, CHAINS } from "../../utils/consts";
  17. import ButtonWithLoader from "../ButtonWithLoader";
  18. import KeyAndBalance from "../KeyAndBalance";
  19. import LowBalanceWarning from "../LowBalanceWarning";
  20. const useStyles = makeStyles((theme) => ({
  21. transferField: {
  22. marginTop: theme.spacing(5),
  23. },
  24. }));
  25. function Source() {
  26. const classes = useStyles();
  27. const dispatch = useDispatch();
  28. const isBeta = useBetaContext();
  29. const sourceChain = useSelector(selectAttestSourceChain);
  30. const sourceAsset = useSelector(selectAttestSourceAsset);
  31. const isSourceComplete = useSelector(selectAttestIsSourceComplete);
  32. const shouldLockFields = useSelector(selectAttestShouldLockFields);
  33. const handleSourceChange = useCallback(
  34. (event) => {
  35. dispatch(setSourceChain(event.target.value));
  36. },
  37. [dispatch]
  38. );
  39. const handleAssetChange = useCallback(
  40. (event) => {
  41. dispatch(setSourceAsset(event.target.value));
  42. },
  43. [dispatch]
  44. );
  45. const handleNextClick = useCallback(() => {
  46. dispatch(incrementStep());
  47. }, [dispatch]);
  48. return (
  49. <>
  50. <TextField
  51. select
  52. variant="outlined"
  53. fullWidth
  54. value={sourceChain}
  55. onChange={handleSourceChange}
  56. disabled={shouldLockFields}
  57. >
  58. {CHAINS.filter(({ id }) =>
  59. isBeta ? true : !BETA_CHAINS.includes(id)
  60. ).map(({ id, name }) => (
  61. <MenuItem key={id} value={id}>
  62. {name}
  63. </MenuItem>
  64. ))}
  65. </TextField>
  66. <KeyAndBalance chainId={sourceChain} />
  67. <TextField
  68. label="Asset"
  69. variant="outlined"
  70. fullWidth
  71. className={classes.transferField}
  72. value={sourceAsset}
  73. onChange={handleAssetChange}
  74. disabled={shouldLockFields}
  75. />
  76. <LowBalanceWarning chainId={sourceChain} />
  77. <ButtonWithLoader
  78. disabled={!isSourceComplete}
  79. onClick={handleNextClick}
  80. showLoader={false}
  81. >
  82. Next
  83. </ButtonWithLoader>
  84. </>
  85. );
  86. }
  87. export default Source;