diff --git a/packages/mask/src/plugins/Pets/settings.ts b/packages/mask/src/plugins/Pets/settings.ts index 89cfc8dc529d..6b6180b4a8b6 100644 --- a/packages/mask/src/plugins/Pets/settings.ts +++ b/packages/mask/src/plugins/Pets/settings.ts @@ -1,4 +1,4 @@ import { createGlobalSettings } from '../../settings/createSettings' import { PetsPluginID } from './constants' -export const petShowSettings = createGlobalSettings(`${PetsPluginID}+selectedClosePet`, true) +export const petShowSettings = createGlobalSettings(`${PetsPluginID}+selectedClosePet`, true) diff --git a/packages/mask/src/plugins/Trader/settings.ts b/packages/mask/src/plugins/Trader/settings.ts index 82b450abf78f..d34219eaece5 100644 --- a/packages/mask/src/plugins/Trader/settings.ts +++ b/packages/mask/src/plugins/Trader/settings.ts @@ -7,12 +7,12 @@ import { DataProvider } from '@masknet/public-api' /** * The slippage tolerance of trader */ -export const currentSlippageSettings = createGlobalSettings(`${PLUGIN_ID}+slippageTolerance`, SLIPPAGE_DEFAULT) +export const currentSlippageSettings = createGlobalSettings(`${PLUGIN_ID}+slippageTolerance`, SLIPPAGE_DEFAULT) /** * Single Hop */ -export const currentSingleHopOnlySettings = createGlobalSettings(`${PLUGIN_ID}+singleHopOnly`, false) +export const currentSingleHopOnlySettings = createGlobalSettings(`${PLUGIN_ID}+singleHopOnly`, false) /** * The default data provider @@ -28,15 +28,9 @@ export interface TradeProviderSettings { } // #region the user preferred coin id -const coinGeckoPreferredCoinId = createInternalSettings(`${PLUGIN_ID}+currentCoinGeckoPreferredCoinId`, '{}') -const coinMarketCapPreferredCoinId = createInternalSettings( - `${PLUGIN_ID}+currentCoinMarketCapPreferredCoinId`, - '{}', -) -const coinUniswapPreferredCoinId = createInternalSettings( - `${PLUGIN_ID}+currentCoinUniswapPreferredCoinId`, - '{}', -) +const coinGeckoPreferredCoinId = createInternalSettings(`${PLUGIN_ID}+currentCoinGeckoPreferredCoinId`, '{}') +const coinMarketCapPreferredCoinId = createInternalSettings(`${PLUGIN_ID}+currentCoinMarketCapPreferredCoinId`, '{}') +const coinUniswapPreferredCoinId = createInternalSettings(`${PLUGIN_ID}+currentCoinUniswapPreferredCoinId`, '{}') export function getCurrentPreferredCoinIdSettings(dataProvider: DataProvider) { switch (dataProvider) { @@ -55,4 +49,4 @@ export function getCurrentPreferredCoinIdSettings(dataProvider: DataProvider) { /** * The approved tokens from uniswap */ -export const approvedTokensFromUniswap = createInternalSettings(`${PLUGIN_ID}+approvedTokens`, '[]') +export const approvedTokensFromUniswap = createInternalSettings(`${PLUGIN_ID}+approvedTokens`, '[]') diff --git a/packages/mask/src/plugins/Wallet/settings.ts b/packages/mask/src/plugins/Wallet/settings.ts index a0b94cd6c47f..f92053a39da9 100644 --- a/packages/mask/src/plugins/Wallet/settings.ts +++ b/packages/mask/src/plugins/Wallet/settings.ts @@ -1,5 +1,5 @@ import { isEqual } from 'lodash-unified' -import { createGlobalSettings } from '../../settings/createSettings' +import { createComplexGlobalSettings, createGlobalSettings } from '../../settings/createSettings' import { ChainId, NonFungibleAssetProvider, @@ -12,15 +12,9 @@ import { } from '@masknet/web3-shared-evm' import { PLUGIN_ID } from './constants' -export const currentMaskWalletAccountSettings = createGlobalSettings( - `${PLUGIN_ID}+selectedMaskWalletAddress`, - '', -) +export const currentMaskWalletAccountSettings = createGlobalSettings(`${PLUGIN_ID}+selectedMaskWalletAddress`, '') -export const currentMaskWalletChainIdSettings = createGlobalSettings( - `${PLUGIN_ID}+maskWalletChainId`, - ChainId.Mainnet, -) +export const currentMaskWalletChainIdSettings = createGlobalSettings(`${PLUGIN_ID}+maskWalletChainId`, ChainId.Mainnet) export const currentMaskWalletNetworkSettings = createGlobalSettings( `${PLUGIN_ID}+selectedMaskWalletNetwork`, @@ -32,7 +26,7 @@ export const currentMaskWalletLockStatusSettings = createGlobalSettings(`${PLUGIN_ID}+selectedWalletAddress`, '') +export const currentAccountSettings = createGlobalSettings(`${PLUGIN_ID}+selectedWalletAddress`, '') export const currentChainIdSettings = createGlobalSettings(`${PLUGIN_ID}+chainId`, ChainId.Mainnet) @@ -56,10 +50,14 @@ export const currentNonFungibleAssetDataProviderSettings = createGlobalSettings< NonFungibleAssetProvider.OPENSEA, ) -export const currentGasOptionsSettings = createGlobalSettings( +export const currentGasOptionsSettings = createComplexGlobalSettings( `${PLUGIN_ID}+gasOptions`, null, isEqual, ) -export const currentTokenPricesSettings = createGlobalSettings(`${PLUGIN_ID}+tokenPrices`, {}, isEqual) +export const currentTokenPricesSettings = createComplexGlobalSettings( + `${PLUGIN_ID}+tokenPrices`, + {}, + isEqual, +) diff --git a/packages/mask/src/settings/createSettings.ts b/packages/mask/src/settings/createSettings.ts index e55825ec7090..8e48b30a6aed 100644 --- a/packages/mask/src/settings/createSettings.ts +++ b/packages/mask/src/settings/createSettings.ts @@ -10,7 +10,7 @@ export type InternalSettings = ValueRef & { readonly resolve: (value: T) => void readonly reject: (e: Error) => void } -type ValueComparer = (a: T, b: T) => boolean +export type ValueComparer = (a: T, b: T) => boolean const defaultValueComparer = (a: any, b: any) => a === b const cached: Map> = new Map() @@ -44,10 +44,10 @@ MaskMessages.events.createInternalSettingsUpdated.on(async (payload) => { settings.resolve(settings.value) }) -export function createInternalSettings( +export function createComplexInternalSettings( key: string, value: T, - comparer: ValueComparer = defaultValueComparer, + comparer: ValueComparer, ) { const settings = new ValueRef(value, comparer) as InternalSettings const [readyPromise, resolve, reject] = defer() @@ -87,34 +87,49 @@ export function createInternalSettings( return settings } -export function createGlobalSettings( +export function createInternalSettings(key: string, defaultValue: number): InternalSettings +export function createInternalSettings(key: string, defaultValue: string): InternalSettings +export function createInternalSettings(key: string, defaultValue: boolean): InternalSettings +export function createInternalSettings(key: string, defaultValue: T): InternalSettings +export function createInternalSettings(key: string, defaultValue: any): InternalSettings { + return createComplexInternalSettings(key, defaultValue, defaultValueComparer) +} + +export function createComplexGlobalSettings( key: string, value: T, - comparer: ValueComparer = defaultValueComparer, + comparer: ValueComparer, ) { - const settings = createInternalSettings(`settings+${key}`, value, comparer) + const settings = createComplexInternalSettings(`settings+${key}`, value, comparer) return settings } +export function createGlobalSettings(key: string, defaultValue: number): InternalSettings +export function createGlobalSettings(key: string, defaultValue: string): InternalSettings +export function createGlobalSettings(key: string, defaultValue: boolean): InternalSettings +export function createGlobalSettings(key: string, defaultValue: T): InternalSettings +export function createGlobalSettings(key: string, defaultValue: any): InternalSettings { + return createComplexGlobalSettings(key, defaultValue, defaultValueComparer) +} export interface NetworkSettings { [networkKey: string]: ValueRef & { ready: boolean; readyPromise: Promise } } -export function createNetworkSettings( +export function createComplexNetworkSettings( settingsKey: string, defaultValue: T, - comparer: ValueComparer = defaultValueComparer, + comparer: ValueComparer, ) { const cached: NetworkSettings = {} MaskMessages.events.createNetworkSettingsReady.on((networkKey) => { if (networkKey.startsWith('plugin:') || settingsKey === 'pluginsEnabled') return if (!(networkKey in cached)) - cached[networkKey] = createInternalSettings(`${networkKey}+${settingsKey}`, defaultValue, comparer) + cached[networkKey] = createComplexInternalSettings(`${networkKey}+${settingsKey}`, defaultValue, comparer) }) return new Proxy(cached, { get(target, networkKey: string) { if (!(networkKey in target)) { - const settings = createInternalSettings(`${networkKey}+${settingsKey}`, defaultValue, comparer) + const settings = createComplexInternalSettings(`${networkKey}+${settingsKey}`, defaultValue, comparer) target[networkKey] = settings settings.readyPromise.then(() => MaskMessages.events.createNetworkSettingsReady.sendToAll(networkKey)) } @@ -127,3 +142,10 @@ export function createNetworkSettings( }, }) } +export function createNetworkSettings(key: string, defaultValue: number): NetworkSettings +export function createNetworkSettings(key: string, defaultValue: string): NetworkSettings +export function createNetworkSettings(key: string, defaultValue: boolean): NetworkSettings +export function createNetworkSettings(key: string, defaultValue: T): NetworkSettings +export function createNetworkSettings(key: string, defaultValue: any): NetworkSettings { + return createComplexNetworkSettings(key, defaultValue, defaultValueComparer) +} diff --git a/packages/mask/src/settings/settings.ts b/packages/mask/src/settings/settings.ts index 587dc78a9bff..d9a93e5dd663 100644 --- a/packages/mask/src/settings/settings.ts +++ b/packages/mask/src/settings/settings.ts @@ -1,4 +1,4 @@ -import { createGlobalSettings, createNetworkSettings, NetworkSettings } from './createSettings' +import { createGlobalSettings, createNetworkSettings, createComplexNetworkSettings } from './createSettings' import { LaunchPage } from './types' import { Appearance } from '@masknet/theme' import { LanguageOptions } from '@masknet/public-api' @@ -6,23 +6,23 @@ import { updateLanguage } from '@masknet/shared-base' import { PLUGIN_ID } from '../plugins/EVM/constants' import { isEqual } from 'lodash-unified' -export const debugModeSetting = createGlobalSettings('debugMode', false) +export const debugModeSetting = createGlobalSettings('debugMode', false) export const appearanceSettings = createGlobalSettings('appearance', Appearance.default) export const languageSettings = createGlobalSettings('language', LanguageOptions.__auto__) languageSettings.addListener(updateLanguage) -export const pluginIDSettings = createGlobalSettings('pluginID', PLUGIN_ID) +export const pluginIDSettings = createGlobalSettings('pluginID', PLUGIN_ID) -export const currentSetupGuideStatus: NetworkSettings = createNetworkSettings('currentSetupGuideStatus', '') -export const userGuideStatus: NetworkSettings = createNetworkSettings('userGuideStatus', '') -export const sayHelloShowed: NetworkSettings = createNetworkSettings('sayHelloShowed', false) -export const userPinExtension = createGlobalSettings('userPinExtension', false) -export const dismissVerifyNextID: NetworkSettings<{ [key in string]: boolean }> = createNetworkSettings( +export const currentSetupGuideStatus = createNetworkSettings('currentSetupGuideStatus', '') +export const userGuideStatus = createNetworkSettings('userGuideStatus', '') +export const sayHelloShowed = createNetworkSettings('sayHelloShowed', false) +export const userPinExtension = createGlobalSettings('userPinExtension', false) +export const dismissVerifyNextID = createComplexNetworkSettings( 'dismissVerifyNextID', - {}, + {} as Record, isEqual, ) -export const bioDescription: NetworkSettings = createNetworkSettings('bioDescription', '') -export const personalHomepage: NetworkSettings = createNetworkSettings('personalHomepage', '') +export const bioDescription = createNetworkSettings('bioDescription', '') +export const personalHomepage = createNetworkSettings('personalHomepage', '') // This is a misuse of concept "NetworkSettings" as "namespaced settings" // The refactor is tracked in https://github.com/DimensionDev/Maskbook/issues/1884 /** @@ -32,12 +32,9 @@ export const personalHomepage: NetworkSettings = createNetworkSettings(' * `useActivatedPluginsDashboard().find((x) => x.ID === PLUGIN_ID)` instead */ // This was "currentPluginEnabled" before, but we used it to represent minimal mode now to make the settings be able to migrate. -export const currentPluginMinimalModeNOTEnabled: NetworkSettings = createNetworkSettings( - 'pluginsEnabled', - true, -) +export const currentPluginMinimalModeNOTEnabled = createNetworkSettings('pluginsEnabled', true) export const launchPageSettings = createGlobalSettings('launchPage', LaunchPage.dashboard) -export const currentPersonaIdentifier = createGlobalSettings('currentPersonaIdentifier', '') +export const currentPersonaIdentifier = createGlobalSettings('currentPersonaIdentifier', '') try { // Migrate language settings