import 'dart:html'; import 'package:flutter/material.dart'; import 'package:grpc/grpc_web.dart'; import 'package:softplayer_web/api/grpc/accounts.dart'; class SignUpForm extends StatefulWidget { const SignUpForm({ super.key, required this.accountsGrpc, }); final AccountsGrpc accountsGrpc; @override State createState() => _SignUpFormState(); } class _SignUpFormState extends State { final _formKey = GlobalKey(); final usernameCtrl = TextEditingController(); final passwordCtrl = TextEditingController(); final passwordVerifyCtrl = TextEditingController(); final emailCtrl = TextEditingController(); static const dialogName = "Sign Up"; void submitForm() { // Validate returns true if the form is valid, or false otherwise. if (_formKey.currentState!.validate()) { final username = usernameCtrl.text; final password = passwordCtrl.text; final email = emailCtrl.text; widget.accountsGrpc .signUp(username, email, password) .then((rs) { window.localStorage["token"] = rs.token; window.localStorage["uuid"] = rs.uuid; Navigator.of(context, rootNavigator: true).pop(); }) .catchError((e) { GrpcError error = e; String msg; if (error.message != null) { msg = error.message!; } else { msg = error.toString(); } ScaffoldMessenger.of(context).showSnackBar(SnackBar( content: Text(msg), backgroundColor: Colors.red, showCloseIcon: true, behavior: SnackBarBehavior.floating, )); passwordCtrl.clear(); }); } } @override Widget build(BuildContext context) => AlertDialog( title: const Text(dialogName), content: SizedBox( width: 420, height: 280, child: Form( key: _formKey, child: Center( child: Column(children: [ TextFormField( autofocus: true, controller: usernameCtrl, decoration: const InputDecoration( hintText: "Enter your username", icon: Icon(Icons.account_circle), label: Text("Username"), ), cursorWidth: 1, cursorHeight: 18, cursorRadius: const Radius.circular(10), ), TextFormField( controller: emailCtrl, autofocus: true, decoration: const InputDecoration( hintText: "Enter your email", icon: Icon(Icons.email), label: Text("Email"), ), cursorWidth: 1, cursorHeight: 18, cursorRadius: const Radius.circular(10), ), TextFormField( controller: passwordCtrl, obscureText: true, decoration: const InputDecoration( hintText: "Enter your password", icon: Icon(Icons.password), label: Text("Password")), cursorWidth: 1, cursorHeight: 18, cursorRadius: const Radius.circular(10), ), TextFormField( controller: passwordVerifyCtrl, obscureText: true, decoration: const InputDecoration( hintText: "Verify your password", icon: Icon(Icons.password), label: Text("Confirm Password")), cursorWidth: 1, cursorHeight: 18, cursorRadius: const Radius.circular(10), ), ])))), actions: [ TextButton( onPressed: () => Navigator.pop(context, 'Cancel'), child: const Text('Cancel'), ), TextButton( onPressed: submitForm, child: const Text('OK'), ), ], ); }