Microsoft email

This commit is contained in:
Hillel Coren 2022-06-20 08:08:52 +03:00
parent 542cc79c94
commit 4109b0b641
6 changed files with 162 additions and 85 deletions

View File

@ -95,7 +95,7 @@ abstract class SettingsEntity
static const EMAIL_SENDING_METHOD_DEFAULT = 'default';
static const EMAIL_SENDING_METHOD_GMAIL = 'gmail';
static const EMAIL_SENDING_METHOD_MICROSOFT = 'microsoft';
static const EMAIL_SENDING_METHOD_MICROSOFT = 'office365';
static const LOCK_INVOICES_OFF = 'off';
static const LOCK_INVOICES_SENT = 'when_sent';

View File

@ -311,14 +311,16 @@ abstract class UserEntity extends Object
@override
FormatNumberType get listDisplayAmountType => null;
bool get isConnectedToOAuth => isConnectedToGoogle || isConnectedToMicrosoft;
bool get isConnectedToGoogle =>
oauthProvider == UserEntity.OAUTH_PROVIDER_GOOGLE;
bool get isConnectedToMicrosoft =>
oauthProvider == UserEntity.OAUTH_PROVIDER_MICROSOFT;
bool get isConnectedToGmail =>
isConnectedToGoogle && oauthUserToken.isNotEmpty;
bool get isConnectedToEmail =>
isConnectedToOAuth && oauthUserToken.isNotEmpty;
bool get isEmailVerified => emailVerifiedAt != null;

View File

@ -95,7 +95,7 @@ List<String> gmailUserList(BuiltMap<String, UserEntity> userMap) {
return userList(userMap).where((userId) {
final user = (userMap[userId] ?? UserEntity) as UserEntity;
return user.isActive && user.isConnectedToGmail;
return user.isActive && user.isConnectedToEmail;
}).toList();
}

View File

