forked from firka/student-legacy
Merge branch 'refilc:dev' into dev
This commit is contained in:
commit
c4e7ebc020
@ -1,10 +1,9 @@
|
||||
// import 'dart:async';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:refilc/api/client.dart';
|
||||
import 'package:refilc/api/login.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
|
||||
import 'package:refilc_mobile_ui/common/custom_snack_bar.dart';
|
||||
import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/absence/absence_display.dart';
|
||||
@ -17,7 +16,6 @@ import 'package:flutter/services.dart';
|
||||
import 'login_screen.i18n.dart';
|
||||
import 'package:carousel_slider/carousel_slider.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:flutter_portal/flutter_portal.dart';
|
||||
|
||||
class LoginScreen extends StatefulWidget {
|
||||
const LoginScreen({super.key, this.back = false});
|
||||
@ -85,366 +83,479 @@ class LoginScreenState extends State<LoginScreen> {
|
||||
precacheImage(const AssetImage('assets/images/showcase2.png'), context);
|
||||
precacheImage(const AssetImage('assets/images/showcase3.png'), context);
|
||||
precacheImage(const AssetImage('assets/images/showcase4.png'), context);
|
||||
bool selected = false;
|
||||
|
||||
return Portal(
|
||||
child: Scaffold(
|
||||
body: Container(
|
||||
decoration: const BoxDecoration(color: Color(0xFFDAE4F7)),
|
||||
child: SingleChildScrollView(
|
||||
physics: const ClampingScrollPhysics(),
|
||||
controller: _scrollController,
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(color: Color(0xFFDAE4F7)),
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: MediaQuery.of(context).size.height,
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
// app icon
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, top: 20),
|
||||
child: Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/icons/ic_rounded.png',
|
||||
width: 30.0,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
const Text(
|
||||
'reFilc',
|
||||
style: TextStyle(
|
||||
color: Color(0xFF050B15),
|
||||
fontSize: 18.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontFamily: 'Montserrat'),
|
||||
),
|
||||
Material(
|
||||
type: MaterialType.transparency,
|
||||
child: showBack
|
||||
? BackButton(
|
||||
color: AppColors.of(context).text)
|
||||
: const SizedBox(height: 48.0),
|
||||
),
|
||||
],
|
||||
)),
|
||||
Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
// Column(
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
// crossAxisAlignment: CrossAxisAlignment.center,
|
||||
// children: [
|
||||
// const SizedBox(height: 21),
|
||||
// CarouselSlider(
|
||||
// options: CarouselOptions(
|
||||
// height: MediaQuery.of(context).size.height,
|
||||
// viewportFraction: 1,
|
||||
// autoPlay: true,
|
||||
// autoPlayInterval: const Duration(seconds: 6),
|
||||
// pauseAutoPlayOnTouch: true),
|
||||
// items: [1, 2, 3, 4].map((i) {
|
||||
// return Builder(
|
||||
// builder: (BuildContext context) {
|
||||
// return Column(
|
||||
// crossAxisAlignment:
|
||||
// CrossAxisAlignment.start,
|
||||
// mainAxisAlignment:
|
||||
// MainAxisAlignment.start,
|
||||
// children: [
|
||||
// Padding(
|
||||
// padding:
|
||||
// const EdgeInsets.only(left: 24),
|
||||
// child: Column(
|
||||
// crossAxisAlignment:
|
||||
// CrossAxisAlignment.start,
|
||||
// mainAxisAlignment:
|
||||
// MainAxisAlignment.start,
|
||||
// children: [
|
||||
// Text(
|
||||
// "welcome_title_$i".i18n,
|
||||
// style: const TextStyle(
|
||||
// color: Color(0xFF050B15),
|
||||
// fontSize: 19,
|
||||
// fontFamily: 'Montserrat',
|
||||
// fontWeight:
|
||||
// FontWeight.w700,
|
||||
// height: 1.3),
|
||||
// ),
|
||||
// const SizedBox(
|
||||
// height: 14.375), //meth
|
||||
// Padding(
|
||||
// padding:
|
||||
// const EdgeInsets.only(
|
||||
// right: 20),
|
||||
// child: Text(
|
||||
// "welcome_text_$i".i18n,
|
||||
// style: const TextStyle(
|
||||
// color:
|
||||
// Color(0xFF050B15),
|
||||
// fontFamily: 'FigTree',
|
||||
// fontWeight:
|
||||
// FontWeight.w500,
|
||||
// fontSize: 17,
|
||||
// height: 1.3),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// )),
|
||||
// const SizedBox(height: 15.625),
|
||||
// Padding(
|
||||
// padding: const EdgeInsets.only(
|
||||
// left: 16, right: 16),
|
||||
// child: Image.asset(
|
||||
// 'assets/images/showcase$i.png'))
|
||||
// ],
|
||||
// );
|
||||
// },
|
||||
// );
|
||||
// }).toList(),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// Container(
|
||||
// height: 250,
|
||||
// width: double.infinity,
|
||||
// decoration: const BoxDecoration(
|
||||
// gradient: LinearGradient(
|
||||
// colors: [Color(0x00DAE4F7), Color(0xFFDAE4F7)],
|
||||
// stops: [0, 0.1],
|
||||
// begin: Alignment.topCenter,
|
||||
// end: Alignment.bottomCenter,
|
||||
// ),
|
||||
// ),
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.only(top: 3),
|
||||
// child: Column(
|
||||
// children: [
|
||||
// SizedBox(
|
||||
// height: 48,
|
||||
// width: double.infinity,
|
||||
// child: Padding(
|
||||
// padding: const EdgeInsets.symmetric(
|
||||
// horizontal: 16),
|
||||
// child: FilledButton(
|
||||
// style: ButtonStyle(
|
||||
// shape: MaterialStateProperty.all<
|
||||
// RoundedRectangleBorder>(
|
||||
// const RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.all(
|
||||
// Radius.circular(12)),
|
||||
// ))),
|
||||
// onPressed: () {},
|
||||
// child: Text(
|
||||
// "login".i18n,
|
||||
// style: const TextStyle(
|
||||
// fontFamily: 'Montserrat',
|
||||
// fontSize: 20,
|
||||
// fontWeight: FontWeight.w700),
|
||||
// )),
|
||||
// ),
|
||||
// ),
|
||||
// const SizedBox(height: 8),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// )
|
||||
//
|
||||
//
|
||||
// TODO: OLD LOGIN FROM HERE
|
||||
Column(
|
||||
//login buttons and ui starts here
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 22.0,
|
||||
right: 22.0,
|
||||
top: 0.0,
|
||||
),
|
||||
child: AutofillGroup(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
// username
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(bottom: 6.0),
|
||||
child: Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"username".i18n,
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginPrimary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"usernameHint".i18n,
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.right,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginSecondary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(bottom: 12.0),
|
||||
child: LoginInput(
|
||||
style: LoginInputStyle.username,
|
||||
controller: usernameController,
|
||||
),
|
||||
),
|
||||
|
||||
// password
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(bottom: 6.0),
|
||||
child: Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"password".i18n,
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginPrimary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"passwordHint".i18n,
|
||||
maxLines: 1,
|
||||
textAlign: TextAlign.right,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginSecondary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(bottom: 12.0),
|
||||
child: LoginInput(
|
||||
style: LoginInputStyle.password,
|
||||
controller: passwordController,
|
||||
),
|
||||
),
|
||||
|
||||
// school
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(bottom: 6.0),
|
||||
child: Text(
|
||||
"school".i18n,
|
||||
maxLines: 1,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginPrimary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
SchoolInput(
|
||||
scroll: _scrollController,
|
||||
controller: schoolController,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 35.0,
|
||||
left: 22.0,
|
||||
right: 22.0,
|
||||
),
|
||||
child: Visibility(
|
||||
visible: _loginState != LoginState.inProgress,
|
||||
replacement: const Padding(
|
||||
padding: EdgeInsets.symmetric(vertical: 6.0),
|
||||
child: CircularProgressIndicator(
|
||||
valueColor: AlwaysStoppedAnimation<Color>(
|
||||
Colors.white),
|
||||
),
|
||||
),
|
||||
child: LoginButton(
|
||||
child: Text("login".i18n,
|
||||
maxLines: 1,
|
||||
style: const TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 20.0,
|
||||
)),
|
||||
onPressed: () => _loginAPI(context: context),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// TODO: OLD LOGIN FROM HERE
|
||||
],
|
||||
),
|
||||
|
||||
if (_loginState == LoginState.missingFields ||
|
||||
_loginState == LoginState.invalidGrant ||
|
||||
_loginState == LoginState.failed)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 8.0, left: 12.0, right: 12.0),
|
||||
child: Text(
|
||||
[
|
||||
"missing_fields",
|
||||
"invalid_grant",
|
||||
"error"
|
||||
][_loginState.index]
|
||||
.i18n,
|
||||
style: const TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.w500,
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
decoration: const BoxDecoration(color: Color(0xFFDAE4F7)),
|
||||
child: SingleChildScrollView(
|
||||
physics: const ClampingScrollPhysics(),
|
||||
controller: _scrollController,
|
||||
child: Container(
|
||||
decoration: const BoxDecoration(color: Color(0xFFDAE4F7)),
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: MediaQuery.of(context).size.height,
|
||||
child: SafeArea(
|
||||
child: Column(
|
||||
children: [
|
||||
// app icon
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(left: 24, top: 20),
|
||||
child: Row(
|
||||
children: [
|
||||
Image.asset(
|
||||
'assets/icons/ic_rounded.png',
|
||||
width: 30.0,
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
const Text(
|
||||
'reFilc',
|
||||
style: TextStyle(
|
||||
color: Color(0xFF050B15),
|
||||
fontSize: 18.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontFamily: 'Montserrat'),
|
||||
),
|
||||
Material(
|
||||
type: MaterialType.transparency,
|
||||
child: showBack
|
||||
? BackButton(color: AppColors.of(context).text)
|
||||
: const SizedBox(height: 48.0),
|
||||
),
|
||||
],
|
||||
)),
|
||||
Stack(
|
||||
alignment: Alignment.bottomCenter,
|
||||
children: [
|
||||
Column(
|
||||
//login buttons and ui starts here
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
const SizedBox(height: 21),
|
||||
CarouselSlider(
|
||||
options: CarouselOptions(
|
||||
height: MediaQuery.of(context).size.height,
|
||||
viewportFraction: 1,
|
||||
autoPlay: true,
|
||||
autoPlayInterval: const Duration(seconds: 6),
|
||||
pauseAutoPlayOnTouch: true),
|
||||
items: [1, 2, 3, 4].map((i) {
|
||||
return Builder(
|
||||
builder: (BuildContext context) {
|
||||
return Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(left: 24),
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.start,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"welcome_title_$i".i18n,
|
||||
style: const TextStyle(
|
||||
color: Color(0xFF050B15),
|
||||
fontSize: 19,
|
||||
fontFamily: 'Montserrat',
|
||||
fontWeight: FontWeight.w700,
|
||||
height: 1.3),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 14.375), //meth
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
right: 20),
|
||||
child: Text(
|
||||
"welcome_text_$i".i18n,
|
||||
style: const TextStyle(
|
||||
color: Color(0xFF050B15),
|
||||
fontFamily: 'FigTree',
|
||||
fontWeight:
|
||||
FontWeight.w500,
|
||||
fontSize: 17,
|
||||
height: 1.3),
|
||||
),
|
||||
),
|
||||
],
|
||||
)),
|
||||
const SizedBox(height: 15.625),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 16, right: 16),
|
||||
child: Image.asset(
|
||||
'assets/images/showcase$i.png'))
|
||||
],
|
||||
);
|
||||
},
|
||||
);
|
||||
}).toList(),
|
||||
),
|
||||
],
|
||||
),
|
||||
Container(
|
||||
height: 300,
|
||||
width: double.infinity,
|
||||
decoration: const BoxDecoration(
|
||||
gradient: LinearGradient(
|
||||
colors: [Color(0x00DAE4F7), Color(0xFFDAE4F7)],
|
||||
stops: [0, 0.12],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: EdgeInsets.only(top: 50, bottom: MediaQuery.of(context).viewInsets.bottom),
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: 48,
|
||||
width: double.infinity,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16),
|
||||
child: FilledButton(
|
||||
style: ButtonStyle(
|
||||
shape: MaterialStateProperty.all<
|
||||
RoundedRectangleBorder>(
|
||||
const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(12)),
|
||||
))),
|
||||
onPressed: () {
|
||||
showModalBottomSheet(
|
||||
backgroundColor: Colors.transparent,
|
||||
context: context,
|
||||
builder: (BuildContext context) {
|
||||
return Container(
|
||||
height: MediaQuery.of(context)
|
||||
.size
|
||||
.height *
|
||||
0.5 + MediaQuery.of(context).viewInsets.bottom,
|
||||
decoration: const BoxDecoration(
|
||||
color: Color(0xFFDAE4F7),
|
||||
borderRadius: BorderRadius.only(
|
||||
topRight:
|
||||
Radius.circular(24.0),
|
||||
topLeft:
|
||||
Radius.circular(24.0),
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment.center,
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(
|
||||
top: 18),
|
||||
child: Container(
|
||||
decoration:
|
||||
const BoxDecoration(
|
||||
color:
|
||||
Color(0xFFB9C8E5),
|
||||
borderRadius:
|
||||
BorderRadius.only(
|
||||
topRight:
|
||||
Radius.circular(
|
||||
2.0),
|
||||
topLeft:
|
||||
Radius.circular(
|
||||
2.0),
|
||||
),
|
||||
),
|
||||
width: 40,
|
||||
height: 4,
|
||||
),
|
||||
),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
child: AutofillGroup(
|
||||
child: Column(
|
||||
crossAxisAlignment:
|
||||
CrossAxisAlignment
|
||||
.end,
|
||||
children: [
|
||||
// username
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(
|
||||
bottom:
|
||||
6.0),
|
||||
child: Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"username"
|
||||
.i18n,
|
||||
maxLines:
|
||||
1,
|
||||
style:
|
||||
TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginPrimary,
|
||||
fontWeight:
|
||||
FontWeight.w500,
|
||||
fontSize:
|
||||
12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"usernameHint"
|
||||
.i18n,
|
||||
maxLines:
|
||||
1,
|
||||
textAlign:
|
||||
TextAlign
|
||||
.right,
|
||||
style:
|
||||
TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginSecondary,
|
||||
fontWeight:
|
||||
FontWeight.w500,
|
||||
fontSize:
|
||||
12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(
|
||||
bottom:
|
||||
12.0),
|
||||
child: LoginInput(
|
||||
style:
|
||||
LoginInputStyle
|
||||
.username,
|
||||
controller:
|
||||
usernameController,
|
||||
),
|
||||
),
|
||||
|
||||
// password
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(
|
||||
bottom:
|
||||
6.0),
|
||||
child: Row(
|
||||
mainAxisAlignment:
|
||||
MainAxisAlignment
|
||||
.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Text(
|
||||
"password"
|
||||
.i18n,
|
||||
maxLines:
|
||||
1,
|
||||
style:
|
||||
TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginPrimary,
|
||||
fontWeight:
|
||||
FontWeight.w500,
|
||||
fontSize:
|
||||
12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"passwordHint"
|
||||
.i18n,
|
||||
maxLines:
|
||||
1,
|
||||
textAlign:
|
||||
TextAlign
|
||||
.right,
|
||||
style:
|
||||
TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.loginSecondary,
|
||||
fontWeight:
|
||||
FontWeight.w500,
|
||||
fontSize:
|
||||
12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(
|
||||
bottom:
|
||||
12.0),
|
||||
child: LoginInput(
|
||||
style:
|
||||
LoginInputStyle
|
||||
.password,
|
||||
controller:
|
||||
passwordController,
|
||||
),
|
||||
),
|
||||
|
||||
// school
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets
|
||||
.only(
|
||||
bottom:
|
||||
6.0),
|
||||
child: Text(
|
||||
"school".i18n,
|
||||
maxLines: 1,
|
||||
style:
|
||||
TextStyle(
|
||||
color: AppColors.of(
|
||||
context)
|
||||
.loginPrimary,
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.w500,
|
||||
fontSize:
|
||||
12.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
SchoolInput(
|
||||
scroll:
|
||||
_scrollController,
|
||||
controller:
|
||||
schoolController,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
const Padding(
|
||||
padding: EdgeInsets.only(
|
||||
left: 22.0,
|
||||
right: 22.0,
|
||||
top: 0.0,
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.only(
|
||||
top: 35.0,
|
||||
left: 22.0,
|
||||
right: 22.0,
|
||||
),
|
||||
child: Visibility(
|
||||
visible: _loginState !=
|
||||
LoginState
|
||||
.inProgress,
|
||||
replacement:
|
||||
const Padding(
|
||||
padding: EdgeInsets
|
||||
.symmetric(
|
||||
vertical:
|
||||
6.0),
|
||||
child:
|
||||
CircularProgressIndicator(
|
||||
valueColor:
|
||||
AlwaysStoppedAnimation<
|
||||
Color>(
|
||||
Colors
|
||||
.white),
|
||||
),
|
||||
),
|
||||
child: LoginButton(
|
||||
child: Text(
|
||||
"login".i18n,
|
||||
maxLines: 1,
|
||||
style:
|
||||
const TextStyle(
|
||||
fontWeight:
|
||||
FontWeight
|
||||
.bold,
|
||||
fontSize: 20.0,
|
||||
)),
|
||||
onPressed: () =>
|
||||
_loginAPI(
|
||||
context:
|
||||
context),
|
||||
),
|
||||
),
|
||||
),
|
||||
]),
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
child: Text(
|
||||
"login".i18n,
|
||||
style: const TextStyle(
|
||||
fontFamily: 'Montserrat',
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w700),
|
||||
)),
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 8),
|
||||
],
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
// privacy policy
|
||||
GestureDetector(
|
||||
onTap: () => PrivacyView.show(context),
|
||||
],
|
||||
),
|
||||
|
||||
if (_loginState == LoginState.missingFields ||
|
||||
_loginState == LoginState.invalidGrant ||
|
||||
_loginState == LoginState.failed)
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
top: 8.0, left: 12.0, right: 12.0),
|
||||
child: Text(
|
||||
'privacy'.i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).loginSecondary,
|
||||
[
|
||||
"missing_fields",
|
||||
"invalid_grant",
|
||||
"error"
|
||||
][_loginState.index]
|
||||
.i18n,
|
||||
style: const TextStyle(
|
||||
color: Colors.red,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.0,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// privacy policy
|
||||
GestureDetector(
|
||||
onTap: () => PrivacyView.show(context),
|
||||
child: Text(
|
||||
'privacy'.i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).loginSecondary,
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 14.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
|
Loading…
x
Reference in New Issue
Block a user