|
|
|
import React, { useEffect, useCallback, useContext } from 'react';
|
|
|
|
import { useDispatch, useSelector } from 'react-redux';
|
|
|
|
import { useHistory, useLocation } from 'react-router-dom';
|
|
|
|
import {
|
|
|
|
addHistoryEntry,
|
|
|
|
getIsUsingMyAccountForRecipientSearch,
|
|
|
|
getRecipient,
|
|
|
|
getRecipientUserInput,
|
|
|
|
getSendStage,
|
|
|
|
initializeSendState,
|
|
|
|
resetRecipientInput,
|
|
|
|
resetSendState,
|
|
|
|
SEND_STAGES,
|
|
|
|
updateRecipient,
|
|
|
|
updateRecipientUserInput,
|
|
|
|
} from '../../ducks/send';
|
|
|
|
import { getCurrentChainId, isCustomPriceExcessive } from '../../selectors';
|
|
|
|
import { getSendHexDataFeatureFlagState } from '../../ducks/metamask/metamask';
|
|
|
|
import { showQrScanner } from '../../store/actions';
|
|
|
|
import { MetaMetricsContext } from '../../contexts/metametrics';
|
|
|
|
import { EVENT } from '../../../shared/constants/metametrics';
|
|
|
|
import SendHeader from './send-header';
|
|
|
|
import AddRecipient from './send-content/add-recipient';
|
|
|
|
import SendContent from './send-content';
|
|
|
|
import SendFooter from './send-footer';
|
|
|
|
import EnsInput from './send-content/add-recipient/ens-input';
|
|
|
|
|
|
|
|
const sendSliceIsCustomPriceExcessive = (state) =>
|
|
|
|
isCustomPriceExcessive(state, true);
|
|
|
|
|
|
|
|
export default function SendTransactionScreen() {
|
|
|
|
const history = useHistory();
|
|
|
|
const chainId = useSelector(getCurrentChainId);
|
|
|
|
const stage = useSelector(getSendStage);
|
|
|
|
const gasIsExcessive = useSelector(sendSliceIsCustomPriceExcessive);
|
|
|
|
const isUsingMyAccountsForRecipientSearch = useSelector(
|
|
|
|
getIsUsingMyAccountForRecipientSearch,
|
|
|
|
);
|
|
|
|
const recipient = useSelector(getRecipient);
|
|
|
|
const showHexData = useSelector(getSendHexDataFeatureFlagState);
|
|
|
|
const userInput = useSelector(getRecipientUserInput);
|
|
|
|
const location = useLocation();
|
|
|
|
const trackEvent = useContext(MetaMetricsContext);
|
|
|
|
|
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
|
|
const cleanup = useCallback(() => {
|
|
|
|
dispatch(resetSendState());
|
|
|
|
}, [dispatch]);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (chainId !== undefined) {
|
|
|
|
dispatch(initializeSendState());
|
|
|
|
window.addEventListener('beforeunload', cleanup);
|
|
|
|
}
|
|
|
|
}, [chainId, dispatch, cleanup]);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (location.search === '?scan=true') {
|
|
|
|
dispatch(showQrScanner());
|
|
|
|
|
|
|
|
// Clear the queryString param after showing the modal
|
|
|
|
const cleanUrl = window.location.href.split('?')[0];
|
|
|
|
window.history.pushState({}, null, `${cleanUrl}`);
|
|
|
|
window.location.hash = '#send';
|
|
|
|
}
|
|
|
|
}, [location, dispatch]);
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
return () => {
|
|
|
|
dispatch(resetSendState());
|
|
|
|
window.removeEventListener('beforeunload', cleanup);
|
|
|
|
};
|
|
|
|
}, [dispatch, cleanup]);
|
|
|
|
|
|
|
|
let content;
|
|
|
|
|
|
|
|
if ([SEND_STAGES.EDIT, SEND_STAGES.DRAFT].includes(stage)) {
|
|
|
|
content = (
|
|
|
|
<>
|
|
|
|
<SendContent
|
|
|
|
showHexData={showHexData}
|
|
|
|
gasIsExcessive={gasIsExcessive}
|
|
|
|
/>
|
|
|
|
<SendFooter key="send-footer" history={history} />
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
content = <AddRecipient />;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="page-container">
|
|
|
|
<SendHeader history={history} />
|
|
|
|
<EnsInput
|
|
|
|
userInput={userInput}
|
|
|
|
className="send__to-row"
|
|
|
|
onChange={(address) => dispatch(updateRecipientUserInput(address))}
|
|
|
|
onValidAddressTyped={(address) => {
|
|
|
|
dispatch(
|
|
|
|
addHistoryEntry(`sendFlow - Valid address typed ${address}`),
|
|
|
|
);
|
|
|
|
dispatch(updateRecipient({ address, nickname: '' }));
|
|
|
|
}}
|
|
|
|
internalSearch={isUsingMyAccountsForRecipientSearch}
|
|
|
|
selectedAddress={recipient.address}
|
|
|
|
selectedName={recipient.nickname}
|
|
|
|
onPaste={(text) => {
|
|
|
|
dispatch(
|
|
|
|
addHistoryEntry(
|
|
|
|
`sendFlow - User pasted ${text} into address field`,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
return dispatch(updateRecipient({ address: text, nickname: '' }));
|
|
|
|
}}
|
|
|
|
onReset={() => dispatch(resetRecipientInput())}
|
|
|
|
scanQrCode={() => {
|
|
|
|
trackEvent({
|
|
|
|
event: 'Used QR scanner',
|
|
|
|
category: EVENT.CATEGORIES.TRANSACTIONS,
|
|
|
|
properties: {
|
|
|
|
action: 'Edit Screen',
|
|
|
|
legacy_event: true,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
dispatch(showQrScanner());
|
|
|
|
}}
|
|
|
|
/>
|
|
|
|
{content}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|