Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ import 'package:thingsboard_app/core/auth/login/provider/oauth_provider.dart';
import 'package:thingsboard_app/locator.dart';
import 'package:thingsboard_app/thingsboard_client.dart';
import 'package:thingsboard_app/utils/services/version_service/i_version_service.dart';
import 'package:thingsboard_app/utils/services/version_service/version_info.dart';

class UpdateRequiredHandler extends RouteHandler {
late final ProviderSubscription<AsyncValue<LoginMobileInfo>> _subscription;
@override
void subscribe(BuildContext context, WidgetRef ref) {
_subscription = ref.listenManual(oauthProvider, (prev, next) async {
final versionInfo = next.value?.versionInfo;
if (versionInfo != null) {
final rawVersionInfo = next.value?.versionInfo;
if (rawVersionInfo != null) {
final versionInfo = VersionInfo.fromMobileAppVersionInfo(rawVersionInfo);
if (getIt<IVersionService>().appUpdateRequired(versionInfo)) {
await ref.read(loginProvider.notifier).logout();
}
Expand Down
14 changes: 4 additions & 10 deletions lib/config/routes/v2/routes_config/routes/asset_routes.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:go_router/go_router.dart';
import 'package:thingsboard_app/config/routes/v2/router_2.dart';
import 'package:thingsboard_app/modules/asset/asset_details_page.dart';
import 'package:thingsboard_app/modules/asset/assets_page.dart';

Expand All @@ -14,20 +13,15 @@ final assetRoutes = [
path: AssetRoutes.assets,
builder: (context, state) {
final searchMode = state.uri.queryParameters['search'] == 'true';
return AssetsPage( searchMode: searchMode);
return AssetsPage(searchMode: searchMode);
},
routes: [
GoRoute(
parentNavigatorKey: globalNavigatorKey,
),
GoRoute(
path: '${AssetRoutes.asset}/:id',
builder: (context, state) {
final id = state.pathParameters['id']!;

return AssetDetailsPage( id);
return AssetDetailsPage(id);
},
),
]
),


];
19 changes: 14 additions & 5 deletions lib/config/routes/v2/routes_config/routes/login_routes.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ final loginRoutes = [
final providerQuery = state.uri.queryParameters['selectedProvider'];
final providerType =
providerQuery != null
? twoFaProviderTypeFromString(providerQuery)
? _parseTwoFaProviderType(providerQuery)
: null;

return TwoFactorAuthenticationPage(
Expand All @@ -60,9 +60,9 @@ final loginRoutes = [
path: LoginRoutes.mfaForceSuccess,
builder: (context, state) {
final providerQuery = state.uri.queryParameters['selectedProvider'];
final providerType = twoFaProviderTypeFromString(
providerQuery.toString(),
);
final providerType =
_parseTwoFaProviderType(providerQuery) ??
TwoFaProviderType.unknownDefaultOpenApi;

final force =
bool.tryParse(state.uri.queryParameters['force'].toString()) ??
Expand All @@ -79,7 +79,7 @@ final loginRoutes = [
final providerQuery = state.uri.queryParameters['selectedProvider'];
final providerType =
providerQuery != null
? twoFaProviderTypeFromString(providerQuery)
? _parseTwoFaProviderType(providerQuery)
: null;

return TwoFactorAuthSetup(
Expand All @@ -95,3 +95,12 @@ final loginRoutes = [
},
),
];

TwoFaProviderType? _parseTwoFaProviderType(String? name) {
if (name == null) return null;
try {
return TwoFaProviderType.valueOf(name);
} catch (_) {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ part 'two_factor_avalible_providers.g.dart';
Future<List<TwoFaProviderInfo>> twoFaConfirmAvalibleProviders(Ref ref) async {
final tbClient = getIt<ITbClientService>().client;
try {
final info = await tbClient
.getTwoFactorAuthService()
.getAvailableLoginTwoFaProviders();
return info;
final res =
await tbClient
.getTwoFactorAuthControllerApi()
.getAvailableTwoFaProviderInfos();
return res.data?.toList() ?? [];
} catch (e) {
return [];
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,25 @@ class TwoFactorConfirm extends _$TwoFactorConfirm {
Future<void> verifyCode(String code) async {
state = state.copyWith(loading: true);
try {
final res = await _tbClient.checkTwoFaVerificationCode(
type,
code,
requestConfig: RequestConfig(ignoreErrors: true),
);
await ref.read(loginProvider.notifier).twoFaConfirmed(res);
final res = await _tbClient
.getTwoFactorAuthControllerApi()
.checkTwoFaVerificationCode(
providerType: type,
verificationCode: code,
// Handle errors (e.g. 429) in-widget below instead of the global
// error overlay; the new client exposes this via Dio `extra`.
extra: const {'ignoreErrors': true},
);
final token = res.data?.token;
if (token == null) {
state = state.copyWith(loading: false, codeState: CodeState.invalid);
return;
}
await ref
.read(loginProvider.notifier)
.twoFaConfirmed(
LoginResponse(token: token, refreshToken: res.data?.refreshToken),
);
state = state.copyWith(loading: false, codeState: CodeState.valid);
} catch (e) {
state = state.copyWith(loading: false);
Expand All @@ -62,10 +75,12 @@ class TwoFactorConfirm extends _$TwoFactorConfirm {
Future<void> sendCode() async {
state = state.copyWith(codeSent: false, loading: true);
try {
await _tbClient.getTwoFactorAuthService().requestTwoFaVerificationCode(
type,
requestConfig: RequestConfig(ignoreErrors: true),
);
await _tbClient
.getTwoFactorAuthControllerApi()
.requestTwoFaVerificationCode(
providerType: type,
extra: const {'ignoreErrors': true},
);
_resendTimer?.cancel();
_resendTimer = Timer(
Duration(seconds: _resendTimerDurationSeconds),
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 19 additions & 12 deletions lib/core/auth/2FA/confirm/two_factor_authentication_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,16 @@ class TwoFactorAuthenticationPage extends HookConsumerWidget {
}
if (providers.value?.length == 1) {
context.pushReplacement(
'${LoginRoutes.login}${LoginRoutes.mfaConfirm}?selectedProvider=${providers.value!.first.type.toShortString()}',
'${LoginRoutes.login}${LoginRoutes.mfaConfirm}?selectedProvider=${providers.value!.first.type?.name}',
);
return;
}
final defaultProvider = providers.value?.firstWhereOrNull(
(e) => e.isDefault,
(e) => e.default_ ?? false,
);
if (defaultProvider != null) {
context.pushReplacement(
'${LoginRoutes.login}${LoginRoutes.mfaConfirm}?selectedProvider=${defaultProvider.type.toShortString()}',
'${LoginRoutes.login}${LoginRoutes.mfaConfirm}?selectedProvider=${defaultProvider.type?.name}',
);
return;
}
Expand All @@ -59,9 +59,10 @@ class TwoFactorAuthenticationPage extends HookConsumerWidget {
final info = providers.value!.firstWhere(
(e) => e.type == selectedProvider,
);
if (info.type == null) return const SizedBox();
final codeLoading = ref.watch(
twoFactorConfirmProvider(
info.type,
info.type!,
info.minVerificationCodeSendPeriod,
).select((state) => state.loading),
);
Expand All @@ -81,13 +82,18 @@ class TwoFactorAuthenticationPage extends HookConsumerWidget {
return BaseTwoFactorLayout(
title: S.of(context).verifyYourIdentity,
isLoading: isLoading.value,
child: providers.value != null
? SelectProviderTypeWidget(
activeProviders: const [],
avalibleTypes: providers.value!.map((e) => e.type).toList(),
type: TwoFaViewType.confirm,
)
: const SizedBox(),
child:
providers.value != null
? SelectProviderTypeWidget(
activeProviders: const [],
avalibleTypes:
providers.value!
.where((e) => e.type != null)
.map((e) => e.type!)
.toList(),
type: TwoFaViewType.confirm,
)
: const SizedBox(),
);
}

Expand All @@ -96,11 +102,12 @@ class TwoFactorAuthenticationPage extends HookConsumerWidget {
WidgetRef ref,
TwoFaProviderInfo info,
) async {
if (info.type == null) return;
isLoading.value = true;
await ref
.read(
twoFactorConfirmProvider(
info.type,
info.type!,
info.minVerificationCodeSendPeriod,
).notifier,
)
Expand Down
23 changes: 13 additions & 10 deletions lib/core/auth/2FA/confirm/widgets/select_provider_type_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class SelectProviderTypeWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final loading = useState(false);
final isForce = type == TwoFaViewType.force ;
final isForce = type == TwoFaViewType.force;
final filtered =
switch (type) {
TwoFaViewType.setup => avalibleTypes,
Expand Down Expand Up @@ -122,7 +122,7 @@ class SelectProviderTypeWidget extends HookConsumerWidget {
}

context.push(
'${LoginRoutes.login}${LoginRoutes.mfaConfigure}?selectedProvider=${provider.toShortString()}&force=$isForce',
'${LoginRoutes.login}${LoginRoutes.mfaConfigure}?selectedProvider=${provider.name}&force=$isForce',
);
},
contentPadding: const EdgeInsets.symmetric(
Expand Down Expand Up @@ -183,10 +183,7 @@ class SelectProviderTypeWidget extends HookConsumerWidget {
: OutlinedButton.icon(
onPressed: () {
context.push(
'${LoginRoutes.login}${type == TwoFaViewType.confirm
? LoginRoutes.mfaConfirm
: LoginRoutes.mfaConfigure}?selectedProvider=${provider.toShortString()}&force=$isForce',

'${LoginRoutes.login}${type == TwoFaViewType.confirm ? LoginRoutes.mfaConfirm : LoginRoutes.mfaConfigure}?selectedProvider=${provider.name}&force=$isForce',
);
},
style: OutlinedButton.styleFrom(
Expand Down Expand Up @@ -279,8 +276,14 @@ class SelectProviderTypeWidget extends HookConsumerWidget {
loading.value = true;
try {
await getIt<ITbClientService>().client
.getTwoFactorAuthService()
.updateTwoFaAccountConfig(info, true);
.getTwoFactorAuthConfigControllerApi()
.updateTwoFaAccountConfig(
providerType: info,
twoFaAccountConfigUpdateRequest:
TwoFaAccountConfigUpdateRequest(
(b) => b..useByDefault = true,
),
);
await Future.delayed(
const Duration(milliseconds: 200),
);
Expand Down Expand Up @@ -375,8 +378,8 @@ class SelectProviderTypeWidget extends HookConsumerWidget {
}
try {
await getIt<ITbClientService>().client
.getTwoFactorAuthService()
.deleteTwoFaAccountConfig(providerType);
.getTwoFactorAuthConfigControllerApi()
.deleteTwoFaAccountConfig(providerType: providerType);

ref.invalidate(acountTwoFactorSettingsProvider);
} catch (e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ class EnterACodeWidget extends HookConsumerWidget {

@override
Widget build(BuildContext context, WidgetRef ref) {
final data = getTwoFaProviderData(selectedProvider.type);
final providerType = selectedProvider.type!;
final data = getTwoFaProviderData(providerType);
final timerDuration = selectedProvider.minVerificationCodeSendPeriod ?? 0;
final form = useMemoized(
() => FormGroup({
Expand All @@ -43,13 +44,13 @@ class EnterACodeWidget extends HookConsumerWidget {
)..forward();
final state = ref.watch(
twoFactorConfirmProvider(
selectedProvider.type,
providerType,
selectedProvider.minVerificationCodeSendPeriod,
),
);
ref.listen(
twoFactorConfirmProvider(
selectedProvider.type,
providerType,
selectedProvider.minVerificationCodeSendPeriod,
),
(prev, next) {
Expand Down Expand Up @@ -105,7 +106,7 @@ class EnterACodeWidget extends HookConsumerWidget {
type: data.textInputType,
autoFillHints: const [AutofillHints.oneTimeCode],
),
if (!noResendCodeProviders.contains(selectedProvider.type))
if (!noResendCodeProviders.contains(providerType))
AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
child:
Expand Down Expand Up @@ -167,7 +168,7 @@ class EnterACodeWidget extends HookConsumerWidget {
await ref
.read(
twoFactorConfirmProvider(
selectedProvider.type,
selectedProvider.type!,
selectedProvider.minVerificationCodeSendPeriod,
).notifier,
)
Expand All @@ -178,7 +179,7 @@ class EnterACodeWidget extends HookConsumerWidget {
ref
.read(
twoFactorConfirmProvider(
selectedProvider.type,
selectedProvider.type!,
selectedProvider.minVerificationCodeSendPeriod,
).notifier,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ part 'two_factor_setup_account_settings_provider.g.dart';
@riverpod
Future<AccountTwoFaSettings?> acountTwoFactorSettings(Ref ref) async {
final client = getIt<ITbClientService>().client;
final res = await client.getTwoFactorAuthService().getAccountTwoFaSettings();
return res;
final res =
await client
.getTwoFactorAuthConfigControllerApi()
.getAccountTwoFaSettings();
return res.data;
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ part 'two_factor_setup_avalible_providers.g.dart';
Future<List<TwoFaProviderType>> twoFactorSetupAvalibleProviders(Ref ref) async {
final tbClient = getIt<ITbClientService>().client;
try {
final info = await tbClient
.getTwoFactorAuthService()
.getAvailableTwoFaProviders();
return info;
final res =
await tbClient
.getTwoFactorAuthConfigControllerApi()
.getAvailableTwoFaProviderTypes();
return res.data?.toList() ?? [];
} catch (e) {
return [];
}
Expand Down
Loading