Files
FTS-Portal--Unofficial-/lib/pages/login.dart
2025-12-27 18:24:05 +00:00

135 lines
3.7 KiB
Dart

import 'package:go_router/go_router.dart';
import 'package:proto_portal/scraper.dart';
import 'package:shadcn_flutter/shadcn_flutter.dart';
import 'package:flutter_svg/flutter_svg.dart';
class LoginPage extends StatelessWidget {
static GoRoute route = GoRoute(
path: "/login",
builder: (context, state) => LoginPage()
);
GlobalKey<FormState> _formKey = GlobalKey<FormState>();
InputKey _usernameKey = InputKey("username");
InputKey _passwordKey = InputKey("password");
CheckboxState rememberMe = CheckboxState.checked;
@override
Widget build(BuildContext context) {
return Scaffold(
child: Center(
child: Form(
key: _formKey,
onSubmit: (context, values) async {
try {
await GtiAuth.of(context).login(
values[_usernameKey] as String,
values[_passwordKey] as String,
remember: rememberMe == CheckboxState.checked
);
GoRouter.of(context).go("/");
} catch (e) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Error logging in'),
content: Text("The username or password provided is incorrect."),
actions: [
PrimaryButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Close'),
),
],
);
},
);
}
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
Container(
height: 50,
width: double.infinity,
alignment: Alignment.center,
child: SvgPicture.asset(
"assets/logo.svg",
alignment: AlignmentGeometry.center,
// width: 400,
colorFilter: ColorFilter.mode(Colors.white, BlendMode.srcIn),
),
),
const SizedBox(height: 12),
Text(
"Coordination Portal"
).h4.center(),
const SizedBox(height: 32),
FormField(
label: Text("Username"),
key: _usernameKey,
child: TextField(
),
validator: ConditionalValidator((value) {
return value != null && (value as String).isNotEmpty;
}, message: "Username cannot be empty"),
),
const SizedBox(height: 16),
FormField(
label: Text("Password"),
key: _passwordKey,
child: TextField(
obscureText: true,
),
validator: ConditionalValidator((value) {
return value != null && (value as String).isNotEmpty;
}, message: "Password cannot be empty"),
),
const SizedBox(height: 24),
Checkbox(
state: rememberMe,
onChanged: null,
trailing: Text("Remember me"),
),
const SizedBox(height: 24),
SizedBox(
width: double.infinity,
child: SubmitButton(
child: Text("Login"),
loadingTrailing: CircularProgressIndicator(),
),
)
],
),
),
).withPadding(
all: 16,
),
);
}
}