From 4c9100a996a5125e52862285279dac893eb98cef Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Tue, 14 Jan 2020 15:32:32 +0100 Subject: [PATCH 1/3] Rollback zeroSync toggle in case it was not successful --- .../mobile/locales/en-US/accountScreen10.json | 7 +- .../locales/es-419/accountScreen10.json | 14 +- packages/mobile/src/account/DataSaver.tsx | 69 ++++-- .../__snapshots__/DataSaver.test.tsx.snap | 211 +++++++++++++++++- packages/mobile/src/web3/saga.ts | 19 +- 5 files changed, 290 insertions(+), 30 deletions(-) diff --git a/packages/mobile/locales/en-US/accountScreen10.json b/packages/mobile/locales/en-US/accountScreen10.json index 6ce6eb1c94c..ec7598f25b3 100644 --- a/packages/mobile/locales/en-US/accountScreen10.json +++ b/packages/mobile/locales/en-US/accountScreen10.json @@ -13,11 +13,16 @@ "enableDataSaver": "Enable Data Saver", "dataSaverDetail": "Data Saver mode allows you to communicate with the Celo Network through a trusted node. You can always change this mode in app settings.", - "restartModal": { + "restartModalSwitchOff": { "header": "Restart To Switch Off Data Saver", "body": "To switch Data Saver on and off repeatedly, you will need to restart the app.", "restart": "Restart to Switch" }, + "restartModalSwitchOn": { + "header": "Beware Of Restart", + "body": "In case of incorrect PIN, you will need to restart the app.", + "understand": "I understand" + }, "testFaqLink": "Celo Wallet FAQ", "termsOfServiceLink": "Terms of service", "editProfile": "Edit Profile", diff --git a/packages/mobile/locales/es-419/accountScreen10.json b/packages/mobile/locales/es-419/accountScreen10.json index c9150cff121..c28cf97f2ae 100755 --- a/packages/mobile/locales/es-419/accountScreen10.json +++ b/packages/mobile/locales/es-419/accountScreen10.json @@ -7,17 +7,21 @@ "sendIssueReport": "Reportar un incidente", "analytics": "Estadisticas de uso", "shareAnalytics": "Compartir estadisticas de uso", - "shareAnalytics_detail": - "Recopilamos datos anónimos sobre cómo utiliza Celo para ayudar a mejorar la aplicación para todos.", + "shareAnalytics_detail": "Recopilamos datos anónimos sobre cómo utiliza Celo para ayudar a mejorar la aplicación para todos.", "dataSaver": "Data Saver", "enableDataSaver": "Habilitar Data Saver", - "dataSaverDetail": - "El modo Data Saver te permite comunicarte con la Red Celo a través de un nodo confiable. Puedes cambiar este modo en la configuración de la aplicación.", - "restartModal": { + "dataSaverDetail": "El modo Data Saver te permite comunicarte con la Red Celo a través de un nodo confiable. Puedes cambiar este modo en la configuración de la aplicación.", + "restartModalSwitchOff": { "header": "Reiniciar para apagar Data Saver", "body": "Para encender y apagar Data Saver repetidamente, deberá reiniciar la aplicación.", "restart": "Reiniciar para alternar" }, + "restartModalSwitchOn": { + "header": "~~Beware Of Restart", + "body": "~~In case of incorrect PIN, you will need to restart the app.", + "understand": "~~I understand" + }, + "testFaqLink": "Las Preguntas Frecuentes del Monedero Celo", "termsOfServiceLink": "Las Condiciones de Servicio", "editProfile": "Editar perfil", diff --git a/packages/mobile/src/account/DataSaver.tsx b/packages/mobile/src/account/DataSaver.tsx index 24f3b84f8e0..1fbc9f2e6e9 100644 --- a/packages/mobile/src/account/DataSaver.tsx +++ b/packages/mobile/src/account/DataSaver.tsx @@ -35,7 +35,8 @@ const mapStateToProps = (state: RootState): StateProps => { } interface State { - modalVisible: boolean + switchOffModalVisible: boolean + switchOnModalVisible: boolean } export class DataSaver extends React.Component { @@ -45,29 +46,45 @@ export class DataSaver extends React.Component { }) state = { - modalVisible: false, + switchOffModalVisible: false, + switchOnModalVisible: false, } - showModal = () => { - this.setState({ modalVisible: true }) + showSwitchOffModal = () => { + this.setState({ switchOffModalVisible: true }) } - hideModal = () => { - this.setState({ modalVisible: false }) + hideSwitchOffModal = () => { + this.setState({ switchOffModalVisible: false }) } - onPressToggleWithRestartModal = () => { + onPressToggleWithSwitchOffModal = () => { this.props.toggleZeroSyncMode(false) - this.hideModal() + this.hideSwitchOffModal() + } + + showSwitchOnModal = () => { + this.setState({ switchOnModalVisible: true }) + } + + hideSwitchOnModal = () => { + this.setState({ switchOnModalVisible: false }) + } + + onPressToggleWithSwitchOnModal = () => { + this.props.toggleZeroSyncMode(true) + this.hideSwitchOnModal() } handleZeroSyncToggle = (zeroSyncMode: boolean) => { if (!zeroSyncMode && this.props.gethStartedThisSession) { // Starting geth a second time this app session which will // require an app restart, so show restart modal - this.showModal() + this.showSwitchOffModal() } else { - this.props.toggleZeroSyncMode(zeroSyncMode) + // If move to zeroSync was not successful we will need + // to rollback starting geth a second time + this.showSwitchOnModal() } } @@ -82,16 +99,36 @@ export class DataSaver extends React.Component { > {t('enableDataSaver')} - + + + {t('restartModalSwitchOff.header')} + {t('restartModalSwitchOff.body')} + + + {t('global:cancel')} + + + {t('restartModalSwitchOff.restart')} + + + + + - {t('restartModal.header')} - {t('restartModal.body')} + {t('restartModalSwitchOn.header')} + {t('restartModalSwitchOn.body')} - + {t('global:cancel')} - - {t('restartModal.restart')} + + {t('restartModalSwitchOn.understand')} diff --git a/packages/mobile/src/account/__snapshots__/DataSaver.test.tsx.snap b/packages/mobile/src/account/__snapshots__/DataSaver.test.tsx.snap index bf21d510e4f..317612ff86d 100644 --- a/packages/mobile/src/account/__snapshots__/DataSaver.test.tsx.snap +++ b/packages/mobile/src/account/__snapshots__/DataSaver.test.tsx.snap @@ -185,7 +185,7 @@ exports[`DataSaver renders correctly 1`] = ` } } > - restartModal.header + restartModalSwitchOff.header - restartModal.body + restartModalSwitchOff.body - restartModal.restart + restartModalSwitchOff.restart + + + + + + + + + + + + restartModalSwitchOn.header + + + restartModalSwitchOn.body + + + + + global:cancel + + + + + restartModalSwitchOn.understand diff --git a/packages/mobile/src/web3/saga.ts b/packages/mobile/src/web3/saga.ts index b5fac959a52..4085fadfb23 100644 --- a/packages/mobile/src/web3/saga.ts +++ b/packages/mobile/src/web3/saga.ts @@ -493,11 +493,20 @@ export function* toggleZeroSyncMode(action: SetIsZeroSyncAction) { yield call(switchToGethFromZeroSync) } // Unlock account to ensure private keys are accessible in new mode - const account = yield call(getConnectedUnlockedAccount) - Logger.debug( - TAG + '@toggleZeroSyncMode', - `Switched to ${action.zeroSyncMode} and able to unlock account ${account}` - ) + try { + const account = yield call(getConnectedUnlockedAccount) + Logger.debug( + TAG + '@toggleZeroSyncMode', + `Switched to ${action.zeroSyncMode} and able to unlock account ${account}` + ) + } catch (e) { + // Rollback if private keys aren't accessible in new mode + if (action.zeroSyncMode) { + yield call(switchToGethFromZeroSync) + } else { + yield call(switchToZeroSyncFromGeth) + } + } } export function* watchZeroSyncMode() { yield takeLatest(Actions.TOGGLE_IS_ZERO_SYNC, toggleZeroSyncMode) From 4f6585bef31ea48e29e0a0ce05f2be2a5c5314b3 Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Tue, 14 Jan 2020 20:03:39 +0100 Subject: [PATCH 2/3] Add Spanish translations --- packages/mobile/locales/es-419/accountScreen10.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/mobile/locales/es-419/accountScreen10.json b/packages/mobile/locales/es-419/accountScreen10.json index c28cf97f2ae..51434faa440 100755 --- a/packages/mobile/locales/es-419/accountScreen10.json +++ b/packages/mobile/locales/es-419/accountScreen10.json @@ -17,9 +17,9 @@ "restart": "Reiniciar para alternar" }, "restartModalSwitchOn": { - "header": "~~Beware Of Restart", - "body": "~~In case of incorrect PIN, you will need to restart the app.", - "understand": "~~I understand" + "header": "La aplicación se reiniciará", + "body": "En caso de ingresar un PIN incorrecto, la aplicación se reiniciará.", + "understand": "Entendido" }, "testFaqLink": "Las Preguntas Frecuentes del Monedero Celo", From 565354361d95fc6d39ecb9ceac36dddf25b7d01c Mon Sep 17 00:00:00 2001 From: Ivan Sorokin Date: Tue, 14 Jan 2020 20:23:31 +0100 Subject: [PATCH 3/3] Refactor Modal --- packages/mobile/src/account/DataSaver.tsx | 89 ++++++++++++++--------- 1 file changed, 55 insertions(+), 34 deletions(-) diff --git a/packages/mobile/src/account/DataSaver.tsx b/packages/mobile/src/account/DataSaver.tsx index 1fbc9f2e6e9..2ef1ebf66f2 100644 --- a/packages/mobile/src/account/DataSaver.tsx +++ b/packages/mobile/src/account/DataSaver.tsx @@ -39,6 +39,43 @@ interface State { switchOnModalVisible: boolean } +interface ModalProps { + isVisible: boolean + header: string + body: string + continueTitle: string + cancelTitle: string + onCancel: () => void + onContinue: () => void +} + +function WarningModal({ + isVisible, + header, + body, + continueTitle, + cancelTitle, + onCancel, + onContinue, +}: ModalProps) { + return ( + + + {header} + {body} + + + {cancelTitle} + + + {continueTitle} + + + + + ) +} + export class DataSaver extends React.Component { static navigationOptions = () => ({ ...headerWithBackButton, @@ -99,40 +136,24 @@ export class DataSaver extends React.Component { > {t('enableDataSaver')} - - - {t('restartModalSwitchOff.header')} - {t('restartModalSwitchOff.body')} - - - {t('global:cancel')} - - - {t('restartModalSwitchOff.restart')} - - - - - - - {t('restartModalSwitchOn.header')} - {t('restartModalSwitchOn.body')} - - - {t('global:cancel')} - - - {t('restartModalSwitchOn.understand')} - - - - + + ) }