diff --git a/packages/neuron-ui/src/components/Addresses/index.tsx b/packages/neuron-ui/src/components/Addresses/index.tsx index ca19dc38d6..4302ba02b5 100644 --- a/packages/neuron-ui/src/components/Addresses/index.tsx +++ b/packages/neuron-ui/src/components/Addresses/index.tsx @@ -28,7 +28,10 @@ const Addresses = ({ }, wallet: { addresses = [], id: walletID }, chain: { networkID }, - settings: { showAddressBook = false, networks = [] }, + settings: { + general: { showAddressBook = false }, + networks = [], + }, history, dispatch, }: React.PropsWithoutRef) => { diff --git a/packages/neuron-ui/src/components/GeneralSetting/index.tsx b/packages/neuron-ui/src/components/GeneralSetting/index.tsx index bb82bc081b..3fc11cef16 100644 --- a/packages/neuron-ui/src/components/GeneralSetting/index.tsx +++ b/packages/neuron-ui/src/components/GeneralSetting/index.tsx @@ -1,15 +1,21 @@ -import React, { useCallback } from 'react' +import React, { useMemo } from 'react' import { Stack, Toggle } from 'office-ui-fabric-react' import { useTranslation } from 'react-i18next' import { StateWithDispatch } from 'states/stateProvider/reducer' -import { toggleAddressBook } from 'states/stateProvider/actionCreators' +import { toggleAddressBook, setSkipDataAndType } from 'states/stateProvider/actionCreators' -const GeneralSetting = ({ settings: { showAddressBook }, dispatch }: React.PropsWithoutRef) => { +const GeneralSetting = ({ + settings: { + general: { showAddressBook, skipDataAndType }, + }, + dispatch, +}: React.PropsWithoutRef) => { const [t] = useTranslation() - const onToggle = useCallback(() => { - dispatch(toggleAddressBook()) - }, [dispatch]) + const [onToggleAddressVisibility, onSetSkipDataAndType] = useMemo( + () => [() => dispatch(toggleAddressBook()), () => setSkipDataAndType(!skipDataAndType)(dispatch)], + [dispatch, skipDataAndType] + ) return ( + ) diff --git a/packages/neuron-ui/src/containers/Navbar/index.tsx b/packages/neuron-ui/src/containers/Navbar/index.tsx index a0ecd8a783..0cbf38b4e1 100644 --- a/packages/neuron-ui/src/containers/Navbar/index.tsx +++ b/packages/neuron-ui/src/containers/Navbar/index.tsx @@ -42,7 +42,10 @@ const Navbar = ({ }: React.PropsWithoutRef) => { const neuronWallet = useState() const { - settings: { wallets = [], showAddressBook = false }, + settings: { + wallets = [], + general: { showAddressBook = false }, + }, } = neuronWallet const [t] = useTranslation() diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json index eac2b562a3..c64691cfe7 100644 --- a/packages/neuron-ui/src/locales/en.json +++ b/packages/neuron-ui/src/locales/en.json @@ -164,6 +164,7 @@ }, "general": { "display-address-book-in-the-navbar": "Show the address book", + "skip-data-and-type": "Skip the cells which contain data or type script", "show": "Show", "hide": "Hide" }, diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json index 68bfad858c..9b8136feb8 100644 --- a/packages/neuron-ui/src/locales/zh.json +++ b/packages/neuron-ui/src/locales/zh.json @@ -164,6 +164,7 @@ }, "general": { "display-address-book-in-the-navbar": "显示地址簿", + "skip-data-and-type": "忽略包含 Data 或 Type Script 的 Cell", "show": "显示", "hide": "隐藏" }, diff --git a/packages/neuron-ui/src/services/remote/index.ts b/packages/neuron-ui/src/services/remote/index.ts index fff8b2c7ca..36802546db 100644 --- a/packages/neuron-ui/src/services/remote/index.ts +++ b/packages/neuron-ui/src/services/remote/index.ts @@ -2,6 +2,7 @@ export * from './app' export * from './wallets' export * from './networks' export * from './transactions' +export * from './skipDataAndType' export const getLocale = () => { if (!window.remote) { diff --git a/packages/neuron-ui/src/services/remote/skipDataAndType.ts b/packages/neuron-ui/src/services/remote/skipDataAndType.ts new file mode 100644 index 0000000000..bad9e87889 --- /dev/null +++ b/packages/neuron-ui/src/services/remote/skipDataAndType.ts @@ -0,0 +1,11 @@ +import { controllerMethodWrapper } from './controllerMethodWrapper' + +const CONTROLLER_NAME = 'skip-data-and-type' + +export const setSkipDataAndType = controllerMethodWrapper(CONTROLLER_NAME)( + (controller: any) => (params: Controller.SetSkipAndTypeParam) => { + return controller.update(params) + } +) + +export default { setSkipDataAndType } diff --git a/packages/neuron-ui/src/states/initStates/settings.ts b/packages/neuron-ui/src/states/initStates/settings.ts index 87865b4d89..27058778e5 100644 --- a/packages/neuron-ui/src/states/initStates/settings.ts +++ b/packages/neuron-ui/src/states/initStates/settings.ts @@ -1,7 +1,10 @@ import { addressBook, wallets, networks } from 'services/localCache' export const settingsState: State.Settings = { - showAddressBook: addressBook.isVisible(), + general: { + skipDataAndType: false, + showAddressBook: addressBook.isVisible(), + }, networks: networks.load(), wallets: wallets.load(), } diff --git a/packages/neuron-ui/src/states/stateProvider/actionCreators/app.ts b/packages/neuron-ui/src/states/stateProvider/actionCreators/app.ts index 8459153c57..a517ad397e 100644 --- a/packages/neuron-ui/src/states/stateProvider/actionCreators/app.ts +++ b/packages/neuron-ui/src/states/stateProvider/actionCreators/app.ts @@ -26,6 +26,7 @@ export const initAppState = () => (dispatch: StateDispatch, history: any) => { syncedBlockNumber = '', connectionStatus = false, codeHash = '', + skipDataAndType = false, } = res.result dispatch({ type: NeuronWalletActions.InitAppState, @@ -38,6 +39,7 @@ export const initAppState = () => (dispatch: StateDispatch, history: any) => { syncedBlockNumber, connectionStatus, codeHash, + skipDataAndType, }, }) if (!wallet) { diff --git a/packages/neuron-ui/src/states/stateProvider/actionCreators/index.ts b/packages/neuron-ui/src/states/stateProvider/actionCreators/index.ts index b1ea341f64..bb72ba1655 100644 --- a/packages/neuron-ui/src/states/stateProvider/actionCreators/index.ts +++ b/packages/neuron-ui/src/states/stateProvider/actionCreators/index.ts @@ -2,16 +2,19 @@ import app from './app' import wallets from './wallets' import transactions from './transactions' import settings from './settings' +import skipDataAndType from './skipDataAndType' export * from './app' export * from './wallets' export * from './transactions' export * from './settings' +export * from './skipDataAndType' export const actionCreators = { ...app, ...wallets, ...transactions, ...settings, + ...skipDataAndType, } export default actionCreators diff --git a/packages/neuron-ui/src/states/stateProvider/actionCreators/skipDataAndType.ts b/packages/neuron-ui/src/states/stateProvider/actionCreators/skipDataAndType.ts new file mode 100644 index 0000000000..712613d89f --- /dev/null +++ b/packages/neuron-ui/src/states/stateProvider/actionCreators/skipDataAndType.ts @@ -0,0 +1,21 @@ +import { setSkipDataAndType as setRemoteSkipDataAndType } from 'services/remote' +import { failureResToNotification } from 'utils/formatters' +import { StateDispatch, NeuronWalletActions } from '../reducer' +import { addNotification } from './app' + +export const setSkipDataAndType = (skip: Controller.SetSkipAndTypeParam) => (dispatch: StateDispatch) => { + setRemoteSkipDataAndType(skip).then(res => { + if (res.status === 1) { + dispatch({ + type: NeuronWalletActions.UpdateSkipDataAndType, + payload: res.result, + }) + } else { + addNotification(failureResToNotification(res))(dispatch) + } + }) +} + +export default { + setSkipDataAndType, +} diff --git a/packages/neuron-ui/src/states/stateProvider/reducer.ts b/packages/neuron-ui/src/states/stateProvider/reducer.ts index b5e3f86e45..9012980aed 100644 --- a/packages/neuron-ui/src/states/stateProvider/reducer.ts +++ b/packages/neuron-ui/src/states/stateProvider/reducer.ts @@ -18,6 +18,8 @@ export enum NeuronWalletActions { // Connection UpdateConnectionStatus = 'updateConnectionStatus', UpdateSyncedBlockNumber = 'updateSyncedBlockNumber', + // settings + UpdateSkipDataAndType = 'updateSkipDataAndType', } export enum AppActions { ToggleAddressBookVisibility = 'toggleAddressBookVisibility', @@ -77,6 +79,7 @@ export const reducer = ( syncedBlockNumber, connectionStatus, codeHash, + skipDataAndType, } = payload return { ...state, @@ -90,7 +93,10 @@ export const reducer = ( tipBlockNumber: syncedBlockNumber, }, settings: { - ...state.settings, + general: { + ...state.settings.general, + skipDataAndType, + }, networks, wallets, }, @@ -101,7 +107,22 @@ export const reducer = ( ...state, settings: { ...settings, - showAddressBook: !settings.showAddressBook, + general: { + ...settings.general, + showAddressBook: !settings.general.showAddressBook, + }, + }, + } + } + case NeuronWalletActions.UpdateSkipDataAndType: { + return { + ...state, + settings: { + ...settings, + general: { + ...settings.general, + skipDataAndType: payload, + }, }, } } diff --git a/packages/neuron-ui/src/types/App/index.d.ts b/packages/neuron-ui/src/types/App/index.d.ts index 44725f33ef..b38d199b9a 100644 --- a/packages/neuron-ui/src/types/App/index.d.ts +++ b/packages/neuron-ui/src/types/App/index.d.ts @@ -139,7 +139,10 @@ declare namespace State { } } interface Settings { - showAddressBook: boolean + general: { + skipDataAndType: boolean + showAddressBook: boolean + } networks: Network[] wallets: WalletIdentity[] } diff --git a/packages/neuron-ui/src/types/Controller/index.d.ts b/packages/neuron-ui/src/types/Controller/index.d.ts index a9756b785d..5f1f5ae489 100644 --- a/packages/neuron-ui/src/types/Controller/index.d.ts +++ b/packages/neuron-ui/src/types/Controller/index.d.ts @@ -70,4 +70,5 @@ declare namespace Controller { hash: string description: string } + type SetSkipAndTypeParam = boolean } diff --git a/packages/neuron-wallet/src/controllers/app/index.ts b/packages/neuron-wallet/src/controllers/app/index.ts index 7d823ec7af..b6bbc6789a 100644 --- a/packages/neuron-wallet/src/controllers/app/index.ts +++ b/packages/neuron-wallet/src/controllers/app/index.ts @@ -19,6 +19,7 @@ import WalletsService from 'services/wallets' import WalletsController from 'controllers/wallets' import SyncInfoController from 'controllers/sync-info' import UpdateController from 'controllers/update' +import SkipDataAndType from 'services/settings/skip-data-and-type' import { ResponseCode } from 'utils/const' import WindowManager from 'models/window-manager' @@ -63,7 +64,7 @@ export default class AppController { }, () => { resolve(false) - } + }, ) }), new Promise(resolve => { @@ -84,8 +85,8 @@ export default class AppController { } } return undefined - }) - ) + }), + ), ) const addresses: Controller.Address[] = await (currentWallet ? WalletsController.getAllAddresses(currentWallet.id).then(res => res.result) @@ -99,6 +100,9 @@ export default class AppController { walletID: currentWallet.id, }).then(res => res.result) : [] + + const skipDataAndType = SkipDataAndType.getInstance().get() + const initState = { currentWallet, wallets: [...wallets.map(({ name, id }, idx: number) => ({ id, name, minerAddress: minerAddresses[idx] }))], @@ -109,6 +113,7 @@ export default class AppController { syncedBlockNumber, connectionStatus, codeHash, + skipDataAndType, } return { status: ResponseCode.Success, result: initState } diff --git a/packages/neuron-wallet/src/controllers/index.ts b/packages/neuron-wallet/src/controllers/index.ts index 600f3d2981..847c7d5ccf 100644 --- a/packages/neuron-wallet/src/controllers/index.ts +++ b/packages/neuron-wallet/src/controllers/index.ts @@ -3,6 +3,7 @@ import NetworksController from './networks' import WalletsController from './wallets' import TransactionsController from './transactions' import SyncInfoController from './sync-info' +import SkipDataAndTypeController from './skip-data-and-type' export default { AppController, @@ -10,4 +11,5 @@ export default { WalletsController, TransactionsController, SyncInfoController, + SkipDataAndTypeController, } diff --git a/packages/neuron-wallet/tests-e2e/main.test.ts b/packages/neuron-wallet/tests-e2e/main.test.ts index e6d0abe04a..8fec129977 100644 --- a/packages/neuron-wallet/tests-e2e/main.test.ts +++ b/packages/neuron-wallet/tests-e2e/main.test.ts @@ -45,3 +45,10 @@ describe('Test address book', () => { afterAll(() => app.stop()) tests.AddressBook(app) }) + +describe('Test general settings', () => { + let app = new Application() + beforeAll(() => app.start()) + afterAll(() => app.stop()) + tests.GeneralSettings(app) +}) diff --git a/packages/neuron-wallet/tests-e2e/tests/generalSettings.ts b/packages/neuron-wallet/tests-e2e/tests/generalSettings.ts new file mode 100644 index 0000000000..e2c9582416 --- /dev/null +++ b/packages/neuron-wallet/tests-e2e/tests/generalSettings.ts @@ -0,0 +1,40 @@ +import Application from '../application' + +/** + * 1. navigate to the general settings handleViewError + * 2. the toggle of address book and skip data and type script should be off + * 3. click on the toggles and their statuses should be updated + * 4. refresh the view and the statuses should be preserved + */ +export default (app: Application) => { + beforeAll(async () => { + app.clickMenu(['Electron', 'Preferences...']) + await app.waitUntilLoaded() + }) + + describe('Test general settings', () => { + app.test('Check the initialized statuses', async () => { + const { client } = app.spectron + const toggles = await client.$$('button[role=switch]') + expect(toggles).toHaveLength(2) + expect((await client.elementIdAttribute(toggles[0].value.ELEMENT, 'aria-checked')).value).toBe('false') + expect((await client.elementIdAttribute(toggles[1].value.ELEMENT, 'aria-checked')).value).toBe('true') + }) + + app.test('toggle AddressBook to true and SkipDataAndType to false', async () => { + const { client } = app.spectron + await app.waitUntilLoaded() + const toggles = await client.$$('button[role=switch]') + + toggles.forEach((_, idx) => { + client.elementIdClick(toggles[idx].value.ELEMENT) + }) + + await app.waitUntilLoaded() + expect((await client.elementIdAttribute(toggles[0].value.ELEMENT, 'aria-checked')).value).toBe('true') + expect((await client.elementIdAttribute(toggles[1].value.ELEMENT, 'aria-checked')).value).toBe('false') + }) + + test.skip('Toggle statuses should be preserved', async () => {}) + }) +} diff --git a/packages/neuron-wallet/tests-e2e/tests/index.ts b/packages/neuron-wallet/tests-e2e/tests/index.ts index b9b2a1193a..d434fd4d39 100644 --- a/packages/neuron-wallet/tests-e2e/tests/index.ts +++ b/packages/neuron-wallet/tests-e2e/tests/index.ts @@ -4,6 +4,7 @@ import Transaction from './transaction' import SendTransaction from './sendTransaction' import Notification from './notification' import AddressBook from './addressBook' +import GeneralSettings from './generalSettings' export default { Wallet, @@ -12,4 +13,5 @@ export default { SendTransaction, Notification, AddressBook, + GeneralSettings, }