mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
add openSeaEnabled preference (#12909)
* add openSeaEnabled preference * cleanup * add description copy
This commit is contained in:
parent
e25c34e86b
commit
3434b9f80a
@ -873,6 +873,12 @@
|
|||||||
"enableFromSettings": {
|
"enableFromSettings": {
|
||||||
"message": " Enable it from Settings."
|
"message": " Enable it from Settings."
|
||||||
},
|
},
|
||||||
|
"enableOpenSeaAPI": {
|
||||||
|
"message": "Enable OpenSea API"
|
||||||
|
},
|
||||||
|
"enableOpenSeaAPIDescription": {
|
||||||
|
"message": "Use OpenSea's API to fetch NFT data. NFT auto-detection relies on OpenSea's API, and will not be available when this is turned off."
|
||||||
|
},
|
||||||
"encryptionPublicKeyNotice": {
|
"encryptionPublicKeyNotice": {
|
||||||
"message": "$1 would like your public encryption key. By consenting, this site will be able to compose encrypted messages to you.",
|
"message": "$1 would like your public encryption key. By consenting, this site will be able to compose encrypted messages to you.",
|
||||||
"description": "$1 is the web3 site name"
|
"description": "$1 is the web3 site name"
|
||||||
|
@ -38,6 +38,7 @@ export default class PreferencesController {
|
|||||||
// set to false will be using the static list from contract-metadata
|
// set to false will be using the static list from contract-metadata
|
||||||
useTokenDetection: false,
|
useTokenDetection: false,
|
||||||
useCollectibleDetection: false,
|
useCollectibleDetection: false,
|
||||||
|
openSeaEnabled: false,
|
||||||
advancedGasFee: null,
|
advancedGasFee: null,
|
||||||
|
|
||||||
// WARNING: Do not use feature flags for security-sensitive things.
|
// WARNING: Do not use feature flags for security-sensitive things.
|
||||||
@ -138,9 +139,28 @@ export default class PreferencesController {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
setUseCollectibleDetection(val) {
|
setUseCollectibleDetection(val) {
|
||||||
|
const { openSeaEnabled } = this.store.getState();
|
||||||
|
if (val && !openSeaEnabled) {
|
||||||
|
throw new Error(
|
||||||
|
'useCollectibleDetection cannot be enabled if openSeaEnabled is false',
|
||||||
|
);
|
||||||
|
}
|
||||||
this.store.updateState({ useCollectibleDetection: val });
|
this.store.updateState({ useCollectibleDetection: val });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setter for the `openSeaEnabled` property
|
||||||
|
*
|
||||||
|
* @param {boolean} val - Whether or not the user prefers to use the OpenSea API for collectibles data.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
setOpenSeaEnabled(val) {
|
||||||
|
this.store.updateState({ openSeaEnabled: val });
|
||||||
|
if (!val) {
|
||||||
|
this.store.updateState({ useCollectibleDetection: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setter for the `advancedGasFee` property
|
* Setter for the `advancedGasFee` property
|
||||||
*
|
*
|
||||||
|
@ -278,6 +278,7 @@ describe('preferences controller', function () {
|
|||||||
preferencesController.store.getState().useCollectibleDetection,
|
preferencesController.store.getState().useCollectibleDetection,
|
||||||
false,
|
false,
|
||||||
);
|
);
|
||||||
|
preferencesController.setOpenSeaEnabled(true);
|
||||||
preferencesController.setUseCollectibleDetection(true);
|
preferencesController.setUseCollectibleDetection(true);
|
||||||
assert.equal(
|
assert.equal(
|
||||||
preferencesController.store.getState().useCollectibleDetection,
|
preferencesController.store.getState().useCollectibleDetection,
|
||||||
@ -286,6 +287,22 @@ describe('preferences controller', function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('setOpenSeaEnabled', function () {
|
||||||
|
it('should default to false', function () {
|
||||||
|
const state = preferencesController.store.getState();
|
||||||
|
assert.equal(state.openSeaEnabled, false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set the openSeaEnabled property in state', function () {
|
||||||
|
assert.equal(
|
||||||
|
preferencesController.store.getState().openSeaEnabled,
|
||||||
|
false,
|
||||||
|
);
|
||||||
|
preferencesController.setOpenSeaEnabled(true);
|
||||||
|
assert.equal(preferencesController.store.getState().openSeaEnabled, true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe('setAdvancedGasFee', function () {
|
describe('setAdvancedGasFee', function () {
|
||||||
it('should default to null', function () {
|
it('should default to null', function () {
|
||||||
const state = preferencesController.store.getState();
|
const state = preferencesController.store.getState();
|
||||||
|
@ -916,6 +916,10 @@ export default class MetamaskController extends EventEmitter {
|
|||||||
this.preferencesController.setUseCollectibleDetection,
|
this.preferencesController.setUseCollectibleDetection,
|
||||||
this.preferencesController,
|
this.preferencesController,
|
||||||
),
|
),
|
||||||
|
setOpenSeaEnabled: nodeify(
|
||||||
|
this.preferencesController.setOpenSeaEnabled,
|
||||||
|
this.preferencesController,
|
||||||
|
),
|
||||||
setIpfsGateway: this.setIpfsGateway.bind(this),
|
setIpfsGateway: this.setIpfsGateway.bind(this),
|
||||||
setParticipateInMetaMetrics: this.setParticipateInMetaMetrics.bind(this),
|
setParticipateInMetaMetrics: this.setParticipateInMetaMetrics.bind(this),
|
||||||
setCurrentLocale: this.setCurrentLocale.bind(this),
|
setCurrentLocale: this.setCurrentLocale.bind(this),
|
||||||
|
@ -13,6 +13,8 @@ export default class ExperimentalTab extends PureComponent {
|
|||||||
setUseTokenDetection: PropTypes.func,
|
setUseTokenDetection: PropTypes.func,
|
||||||
useCollectibleDetection: PropTypes.bool,
|
useCollectibleDetection: PropTypes.bool,
|
||||||
setUseCollectibleDetection: PropTypes.func,
|
setUseCollectibleDetection: PropTypes.func,
|
||||||
|
setOpenSeaEnabled: PropTypes.func,
|
||||||
|
openSeaEnabled: PropTypes.func,
|
||||||
};
|
};
|
||||||
|
|
||||||
renderTokenDetectionToggle() {
|
renderTokenDetectionToggle() {
|
||||||
@ -52,7 +54,11 @@ export default class ExperimentalTab extends PureComponent {
|
|||||||
|
|
||||||
renderCollectibleDetectionToggle() {
|
renderCollectibleDetectionToggle() {
|
||||||
const { t } = this.context;
|
const { t } = this.context;
|
||||||
const { useCollectibleDetection, setUseCollectibleDetection } = this.props;
|
const {
|
||||||
|
useCollectibleDetection,
|
||||||
|
setUseCollectibleDetection,
|
||||||
|
openSeaEnabled,
|
||||||
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="settings-page__content-row">
|
<div className="settings-page__content-row">
|
||||||
@ -65,6 +71,7 @@ export default class ExperimentalTab extends PureComponent {
|
|||||||
<div className="settings-page__content-item">
|
<div className="settings-page__content-item">
|
||||||
<div className="settings-page__content-item-col">
|
<div className="settings-page__content-item-col">
|
||||||
<ToggleButton
|
<ToggleButton
|
||||||
|
disabled={!openSeaEnabled}
|
||||||
value={useCollectibleDetection}
|
value={useCollectibleDetection}
|
||||||
onToggle={(value) => {
|
onToggle={(value) => {
|
||||||
this.context.metricsEvent({
|
this.context.metricsEvent({
|
||||||
@ -85,10 +92,46 @@ export default class ExperimentalTab extends PureComponent {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderOpenSeaEnabledToggle() {
|
||||||
|
const { t } = this.context;
|
||||||
|
const { openSeaEnabled, setOpenSeaEnabled } = this.props;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="settings-page__content-row">
|
||||||
|
<div className="settings-page__content-item">
|
||||||
|
<span>{t('enableOpenSeaAPI')}</span>
|
||||||
|
<div className="settings-page__content-description">
|
||||||
|
{t('enableOpenSeaAPIDescription')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="settings-page__content-item">
|
||||||
|
<div className="settings-page__content-item-col">
|
||||||
|
<ToggleButton
|
||||||
|
value={openSeaEnabled}
|
||||||
|
onToggle={(value) => {
|
||||||
|
this.context.metricsEvent({
|
||||||
|
eventOpts: {
|
||||||
|
category: 'Settings',
|
||||||
|
action: 'Enabled/Disable OpenSea',
|
||||||
|
name: 'Enabled/Disable OpenSea',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
setOpenSeaEnabled(!value);
|
||||||
|
}}
|
||||||
|
offLabel={t('off')}
|
||||||
|
onLabel={t('on')}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
return (
|
return (
|
||||||
<div className="settings-page__body">
|
<div className="settings-page__body">
|
||||||
{this.renderTokenDetectionToggle()}
|
{this.renderTokenDetectionToggle()}
|
||||||
|
{this.renderOpenSeaEnabledToggle()}
|
||||||
{this.renderCollectibleDetectionToggle()}
|
{this.renderCollectibleDetectionToggle()}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -4,10 +4,12 @@ import { withRouter } from 'react-router-dom';
|
|||||||
import {
|
import {
|
||||||
setUseTokenDetection,
|
setUseTokenDetection,
|
||||||
setUseCollectibleDetection,
|
setUseCollectibleDetection,
|
||||||
|
setOpenSeaEnabled,
|
||||||
} from '../../../store/actions';
|
} from '../../../store/actions';
|
||||||
import {
|
import {
|
||||||
getUseTokenDetection,
|
getUseTokenDetection,
|
||||||
getUseCollectibleDetection,
|
getUseCollectibleDetection,
|
||||||
|
getOpenSeaEnabled,
|
||||||
} from '../../../selectors';
|
} from '../../../selectors';
|
||||||
import ExperimentalTab from './experimental-tab.component';
|
import ExperimentalTab from './experimental-tab.component';
|
||||||
|
|
||||||
@ -15,6 +17,7 @@ const mapStateToProps = (state) => {
|
|||||||
return {
|
return {
|
||||||
useTokenDetection: getUseTokenDetection(state),
|
useTokenDetection: getUseTokenDetection(state),
|
||||||
useCollectibleDetection: getUseCollectibleDetection(state),
|
useCollectibleDetection: getUseCollectibleDetection(state),
|
||||||
|
openSeaEnabled: getOpenSeaEnabled(state),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -23,6 +26,7 @@ const mapDispatchToProps = (dispatch) => {
|
|||||||
setUseTokenDetection: (val) => dispatch(setUseTokenDetection(val)),
|
setUseTokenDetection: (val) => dispatch(setUseTokenDetection(val)),
|
||||||
setUseCollectibleDetection: (val) =>
|
setUseCollectibleDetection: (val) =>
|
||||||
dispatch(setUseCollectibleDetection(val)),
|
dispatch(setUseCollectibleDetection(val)),
|
||||||
|
setOpenSeaEnabled: (val) => dispatch(setOpenSeaEnabled(val)),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -711,6 +711,15 @@ export function getUseCollectibleDetection(state) {
|
|||||||
return Boolean(state.metamask.useCollectibleDetection);
|
return Boolean(state.metamask.useCollectibleDetection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* To get the openSeaEnabled flag which determines whether we use OpenSea's API
|
||||||
|
* @param {*} state
|
||||||
|
* @returns Boolean
|
||||||
|
*/
|
||||||
|
export function getOpenSeaEnabled(state) {
|
||||||
|
return Boolean(state.metamask.openSeaEnabled);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To retrieve the tokenList produced by TokenListcontroller
|
* To retrieve the tokenList produced by TokenListcontroller
|
||||||
* @param {*} state
|
* @param {*} state
|
||||||
|
@ -2190,6 +2190,19 @@ export function setUseCollectibleDetection(val) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function setOpenSeaEnabled(val) {
|
||||||
|
return (dispatch) => {
|
||||||
|
dispatch(showLoadingIndication());
|
||||||
|
log.debug(`background.setOpenSeaEnabled`);
|
||||||
|
background.setOpenSeaEnabled(val, (err) => {
|
||||||
|
dispatch(hideLoadingIndication());
|
||||||
|
if (err) {
|
||||||
|
dispatch(displayWarning(err.message));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function setAdvancedGasFee(val) {
|
export function setAdvancedGasFee(val) {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
dispatch(showLoadingIndication());
|
dispatch(showLoadingIndication());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user