df/frontend/app/lib/pages_draft/login_overlay.dart

240 lines
8.6 KiB
Dart

import 'package:app/model/view_model/base_vm.dart';
import 'package:app/widgets/background.dart';
import 'package:app/widgets/bottom_navigation.dart';
import 'package:app/widgets/bottom_navigation_item.dart';
import 'package:app/widgets/side_drawer.dart';
import 'package:app/widgets/side_drawer_item.dart';
import 'package:flutter/material.dart';
import 'package:app/util/validation.dart';
import 'package:provider/provider.dart';
Future<bool> showLogin(BuildContext context,
{bool registration = false}) async {
final formKey = GlobalKey<FormState>();
final mailController = TextEditingController();
final passwordController = TextEditingController();
BaseViewModel vm = BaseViewModel();
bool submitted = false;
bool loggedin = false;
void login(BuildContext context) {
if (formKey.currentState!.validate()) {
submitted = true;
FocusScope.of(context).unfocus();
vm
.login(context,
email: mailController.text, password: passwordController.text)
.then(
(r) {
if (r) {
loggedin = r;
Navigator.pop(context, true);
}
},
);
passwordController.clear();
submitted = false;
}
}
void register(BuildContext context) {
if (formKey.currentState!.validate()) {
submitted = true;
vm
.createAccount(
context,
email: mailController.text,
password: passwordController.text,
)
.then(
(r) {
if (r) {
loggedin = r;
Navigator.pop(context, true);
}
},
);
}
}
await showModalBottomSheet(
useSafeArea: true,
isScrollControlled: true,
backgroundColor: Colors.black,
context: context,
builder: (builder) {
return Background(
child: Scaffold(
drawer: SideDrawer(
children: [
const Spacer(
flex: 3,
),
SideDrawerItem(
onPressed: () {},
icon: Icons.question_answer,
color: Colors.white,
label: 'About',
),
SideDrawerItem(
onPressed: () {},
icon: Icons.privacy_tip,
color: Colors.white,
label: 'Datenschutz',
),
SideDrawerItem(
onPressed: () {},
icon: Icons.apartment,
color: Colors.white,
label: 'Impressum',
),
const Spacer(
flex: 1,
),
],
),
bottomNavigationBar: BottomNavigation(
children: [
BottomNavigationItem(
onPressed: () {
Navigator.pop(context, false);
},
icon: Icons.arrow_back,
color: Colors.white,
label: 'Zurück',
),
BottomNavigationItem(
onPressed: () {
Navigator.pop(context, false);
},
icon: Icons.home,
color: Colors.white,
label: 'Home',
),
],
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(
height: 50,
),
const Image(
width: 180,
image: AssetImage(
'lib/assets/logo_300x200.png',
),
),
const SizedBox(
height: 30,
),
Text(
registration ? 'Registrieren' : 'Login',
style: const TextStyle(
fontFamily: 'sans-serif',
fontSize: 24,
height: 1.6,
fontWeight: FontWeight.normal,
letterSpacing: 6,
),
),
ChangeNotifierProvider<BaseViewModel>(
create: (context) => BaseViewModel(),
child: Consumer<BaseViewModel>(
builder: (context, value, child) => Form(
key: formKey,
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const SizedBox(
height: 40,
),
TextFormField(
// autofocus: true,
// inputFormatters: [
// FilteringTextInputFormatter.allow(
// emailRegExp,
// ),
// ],
controller: mailController,
decoration: const InputDecoration(
fillColor: Color.fromARGB(30, 255, 255, 255),
filled: true,
hintStyle: TextStyle(
color: Colors.white38,
),
hintText: 'E-Mail Adresse',
),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || !value.isValidEmail) {
return 'Bitte eine gültige E-Mail Adresse eingeben';
}
return null;
},
),
TextFormField(
style: const TextStyle(
color: Colors.white,
),
// inputFormatters: [
// FilteringTextInputFormatter.allow(
// passwordRegExp,
// ),
// ],
controller: passwordController,
decoration: const InputDecoration(
fillColor: Color.fromARGB(30, 255, 255, 255),
filled: true,
hintStyle: TextStyle(
color: Colors.white38,
),
hintText: 'Passwort',
),
keyboardType: TextInputType.visiblePassword,
obscureText: true,
validator: (value) {
if (value == null || !value.isValidPassword) {
return 'Bitte geben Sie Ihr Passwort ein';
}
return null;
},
),
const SizedBox(
height: 15,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ElevatedButton(
onPressed: !submitted
? !registration
? () {
login(context);
}
: () {
register(context);
}
: null,
child: const Icon(Icons.login),
),
],
)
],
),
),
),
),
const Spacer(),
],
),
),
),
);
});
return loggedin;
}