diff --git a/lib/data/repositories/settings_repository.dart b/lib/data/repositories/settings_repository.dart index 074532179..19357a4d2 100644 --- a/lib/data/repositories/settings_repository.dart +++ b/lib/data/repositories/settings_repository.dart @@ -81,6 +81,35 @@ class SettingsRepository { return userResponse.data; } + Future connectGmailUser( + Credentials credentials, + String password, + String idToken, + String serverAuthCode, + ) async { + dynamic response; + + final url = + credentials.url + '/connected_account/gmail?include=company_user'; + response = await webClient.post( + url, + credentials.token, + data: json.encode( + { + 'id_token': idToken, + 'server_auth_code': serverAuthCode, + }, + ), + password: password, + idToken: idToken, + ); + + final UserItemResponse userResponse = + serializers.deserializeWith(UserItemResponse.serializer, response); + + return userResponse.data; + } + Future saveUserSettings( Credentials credentials, UserEntity user) async { final data = serializers.serializeWith(UserEntity.serializer, user); diff --git a/lib/redux/settings/settings_actions.dart b/lib/redux/settings/settings_actions.dart index 19f11f90c..550af615d 100644 --- a/lib/redux/settings/settings_actions.dart +++ b/lib/redux/settings/settings_actions.dart @@ -143,6 +143,33 @@ class ConnecOAuthUserFailure implements StopSaving { final Object error; } +class ConnecGmailUserRequest implements StartSaving { + ConnecGmailUserRequest({ + @required this.serverAuthCode, + @required this.idToken, + this.completer, + this.password, + }); + + final Completer completer; + final String idToken; + final String password; + final String serverAuthCode; +} + +class ConnecGmailUserSuccess + implements StopSaving, PersistData, PersistUI, UserVerifiedPassword { + ConnecGmailUserSuccess(this.user); + + final UserEntity user; +} + +class ConnecGmailUserFailure implements StopSaving { + ConnecGmailUserFailure(this.error); + + final Object error; +} + class FilterSettings implements PersistUI { FilterSettings(this.filter); diff --git a/lib/redux/settings/settings_middleware.dart b/lib/redux/settings/settings_middleware.dart index 7b0371397..20823f313 100644 --- a/lib/redux/settings/settings_middleware.dart +++ b/lib/redux/settings/settings_middleware.dart @@ -24,6 +24,7 @@ List> createStoreSettingsMiddleware([ final saveCompany = _saveCompany(repository); final saveAuthUser = _saveAuthUser(repository); final connectOAuthUser = _connectOAuthUser(repository); + final connectGmailUser = _connectGmailUser(repository); final saveSettings = _saveSettings(repository); final uploadLogo = _uploadLogo(repository); final saveDocument = _saveDocument(repository); @@ -33,6 +34,7 @@ List> createStoreSettingsMiddleware([ TypedMiddleware(saveCompany), TypedMiddleware(saveAuthUser), TypedMiddleware(connectOAuthUser), + TypedMiddleware(connectGmailUser), TypedMiddleware(saveSettings), TypedMiddleware(uploadLogo), TypedMiddleware(saveDocument), @@ -130,8 +132,8 @@ Middleware _connectOAuthUser(SettingsRepository settingsRepository) { final action = dynamicAction as ConnecOAuthUserRequest; settingsRepository - .connectOAuthUser(store.state.credentials, action.password, - action.idToken) + .connectOAuthUser( + store.state.credentials, action.password, action.idToken) .then((user) { store.dispatch(ConnecOAuthUserSuccess(user)); if (action.completer != null) { @@ -152,6 +154,33 @@ Middleware _connectOAuthUser(SettingsRepository settingsRepository) { }; } +Middleware _connectGmailUser(SettingsRepository settingsRepository) { + return (Store store, dynamic dynamicAction, NextDispatcher next) { + final action = dynamicAction as ConnecGmailUserRequest; + + settingsRepository + .connectGmailUser(store.state.credentials, action.password, + action.idToken, action.serverAuthCode) + .then((user) { + store.dispatch(ConnecGmailUserSuccess(user)); + if (action.completer != null) { + action.completer.complete(); + } + }).catchError((Object error) { + print(error); + store.dispatch(ConnecGmailUserFailure(error)); + if ('$error'.contains('412')) { + store.dispatch(UserUnverifiedPassword()); + } + if (action.completer != null) { + action.completer.completeError(error); + } + }); + + next(action); + }; +} + Middleware _saveSettings(SettingsRepository settingsRepository) { return (Store store, dynamic dynamicAction, NextDispatcher next) { final action = dynamicAction as SaveUserSettingsRequest; diff --git a/lib/ui/settings/user_details_vm.dart b/lib/ui/settings/user_details_vm.dart index d35f8716b..ad2ea1769 100644 --- a/lib/ui/settings/user_details_vm.dart +++ b/lib/ui/settings/user_details_vm.dart @@ -52,6 +52,9 @@ class UserDetailsVM { user: state.uiState.settingsUIState.user, onChanged: (user) => store.dispatch(UpdateUserSettings(user: user)), onConnectGmailPressed: (context) { + final completer = snackBarCompleter( + context, AppLocalization.of(context).connectedGmail); + passwordCallback( context: context, callback: (password, idToken) async { @@ -67,17 +70,12 @@ class UserDetailsVM { message: AppLocalization.of(context) .anErrorOccurredTryAgain); } else { - print('## TODO...'); - /* - store.dispatch( - ConnecOAuthUserRequest( - provider: UserEntity.OAUTH_PROVIDER_GOOGLE, - password: password, - idToken: idToken, - completer: completer, - ), - ); - */ + store.dispatch(ConnecGmailUserRequest( + serverAuthCode: serverAuthCode, + idToken: idToken, + completer: completer, + password: password, + )); } }); if (!signedIn) {