fbmobile/lib/ui/views/login_view.dart

105 lines
4.1 KiB
Dart
Raw Normal View History

2021-02-02 14:33:23 +00:00
import 'package:flutter/material.dart';
import 'package:flutter_translate/flutter_translate.dart';
import '../../core/enums/viewstate.dart';
import '../../core/services/dialog_service.dart';
import '../../core/services/navigation_service.dart';
import '../../core/viewmodels/login_model.dart';
import '../../locator.dart';
import '../../ui/views/home_view.dart';
import '../../ui/widgets/my_appbar.dart';
import '../shared/app_colors.dart';
import '../shared/ui_helpers.dart';
import '../widgets/login_header_apikey.dart';
import '../widgets/login_header_credentials.dart';
2021-02-02 14:33:23 +00:00
import 'base_view.dart';
class LoginView extends StatelessWidget {
2021-02-02 14:33:23 +00:00
static const routeName = '/login';
final NavigationService _navigationService = locator<NavigationService>();
final DialogService _dialogService = locator<DialogService>();
2023-01-04 20:17:54 +00:00
LoginView({super.key});
2021-02-02 14:33:23 +00:00
@override
Widget build(BuildContext context) {
final logo = Hero(
tag: 'hero',
child: CircleAvatar(
backgroundColor: Colors.transparent,
radius: 36.0,
2021-02-02 14:33:23 +00:00
child: Image.asset('assets/logo_caption.png'),
),
);
return BaseView<LoginModel>(
onModelReady: (model) => model.init(),
builder: (context, model, child) => Scaffold(
appBar: MyAppBar(title: Text(translate('titles.login'))),
2023-01-04 20:17:54 +00:00
body: model.state == ViewState.busy
? const Center(child: CircularProgressIndicator())
2021-02-02 14:33:23 +00:00
: ListView(
shrinkWrap: true,
2023-01-04 20:17:54 +00:00
padding: const EdgeInsets.only(left: 10.0, right: 10.0),
2021-02-02 14:33:23 +00:00
children: <Widget>[
UIHelper.verticalSpaceMedium(),
2021-02-02 14:33:23 +00:00
Center(child: logo),
UIHelper.verticalSpaceMedium(),
2021-02-02 14:33:23 +00:00
Center(
child: Wrap(
crossAxisAlignment: WrapCrossAlignment.center,
alignment: WrapAlignment.center,
children: <Widget>[
InkWell(
2023-01-04 20:17:54 +00:00
child: const Icon(Icons.help),
2021-02-02 14:33:23 +00:00
onTap: () {
_dialogService.showDialog(
2023-01-16 00:44:34 +00:00
title: translate(
'login.compatibility_dialog.title'),
description: translate(
'login.compatibility_dialog.body'));
2021-02-02 14:33:23 +00:00
},
),
InkWell(
2023-01-16 00:44:34 +00:00
child: Icon(
model.useCredentialsLogin
? Icons.person_outline
: Icons.vpn_key,
color: blueColor),
onTap: () {
model.toggleLoginMethod();
},
2021-02-02 14:33:23 +00:00
)
])),
UIHelper.verticalSpaceMedium(),
model.useCredentialsLogin
? LoginCredentialsHeaders(
validationMessage: model.errorMessage,
uriController: model.uriController,
usernameController: model.userNameController,
passwordController: model.passwordController,
)
: LoginApiKeyHeaders(
validationMessage: model.errorMessage,
uriController: model.uriController,
apiKeyController: model.apiKeyController),
UIHelper.verticalSpaceMedium(),
2022-12-16 21:53:59 +00:00
ElevatedButton.icon(
2023-01-04 20:17:54 +00:00
icon: const Icon(Icons.login, color: blueColor),
2022-12-16 21:53:59 +00:00
label: Text(translate('login.button')),
2021-02-02 14:33:23 +00:00
onPressed: () async {
var loginSuccess = await model.login();
2021-02-02 14:33:23 +00:00
if (loginSuccess) {
2023-01-16 00:44:34 +00:00
_navigationService
.navigateAndReplaceTo(HomeView.routeName);
2021-02-02 14:33:23 +00:00
}
},
)
],
),
),
);
}
}