diff --git a/lib/ui/system/update_dialog.dart b/lib/ui/system/update_dialog.dart index d4506bb14..fc8153414 100644 --- a/lib/ui/system/update_dialog.dart +++ b/lib/ui/system/update_dialog.dart @@ -1,4 +1,5 @@ import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/constants.dart'; @@ -15,8 +16,14 @@ class UpdateDialog extends StatefulWidget { _UpdateDialogState createState() => _UpdateDialogState(); } +enum UpdateState { + initial, + loading, + done, +} + class _UpdateDialogState extends State { - bool _isLoading = false; + UpdateState updateState = UpdateState.initial; @override Widget build(BuildContext context) { @@ -24,20 +31,22 @@ class _UpdateDialogState extends State { return AlertDialog( title: Text(localization.updateAvailable), - content: _isLoading - ? LoadingIndicator(height: 50) - : Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text(localization.aNewVersionIsAvailable), - SizedBox(height: 20), - Text('• ${localization.currentVersion}: v$kAppVersion'), - //Text('• ${localization.latestVersion}: v???'), - ], - ), + content: updateState == UpdateState.done + ? Text(localization.appUpdated) + : updateState == UpdateState.loading + ? LoadingIndicator(height: 50) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(localization.aNewVersionIsAvailable), + SizedBox(height: 20), + Text('• ${localization.currentVersion}: v$kAppVersion'), + //Text('• ${localization.latestVersion}: v???'), + ], + ), actions: [ - if (!_isLoading) ...[ + if (updateState == UpdateState.initial) ...[ FlatButton( child: Text(localization.cancel.toUpperCase()), onPressed: () { @@ -50,7 +59,13 @@ class _UpdateDialogState extends State { updateApp(context); }, ), - ] + ] else if (updateState == UpdateState.done) + FlatButton( + child: Text(localization.close.toUpperCase()), + onPressed: () { + Navigator.of(context).pop(); + }, + ), ], ); } @@ -60,21 +75,23 @@ class _UpdateDialogState extends State { passwordCallback( context: context, callback: (password) { - setState(() => _isLoading = true); + setState(() => updateState = UpdateState.loading); final credentials = state.credentials; final webClient = WebClient(); const url = '/self-update'; webClient .post(url, credentials.token, password: password) .then((dynamic response) { - setState(() => _isLoading = false); print('## response: $response'); - if (response == 'done') { - webReload(); + if (response == '{message: true}') { + setState(() => updateState = UpdateState.done); + if (kIsWeb) { + webReload(); + } } }).catchError((dynamic error) { showErrorDialog(context: context, message: '$error'); - setState(() => _isLoading = false); + setState(() => updateState = UpdateState.initial); }); }); } diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 7e8c01e97..bfe2f0cf7 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -17,8 +17,9 @@ mixin LocalizationsProvider on LocaleCodeAware { 'current_version': 'Current Version', 'latest_version': 'Latest Version', 'update_now': 'Update Now', - 'a_new_version_is_available': 'A new version of the app is available', + 'a_new_version_is_available': 'A new version of the web app is available', 'update_available': 'Update Available', + 'app_updated': 'Update successfully completed', 'learn_more': 'Learn More', 'integrations': 'Integrations', 'tracking_id': 'Tracking Id', @@ -32747,6 +32748,8 @@ mixin LocalizationsProvider on LocaleCodeAware { String get latestVersion => _localizedValues[localeCode]['latest_version']; + String get appUpdated => _localizedValues[localeCode]['app_updated']; + String lookup(String key) { final lookupKey = toSnakeCase(key); return _localizedValues[localeCode][lookupKey] ??