aboutsummaryrefslogtreecommitdiff
path: root/lib/screens/signup.dart
diff options
context:
space:
mode:
Diffstat (limited to 'lib/screens/signup.dart')
-rw-r--r--lib/screens/signup.dart140
1 files changed, 140 insertions, 0 deletions
diff --git a/lib/screens/signup.dart b/lib/screens/signup.dart
new file mode 100644
index 0000000..b155d8e
--- /dev/null
+++ b/lib/screens/signup.dart
@@ -0,0 +1,140 @@
+import "package:flutter/material.dart";
+
+import "package:openbills/models/user.dart";
+import "package:openbills/widgets/input_box.dart";
+import "package:openbills/widgets/snackbar.dart";
+
+class SignupScreen extends StatelessWidget {
+ const SignupScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ centerTitle: true,
+ title: const Image(
+ height: 50,
+ image: AssetImage("assets/images/logo.png"),
+ ),
+ ),
+ body: const Center(
+ child: SizedBox(
+ width: 500,
+ child: Body(),
+ )
+ ),
+ );
+ }
+}
+
+class Body extends StatefulWidget {
+ const Body({super.key});
+
+ @override
+ State<Body> createState() => _BodyState();
+}
+
+class _BodyState extends State<Body> {
+ final usernameController = TextEditingController();
+ final emailController = TextEditingController();
+ final passwordController = TextEditingController();
+
+ @override
+ void dispose() {
+ usernameController.dispose();
+ emailController.dispose();
+ passwordController.dispose();
+ super.dispose();
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ Size size = MediaQuery.sizeOf(context);
+ MainAxisAlignment alignment = MainAxisAlignment.center;
+
+ if (size.width < 700) {
+ alignment = MainAxisAlignment.spaceBetween;
+ }
+
+ if (size.height < 700) {
+ alignment = MainAxisAlignment.center;
+ }
+
+ return Column (
+ crossAxisAlignment: CrossAxisAlignment.center,
+ mainAxisAlignment: alignment,
+ children: <Widget> [
+ const Padding(
+ padding: EdgeInsets.symmetric(horizontal: 8, vertical: 16),
+ child: Text(
+ "OpenBills Sign Up",
+ textAlign: TextAlign.center,
+ style: TextStyle(
+ fontWeight: FontWeight.bold,
+ fontSize: 30,
+ ),
+ ),
+ ),
+
+ Column(
+ children: <Widget>[
+ FormInputBox(
+ controller: usernameController,
+ hintText: "Username",
+ ),
+
+ FormInputBox(
+ controller: emailController,
+ hintText: "E-mail",
+ ),
+
+ FormInputBox(
+ controller: passwordController,
+ hintText: "Password",
+ obscureText: true,
+ ),
+ ],
+ ),
+
+ Padding(
+ padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16),
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceBetween,
+ children: <Widget> [
+ TextButton(
+ onPressed: () {
+ Navigator.pop(context);
+ },
+ child: const Text("Already have an account? Sign in.")
+ ),
+
+ ElevatedButton(
+ onPressed: () async {
+ User u = User(
+ id: 0,
+ username: usernameController.text,
+ email: emailController.text,
+ );
+
+ try {
+ await userSignUp(u, passwordController.text);
+
+ if (context.mounted) {
+ MySnackBar.show(context, "Successfully created an account!");
+ Navigator.pop(context);
+ }
+ } on String catch (e) {
+ if (context.mounted) {
+ MySnackBar.show(context, "Error: $e");
+ }
+ }
+ },
+ child: const Text("Sign Up")
+ ),
+ ],
+ ),
+ ),
+ ],
+ );
+ }
+} \ No newline at end of file