diff --git a/web/cashtab/src/components/Common/Ticker.js b/web/cashtab/src/components/Common/Ticker.js --- a/web/cashtab/src/components/Common/Ticker.js +++ b/web/cashtab/src/components/Common/Ticker.js @@ -32,6 +32,7 @@ fiatCurrency: 'usd', sendModal: false, autoCameraOn: true, + showMessages: false, }, notificationDurationShort: 3, notificationDurationLong: 5, @@ -81,6 +82,7 @@ ], sendModal: [true, false], autoCameraOn: [true, false], + showMessages: [true, false], }, fiatCurrencies: { usd: { name: 'US Dollar', symbol: '$', slug: 'usd' }, diff --git a/web/cashtab/src/components/Configure/Configure.js b/web/cashtab/src/components/Configure/Configure.js --- a/web/cashtab/src/components/Configure/Configure.js +++ b/web/cashtab/src/components/Configure/Configure.js @@ -61,10 +61,6 @@ import { currency } from 'components/Common/Ticker.js'; const { Panel } = Collapse; -const SettingsLinkCtn = styled.div` - color: ${props => props.theme.lightWhite}; -`; - const SettingsLink = styled.a` text-decoration: underline; color: ${props => props.theme.eCashBlue}; @@ -476,6 +472,9 @@ } } } + .ShowMessages { + color: ${props => props.theme.lightWhite}; + } `; const Configure = () => { @@ -960,6 +959,9 @@ const handleCameraOverride = checkedState => { changeCashtabSettings('autoCameraOn', checkedState); }; + const handleUnknownSenderMsg = checkedState => { + changeCashtabSettings('showMessages', checkedState); + }; const getContactNameByAddress = contactAddress => { if (!contactAddress) { @@ -1878,19 +1880,32 @@ /> </GeneralSettingsItem> )} - <StyledSpacer /> - <SettingsLinkCtn> - [ - <SettingsLink - type="link" - href="https://docs.cashtab.com/docs/" - target="_blank" - rel="noreferrer" - > - Documentation - </SettingsLink> - ] - </SettingsLinkCtn> + <GeneralSettingsItem> + <div className="ShowMessages"> + <LockFilled /> Hide messages from unknown sender + </div> + <Switch + size="small" + checkedChildren={<CheckOutlined />} + unCheckedChildren={<CloseOutlined />} + checked={ + cashtabSettings + ? cashtabSettings.showMessages + : false + } + onChange={handleUnknownSenderMsg} + /> + </GeneralSettingsItem> + <StyledSpacer />[ + <SettingsLink + type="link" + href="https://docs.cashtab.com/docs/" + target="_blank" + rel="noreferrer" + > + Documentation + </SettingsLink> + ] </StyledConfigure> </SidePaddingCtn> ); diff --git a/web/cashtab/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap b/web/cashtab/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap --- a/web/cashtab/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap +++ b/web/cashtab/src/components/Configure/__tests__/__snapshots__/Configure.test.js.snap @@ -5,7 +5,7 @@ className="sc-cSHVUG jkzHCz" > <div - className="sc-TOsTZ bvNCJE" + className="sc-cHGsZl exGvdx" > <h2> <span @@ -72,7 +72,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -206,7 +206,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -323,7 +323,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -348,7 +348,7 @@ General Settings </h2> <div - className="sc-hmzhuo hnhvOF" + className="sc-ksYbfQ egiazp" > <div className="title" @@ -407,7 +407,7 @@ </span> </div> <div - className="sc-hmzhuo hnhvOF" + className="sc-ksYbfQ egiazp" > <div className="SendConfirm" @@ -470,23 +470,82 @@ </button> </div> <div - className="sc-kgAjT dqIHCd" - /> - <div - className="sc-csuQGl iEJzqX" + className="sc-ksYbfQ egiazp" > - [ - <a - className="sc-Rmtcm jetxTC" - href="https://docs.cashtab.com/docs/" - rel="noreferrer" - target="_blank" - type="link" - > - Documentation - </a> - ] + <div + className="ShowMessages" + > + <span + aria-label="lock" + className="anticon anticon-lock" + role="img" + > + <svg + aria-hidden="true" + data-icon="lock" + fill="currentColor" + focusable="false" + height="1em" + viewBox="64 64 896 896" + width="1em" + > + <path + d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z" + /> + </svg> + </span> + Hide messages from unknown sender + </div> + <button + aria-checked={false} + className="ant-switch ant-switch-small" + onClick={[Function]} + onKeyDown={[Function]} + role="switch" + type="button" + > + <div + className="ant-switch-handle" + /> + <span + className="ant-switch-inner" + > + <span + aria-label="close" + className="anticon anticon-close" + role="img" + > + <svg + aria-hidden="true" + data-icon="close" + fill="currentColor" + focusable="false" + height="1em" + viewBox="64 64 896 896" + width="1em" + > + <path + d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" + /> + </svg> + </span> + </span> + </button> </div> + <div + className="sc-TOsTZ iGtEPf" + /> + [ + <a + className="sc-csuQGl ezYjbJ" + href="https://docs.cashtab.com/docs/" + rel="noreferrer" + target="_blank" + type="link" + > + Documentation + </a> + ] </div> </div> `; @@ -496,7 +555,7 @@ className="sc-cSHVUG jkzHCz" > <div - className="sc-TOsTZ bvNCJE" + className="sc-cHGsZl exGvdx" > <h2> <span @@ -563,7 +622,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -697,7 +756,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -814,7 +873,7 @@ </div> </div> <div - className="sc-kgAjT dqIHCd" + className="sc-TOsTZ iGtEPf" /> <h2> <span @@ -839,7 +898,7 @@ General Settings </h2> <div - className="sc-hmzhuo hnhvOF" + className="sc-ksYbfQ egiazp" > <div className="title" @@ -898,7 +957,7 @@ </span> </div> <div - className="sc-hmzhuo hnhvOF" + className="sc-ksYbfQ egiazp" > <div className="SendConfirm" @@ -961,23 +1020,82 @@ </button> </div> <div - className="sc-kgAjT dqIHCd" - /> - <div - className="sc-csuQGl iEJzqX" + className="sc-ksYbfQ egiazp" > - [ - <a - className="sc-Rmtcm jetxTC" - href="https://docs.cashtab.com/docs/" - rel="noreferrer" - target="_blank" - type="link" - > - Documentation - </a> - ] + <div + className="ShowMessages" + > + <span + aria-label="lock" + className="anticon anticon-lock" + role="img" + > + <svg + aria-hidden="true" + data-icon="lock" + fill="currentColor" + focusable="false" + height="1em" + viewBox="64 64 896 896" + width="1em" + > + <path + d="M832 464h-68V240c0-70.7-57.3-128-128-128H388c-70.7 0-128 57.3-128 128v224h-68c-17.7 0-32 14.3-32 32v384c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V496c0-17.7-14.3-32-32-32zM540 701v53c0 4.4-3.6 8-8 8h-40c-4.4 0-8-3.6-8-8v-53a48.01 48.01 0 1156 0zm152-237H332V240c0-30.9 25.1-56 56-56h248c30.9 0 56 25.1 56 56v224z" + /> + </svg> + </span> + Hide messages from unknown sender + </div> + <button + aria-checked={false} + className="ant-switch ant-switch-small" + onClick={[Function]} + onKeyDown={[Function]} + role="switch" + type="button" + > + <div + className="ant-switch-handle" + /> + <span + className="ant-switch-inner" + > + <span + aria-label="close" + className="anticon anticon-close" + role="img" + > + <svg + aria-hidden="true" + data-icon="close" + fill="currentColor" + focusable="false" + height="1em" + viewBox="64 64 896 896" + width="1em" + > + <path + d="M563.8 512l262.5-312.9c4.4-5.2.7-13.1-6.1-13.1h-79.8c-4.7 0-9.2 2.1-12.3 5.7L511.6 449.8 295.1 191.7c-3-3.6-7.5-5.7-12.3-5.7H203c-6.8 0-10.5 7.9-6.1 13.1L459.4 512 196.9 824.9A7.95 7.95 0 00203 838h79.8c4.7 0 9.2-2.1 12.3-5.7l216.5-258.1 216.5 258.1c3 3.6 7.5 5.7 12.3 5.7h79.8c6.8 0 10.5-7.9 6.1-13.1L563.8 512z" + /> + </svg> + </span> + </span> + </button> </div> + <div + className="sc-TOsTZ iGtEPf" + /> + [ + <a + className="sc-csuQGl ezYjbJ" + href="https://docs.cashtab.com/docs/" + rel="noreferrer" + target="_blank" + type="link" + > + Documentation + </a> + ] </div> </div> `; diff --git a/web/cashtab/src/components/Home/Tx.js b/web/cashtab/src/components/Home/Tx.js --- a/web/cashtab/src/components/Home/Tx.js +++ b/web/cashtab/src/components/Home/Tx.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import PropTypes from 'prop-types'; import styled from 'styled-components'; @@ -10,6 +10,7 @@ ThemedContactsOutlined, } from 'components/Common/CustomIcons'; import { currency } from 'components/Common/Ticker'; +import { WalletContext } from 'utils/context'; import { fromLegacyDecimals } from 'utils/cashMethods'; import { formatBalance, formatDate } from 'utils/formatting'; import TokenIcon from 'components/Tokens/TokenIcon'; @@ -112,6 +113,7 @@ margin: 0; } `; + const OpReturnType = styled.div` text-align: right; width: 100%; @@ -119,6 +121,18 @@ border-radius: 5px; background: ${props => props.theme.sentMessage}; margin-top: 15px; + transition: max-height 500ms cubic-bezier(0, 1, 0, 1); + max-height: auto; + &[aria-expanded='true'] { + max-height: 5000px; + transition: max-height 500ms ease-in; + } + + &[aria-expanded='false'] { + transition: max-height 200ms ease-in; + max-height: 6rem; + } + h4 { color: ${props => props.theme.lightWhite}; margin: 0; @@ -134,7 +148,7 @@ } a { color: ${props => props.theme.contrast}; - margin: 0; + margin: 0px 0px 0px 5px; font-size: 10px; border: 1px solid ${props => props.theme.contrast}; border-radius: 5px; @@ -155,6 +169,22 @@ `} `; +const ShowHideMessageButton = styled.button` + color: ${props => props.theme.contrast}; + background-color: transparent; + margin: 0px 0px 0px 5px; + font-size: 10px; + border: 1px solid ${props => props.theme.contrast}; + border-radius: 5px; + padding: 1.6px 10px; + opacity: 0.6; + &:hover { + opacity: 1; + border-color: ${props => props.theme.eCashBlue}; + color: ${props => props.theme.contrast}; + background: ${props => props.theme.eCashBlue}; + } +`; const ReceivedLabel = styled.span` font-weight: bold; color: ${props => props.theme.eCashBlue} !important; @@ -350,6 +380,12 @@ addressesInContactList, contactList, }) => { + const ContextValue = React.useContext(WalletContext); + const { cashtabSettings } = ContextValue; + const [displayedMessage, setDisplayedMessage] = useState(false); + const handleShowMessage = () => { + setDisplayedMessage(!displayedMessage); + }; const txDate = typeof data.blocktime === 'undefined' ? formatDate() @@ -656,6 +692,11 @@ <> <OpReturnType received={!data.outgoingTx} + aria-expanded={ + cashtabSettings.showMessages + ? displayedMessage + : null + } > {!data.outgoingTx && !addressesInContactList.includes( @@ -686,43 +727,190 @@ '' )} <br /> - {/*unencrypted OP_RETURN Message*/} - {data.opReturnMessage && - !data.isEncryptedMessage ? ( - <p> - { - data.opReturnMessage - } - </p> - ) : ( - '' - )} - {/*encrypted and wallet is authorized to view OP_RETURN Message*/} - {data.opReturnMessage && - data.isEncryptedMessage && - data.decryptionSuccess ? ( - <p> - { - data.opReturnMessage - } - </p> - ) : ( - '' + {!cashtabSettings.showMessages && ( + <> + {/*unencrypted OP_RETURN Message*/} + {data.opReturnMessage && + !data.isEncryptedMessage ? ( + <p> + { + data.opReturnMessage + } + </p> + ) : ( + '' + )} + {/*encrypted and wallet is authorized to view OP_RETURN Message*/} + {data.opReturnMessage && + data.isEncryptedMessage && + data.decryptionSuccess ? ( + <p> + { + data.opReturnMessage + } + </p> + ) : ( + '' + )} + {/*encrypted but wallet is not authorized to view OP_RETURN Message*/} + {data.opReturnMessage && + data.isEncryptedMessage && + !data.decryptionSuccess ? ( + <UnauthorizedDecryptionMessage> + { + data.opReturnMessage + } + </UnauthorizedDecryptionMessage> + ) : ( + '' + )} + </> )} - {/*encrypted but wallet is not authorized to view OP_RETURN Message*/} - {data.opReturnMessage && - data.isEncryptedMessage && - !data.decryptionSuccess ? ( - <UnauthorizedDecryptionMessage> - { - data.opReturnMessage - } - </UnauthorizedDecryptionMessage> - ) : ( - '' + {cashtabSettings.showMessages && ( + <> + {/*unencrypted OP_RETURN Message*/} + {data.opReturnMessage && + !data.isEncryptedMessage ? ( + <> + {!displayedMessage && + !data.outgoingTx && + !addressesInContactList.includes( + data.replyAddress, + ) ? ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Show + </ShowHideMessageButton> + ) : ( + <> + <p> + {' '} + { + data.opReturnMessage + } + </p> + {!addressesInContactList.includes( + data.replyAddress, + ) && + !data.outgoingTx && ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Hide + </ShowHideMessageButton> + )} + </> + )} + </> + ) : ( + '' + )} + {/*encrypted and wallet is authorized to view OP_RETURN Message*/} + {data.opReturnMessage && + data.isEncryptedMessage && + data.decryptionSuccess ? ( + <> + {!displayedMessage && + !data.outgoingTx && + !addressesInContactList.includes( + data.replyAddress, + ) ? ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Show + </ShowHideMessageButton> + ) : ( + <> + <p> + { + data.opReturnMessage + } + </p> + {!addressesInContactList.includes( + data.replyAddress, + ) && ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Hide + </ShowHideMessageButton> + )} + </> + )} + </> + ) : ( + '' + )} + {/*encrypted but wallet is not authorized to view OP_RETURN Message*/} + {data.opReturnMessage && + data.isEncryptedMessage && + !data.decryptionSuccess ? ( + <> + {!displayedMessage && + !data.outgoingTx && + !addressesInContactList.includes( + data.replyAddress, + ) ? ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Show + </ShowHideMessageButton> + ) : ( + <> + <UnauthorizedDecryptionMessage> + { + data.opReturnMessage + } + </UnauthorizedDecryptionMessage> + {!addressesInContactList.includes( + data.replyAddress, + ) && + !data.outgoingTx && ( + <ShowHideMessageButton + onClick={e => { + e.stopPropagation(); + handleShowMessage(); + }} + > + Hide + </ShowHideMessageButton> + )} + </> + )} + </> + ) : ( + '' + )} + </> )} - {!data.outgoingTx && - data.replyAddress ? ( + + {(!data.outgoingTx && + data.replyAddress && + addressesInContactList.includes( + data.replyAddress, + )) || + (!cashtabSettings.showMessage && + !data.outgoingTx && + data.replyAddress && + displayedMessage) ? ( <Link to={{ pathname: `/send`, diff --git a/web/cashtab/src/components/Home/__tests__/__snapshots__/Home.test.js.snap b/web/cashtab/src/components/Home/__tests__/__snapshots__/Home.test.js.snap --- a/web/cashtab/src/components/Home/__tests__/__snapshots__/Home.test.js.snap +++ b/web/cashtab/src/components/Home/__tests__/__snapshots__/Home.test.js.snap @@ -3,15 +3,15 @@ exports[`Wallet with BCH balances 1`] = ` Array [ <div - className="sc-hqyNC luNPR" + className="sc-jbKcbu faxoqM" > <h4 - className="sc-hEsumM hZzUnj" + className="sc-ktHwxA gkcuAD" > MigrationTestAlpha </h4> <div - className="sc-dNLxif bysjmh" + className="sc-jqCOkK dLSRGG" > 0 @@ -19,26 +19,26 @@ </div> </div>, <div - className="sc-frDJqD bEXbjP" + className="sc-kvZOFW ffhsam" > <div - className="sc-ktHwxA iJahFG" + className="sc-cIShpX krQrho" > <button - className="sc-cIShpX gsGehV" + className="sc-kafWEX fkYLqq" onClick={[Function]} > Transactions </button> <button - className="sc-cIShpX inEMZA" + className="sc-kafWEX bfgVOD" onClick={[Function]} > eTokens </button> </div> <div - className="sc-kafWEX jxcJW" + className="sc-feJyhm geUMYx" > <div /> <span @@ -65,10 +65,10 @@ to send to others </div> <div - className="sc-kafWEX kdxNrF" + className="sc-feJyhm hJvKax" > <a - className="sc-jwKygS hmYfLq" + className="sc-btzYZH hZKmuP" href="/tokens" onClick={[Function]} > @@ -87,15 +87,15 @@ exports[`Wallet with BCH balances and tokens 1`] = ` Array [ <div - className="sc-hqyNC luNPR" + className="sc-jbKcbu faxoqM" > <h4 - className="sc-hEsumM hZzUnj" + className="sc-ktHwxA gkcuAD" > MigrationTestAlpha </h4> <div - className="sc-dNLxif bysjmh" + className="sc-jqCOkK dLSRGG" > 0 @@ -103,26 +103,26 @@ </div> </div>, <div - className="sc-frDJqD bEXbjP" + className="sc-kvZOFW ffhsam" > <div - className="sc-ktHwxA iJahFG" + className="sc-cIShpX krQrho" > <button - className="sc-cIShpX gsGehV" + className="sc-kafWEX fkYLqq" onClick={[Function]} > Transactions </button> <button - className="sc-cIShpX inEMZA" + className="sc-kafWEX bfgVOD" onClick={[Function]} > eTokens </button> </div> <div - className="sc-kafWEX jxcJW" + className="sc-feJyhm geUMYx" > <div /> <span @@ -149,10 +149,10 @@ to send to others </div> <div - className="sc-kafWEX kdxNrF" + className="sc-feJyhm hJvKax" > <a - className="sc-jwKygS hmYfLq" + className="sc-btzYZH hZKmuP" href="/tokens" onClick={[Function]} > @@ -171,15 +171,15 @@ exports[`Wallet with BCH balances and tokens and state field 1`] = ` Array [ <div - className="sc-hqyNC luNPR" + className="sc-jbKcbu faxoqM" > <h4 - className="sc-hEsumM hZzUnj" + className="sc-ktHwxA gkcuAD" > MigrationTestAlpha </h4> <div - className="sc-dNLxif bysjmh" + className="sc-jqCOkK dLSRGG" > 0.06 @@ -187,26 +187,26 @@ </div> </div>, <div - className="sc-frDJqD bEXbjP" + className="sc-kvZOFW ffhsam" > <div - className="sc-ktHwxA iJahFG" + className="sc-cIShpX krQrho" > <button - className="sc-cIShpX gsGehV" + className="sc-kafWEX fkYLqq" onClick={[Function]} > Transactions </button> <button - className="sc-cIShpX inEMZA" + className="sc-kafWEX bfgVOD" onClick={[Function]} > eTokens </button> </div> <div - className="sc-kafWEX jxcJW" + className="sc-feJyhm geUMYx" > <div /> <span @@ -233,10 +233,10 @@ to send to others </div> <div - className="sc-kafWEX kdxNrF" + className="sc-feJyhm hJvKax" > <a - className="sc-jwKygS hmYfLq" + className="sc-btzYZH hZKmuP" href="/tokens" onClick={[Function]} > @@ -274,15 +274,15 @@ exports[`Wallet without BCH balance 1`] = ` Array [ <div - className="sc-hqyNC luNPR" + className="sc-jbKcbu faxoqM" > <h4 - className="sc-hEsumM hZzUnj" + className="sc-ktHwxA gkcuAD" > MigrationTestAlpha </h4> <div - className="sc-dNLxif bysjmh" + className="sc-jqCOkK dLSRGG" > 0 @@ -290,26 +290,26 @@ </div> </div>, <div - className="sc-frDJqD bEXbjP" + className="sc-kvZOFW ffhsam" > <div - className="sc-ktHwxA iJahFG" + className="sc-cIShpX krQrho" > <button - className="sc-cIShpX gsGehV" + className="sc-kafWEX fkYLqq" onClick={[Function]} > Transactions </button> <button - className="sc-cIShpX inEMZA" + className="sc-kafWEX bfgVOD" onClick={[Function]} > eTokens </button> </div> <div - className="sc-kafWEX jxcJW" + className="sc-feJyhm geUMYx" > <div /> <span @@ -336,10 +336,10 @@ to send to others </div> <div - className="sc-kafWEX kdxNrF" + className="sc-feJyhm hJvKax" > <a - className="sc-jwKygS hmYfLq" + className="sc-btzYZH hZKmuP" href="/tokens" onClick={[Function]} > diff --git a/web/cashtab/src/utils/__tests__/validation.test.js b/web/cashtab/src/utils/__tests__/validation.test.js --- a/web/cashtab/src/utils/__tests__/validation.test.js +++ b/web/cashtab/src/utils/__tests__/validation.test.js @@ -268,6 +268,7 @@ fiatCurrency: 'usd', sendModal: false, autoCameraOn: true, + showMessages: true, }), ).toBe(true); }); @@ -676,12 +677,14 @@ fiatCurrency: 'gbp', sendModal: false, autoCameraOn: true, + showMessages: false, })); it('sets settings object with no exsting valid settings to default values', () => expect(parseInvalidSettingsForMigration({})).toStrictEqual({ fiatCurrency: 'usd', sendModal: false, autoCameraOn: true, + showMessages: false, })); it('does nothing if valid settings object is present in localStorage', () => expect( @@ -689,10 +692,12 @@ fiatCurrency: 'brl', sendModal: true, autoCameraOn: true, + showMessages: false, }), ).toStrictEqual({ fiatCurrency: 'brl', sendModal: true, autoCameraOn: true, + showMessages: false, })); });