@ -9,6 +9,7 @@ import 'package:flutter/material.dart';
import 'package:built_collection/built_collection.dart';
import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:qr_flutter/qr_flutter.dart';
import 'package:url_launcher/url_launcher.dart';
@ -35,7 +36,6 @@ import 'package:invoiceninja_flutter/ui/settings/user_details_vm.dart';
import 'package:invoiceninja_flutter/utils/completers.dart';
import 'package:invoiceninja_flutter/utils/dialogs.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart';
class UserDetails extends StatefulWidget {
const UserDetails({
@ -140,6 +140,106 @@ class _UserDetailsState extends State<UserDetails>
final user = viewModel.user;
final state = viewModel.state;
final googleButton = Expanded(
child: OutlinedButton(
child: Text((state.user.isConnectedToGoogle
? localization.disconnectGoogle
: localization.connectGoogle)
.toUpperCase()),
onPressed: state.user.isConnectedToEmail
? null
: () {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message: localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToGoogle) {
viewModel.onDisconnectGooglePressed(context);
} else {
viewModel.onConnectGooglePressed(context);
}
},
),
);
final gmailButton = Expanded(
child: OutlinedButton(
child: Text((user.isConnectedToEmail
? localization.disconnectGmail
: localization.connectGmail)
.toUpperCase()),
onPressed: !state.user.isConnectedToGoogle
? null
: () async {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message: localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToEmail) {
viewModel.onDisconnectGmailPressed(context);
} else {
launch('$kAppProductionUrl/auth/google');
}
},
),
);
final microsoftButton = Expanded(
child: OutlinedButton(
child: Text((state.user.isConnectedToMicrosoft
? localization.disconnectMicrosoft
: localization.connectMicrosoft)
.toUpperCase()),
onPressed: state.user.isConnectedToEmail
? null
: () {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message: localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToMicrosoft) {
viewModel.onDisconnectMicrosoftPressed(context);
} else {
viewModel.onConnectMicrosoftPressed(context);
}
},
),
);
final office365Button = Expanded(
child: OutlinedButton(
child: Text((user.isConnectedToEmail
? localization.disconnectEmail
: localization.connectEmail)
.toUpperCase()),
onPressed: !state.user.isConnectedToMicrosoft
? null
: () async {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message: localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToEmail) {
viewModel.onDisconnectMicrosoftEmailPressed(context);
} else {
launch('$kAppProductionUrl/auth/microsoft');
}
},
),
);
return EditScaffold(
title: localization.userDetails,
onSavePressed: (context) {
@ -222,85 +322,22 @@ class _UserDetailsState extends State<UserDetails>
child: Row(
children: [
if (state.isHosted && !isApple() && !isDesktopOS()) ...[
Expanded(
child: OutlinedButton(
child: Text((state.user.isConnectedToGoogle
? localization.disconnectGoogle
: localization.connectGoogle)
.toUpperCase()),
onPressed: state.user.isConnectedToGmail ||
state.user.isConnectedToMicrosoft
? null
: () {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message:
localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToGoogle) {
viewModel
.onDisconnectGooglePressed(context);
} else {
viewModel.onConnectGooglePressed(context);
}
},
),
),
SizedBox(width: kTableColumnGap),
if (kIsWeb && !state.user.isConnectedToGoogle)
Expanded(
child: OutlinedButton(
child: Text((state.user.isConnectedToMicrosoft
? localization.disconnectMicrosoft
: localization.connectMicrosoft)
.toUpperCase()),
onPressed: () async {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message: localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToMicrosoft) {
viewModel.onDisconnectMicrosoftPressed(context);
} else {
viewModel.onConnectMicrosoftPressed(context);
}
},
),
)
else
Expanded(
child: OutlinedButton(
child: Text((user.isConnectedToGmail
? localization.disconnectGmail
: localization.connectGmail)
.toUpperCase()),
onPressed: !state.user.isConnectedToGoogle
? null
: () async {
if (state.settingsUIState.isChanged) {
showMessageDialog(
context: context,
message:
localization.errorUnsavedChanges);
return;
}
if (state.user.isConnectedToGmail) {
viewModel
.onDisconnectGmailPressed(context);
} else {
launch('$kAppProductionUrl/auth/google');
}
},
),
),
SizedBox(width: kTableColumnGap),
if (user.isConnectedToGoogle) ...[
googleButton,
SizedBox(width: kTableColumnGap),
gmailButton,
SizedBox(width: kTableColumnGap),
] else if (user.isConnectedToMicrosoft) ...[
microsoftButton,
SizedBox(width: kTableColumnGap),
office365Button,
SizedBox(width: kTableColumnGap),
] else ...[
googleButton,
SizedBox(width: kTableColumnGap),
microsoftButton,
SizedBox(width: kTableColumnGap),
]
],
Expanded(
child: OutlinedButton(

View File

@ -56,6 +56,7 @@ class UserDetailsVM {
@required this.onDisableTwoFactorPressed,
@required this.onConnectMicrosoftPressed,
@required this.onDisconnectMicrosoftPressed,
@required this.onDisconnectMicrosoftEmailPressed,
});
static UserDetailsVM fromStore(Store<AppState> store) {
@ -98,6 +99,26 @@ class UserDetailsVM {
}
*/
},
onDisconnectMicrosoftEmailPressed: (context) {
confirmCallback(
context: context,
callback: (_) {
passwordCallback(
context: context,
callback: (password, idToken) {
final completer = snackBarCompleter<Null>(
context, AppLocalization.of(context).disconnectedEmail);
store.dispatch(
SaveAuthUserRequest(
user: state.user.rebuild((b) => b..oauthUserToken = ''),
password: password,
idToken: idToken,
completer: completer,
),
);
});
});
},
onDisconnectGmailPressed: (context) {
confirmCallback(
context: context,
@ -322,6 +343,7 @@ class UserDetailsVM {
final Function(BuildContext) onDisconnectGooglePressed;
final Function(BuildContext) onConnectMicrosoftPressed;
final Function(BuildContext) onDisconnectMicrosoftPressed;
final Function(BuildContext) onDisconnectMicrosoftEmailPressed;
final Function(BuildContext, Completer, String) onConnectGmailPressed;
final Function(BuildContext) onDisconnectGmailPressed;
final Function(BuildContext) onDisableTwoFactorPressed;

View File

@ -16,7 +16,10 @@ mixin LocalizationsProvider on LocaleCodeAware {
static final Map<String, Map<String, String>> _localizedValues = {
'en': {
// STARTER: lang key - do not remove comment
'use_web_app_to_connect_microsoft':
'disconnected_email': 'Successfully connected email',
'connect_email': 'Connect Email',
'disconnect_email': 'Disconnect Email',
'use_web_app_to_connect_microsoft':
'Please use the web app to connect to Microsoft',
'email_provider': 'Email Provider',
'connect_microsoft': 'Connect Microsoft',
@ -70740,6 +70743,19 @@ mixin LocalizationsProvider on LocaleCodeAware {
_localizedValues[localeCode]['use_web_app_to_connect_microsoft'] ??
_localizedValues['en']['use_web_app_to_connect_microsoft'];
String get connectEmail =>
_localizedValues[localeCode]['connect_email'] ??
_localizedValues['en']['connect_email'];
String get disconnectEmail =>
_localizedValues[localeCode]['disconnect_email'] ??
_localizedValues['en']['disconnect_email'];
String get disconnectedEmail =>
_localizedValues[localeCode]['disconnected_email'] ??
_localizedValues['en']['disconnected_email'];
// STARTER: lang field - do not remove comment
String lookup(String key) {