mirror of
				https://github.com/johrpan/musicus_mobile.git
				synced 2025-10-26 18:57:25 +01:00 
			
		
		
		
	 5ffecb97c6
			
		
	
	
		5ffecb97c6
		
	
	
	
	
		
			
			If the user enters something into the login fields, the values will be copied to the registration screen. Also, the password is required to delete an account now.
		
			
				
	
	
		
			264 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			264 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'dart:async';
 | |
| 
 | |
| import 'package:flutter/material.dart';
 | |
| import 'package:musicus_client/musicus_client.dart';
 | |
| import 'package:musicus_common/musicus_common.dart';
 | |
| 
 | |
| import 'delete_account.dart';
 | |
| import 'email.dart';
 | |
| import 'password.dart';
 | |
| import 'register.dart';
 | |
| 
 | |
| class AccountSettingsScreen extends StatefulWidget {
 | |
|   @override
 | |
|   _AccountSettingsScreenState createState() => _AccountSettingsScreenState();
 | |
| }
 | |
| 
 | |
| class _AccountSettingsScreenState extends State<AccountSettingsScreen> {
 | |
|   final _usernameController = TextEditingController();
 | |
|   final _passwordController = TextEditingController();
 | |
| 
 | |
|   MusicusBackendState _backend;
 | |
|   StreamSubscription<MusicusAccountCredentials> _accountSubscription;
 | |
|   bool _loading = false;
 | |
|   bool _loggedIn = false;
 | |
|   String _username;
 | |
|   String _email;
 | |
| 
 | |
|   @override
 | |
|   void didChangeDependencies() {
 | |
|     super.didChangeDependencies();
 | |
| 
 | |
|     _backend = MusicusBackend.of(context);
 | |
| 
 | |
|     final credentials = _backend.settings.account.value;
 | |
|     if (credentials != null) {
 | |
|       _setCredentials(credentials);
 | |
|       _getDetails();
 | |
|     }
 | |
| 
 | |
|     _accountSubscription = _backend.settings.account.listen((credentials) {
 | |
|       _setCredentials(credentials);
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   Future<void> _setCredentials(MusicusAccountCredentials credentials) async {
 | |
|     if (mounted) {
 | |
|       if (credentials != null) {
 | |
|         setState(() {
 | |
|           _loggedIn = true;
 | |
|           _username = credentials.username;
 | |
|         });
 | |
|       } else {
 | |
|         setState(() {
 | |
|           _loggedIn = false;
 | |
|         });
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<void> _getDetails() async {
 | |
|     setState(() {
 | |
|       _email = null;
 | |
|     });
 | |
| 
 | |
|     final email = (await _backend.client.getAccountDetails()).email;
 | |
| 
 | |
|     if (mounted) {
 | |
|       setState(() {
 | |
|         _email = email;
 | |
|       });
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   Widget build(BuildContext context) {
 | |
|     List<Widget> children;
 | |
| 
 | |
|     if (_loggedIn) {
 | |
|       children = [
 | |
|         Material(
 | |
|           elevation: 2.0,
 | |
|           child: ListTile(
 | |
|             title: Text('Logged in as: $_username'),
 | |
|           ),
 | |
|         ),
 | |
|         ListTile(
 | |
|           title: Text('E-mail address'),
 | |
|           subtitle: Text(
 | |
|               _email != null ? _email.isNotEmpty ? _email : 'Not set' : '...'),
 | |
|           trailing: const Icon(Icons.chevron_right),
 | |
|           onTap: () async {
 | |
|             await Navigator.push(
 | |
|               context,
 | |
|               MaterialPageRoute(
 | |
|                 builder: (context) => EmailScreen(
 | |
|                   email: _email,
 | |
|                 ),
 | |
|               ),
 | |
|             );
 | |
| 
 | |
|             _getDetails();
 | |
|           },
 | |
|         ),
 | |
|         ListTile(
 | |
|           title: Text('Change password'),
 | |
|           trailing: const Icon(Icons.chevron_right),
 | |
|           onTap: () {
 | |
|             Navigator.push(
 | |
|               context,
 | |
|               MaterialPageRoute(
 | |
|                 builder: (context) => PasswordScreen(),
 | |
|               ),
 | |
|             );
 | |
|           },
 | |
|         ),
 | |
|         ListTile(
 | |
|           title: Text('Delete this account'),
 | |
|           onTap: () {
 | |
|             Navigator.push(
 | |
|               context,
 | |
|               MaterialPageRoute(
 | |
|                 builder: (context) => DeleteAccountScreen(),
 | |
|               ),
 | |
|             );
 | |
|           },
 | |
|         ),
 | |
|         ListTile(
 | |
|           title: Text('Logout'),
 | |
|           onTap: () async {
 | |
|             await _backend.settings.clearAccount();
 | |
|             Navigator.pop(context);
 | |
|           },
 | |
|         ),
 | |
|       ];
 | |
|     } else {
 | |
|       children = [
 | |
|         Padding(
 | |
|           padding: const EdgeInsets.only(
 | |
|             left: 16.0,
 | |
|             right: 16.0,
 | |
|             top: 16.0,
 | |
|             bottom: 8.0,
 | |
|           ),
 | |
|           child: Text(
 | |
|             'Enter your Musicus account credentials:',
 | |
|             style: Theme.of(context).textTheme.subtitle1,
 | |
|           ),
 | |
|         ),
 | |
|         Padding(
 | |
|           padding: const EdgeInsets.symmetric(
 | |
|             horizontal: 16.0,
 | |
|           ),
 | |
|           child: TextField(
 | |
|             controller: _usernameController,
 | |
|             decoration: InputDecoration(
 | |
|               labelText: 'User name',
 | |
|             ),
 | |
|           ),
 | |
|         ),
 | |
|         SizedBox(
 | |
|           height: 16.0,
 | |
|         ),
 | |
|         Padding(
 | |
|           padding: const EdgeInsets.symmetric(
 | |
|             horizontal: 16.0,
 | |
|           ),
 | |
|           child: TextField(
 | |
|             controller: _passwordController,
 | |
|             obscureText: true,
 | |
|             decoration: InputDecoration(
 | |
|               labelText: 'Password',
 | |
|             ),
 | |
|           ),
 | |
|         ),
 | |
|         SizedBox(
 | |
|           height: 32.0,
 | |
|         ),
 | |
|         ListTile(
 | |
|           title: Text('Create a new account'),
 | |
|           onTap: () {
 | |
|             Navigator.pushReplacement(
 | |
|               context,
 | |
|               MaterialPageRoute(
 | |
|                 builder: (context) => RegisterScreen(
 | |
|                   username: _usernameController.text,
 | |
|                   password: _passwordController.text,
 | |
|                 ),
 | |
|               ),
 | |
|             );
 | |
|           },
 | |
|         ),
 | |
|       ];
 | |
|     }
 | |
| 
 | |
|     return Scaffold(
 | |
|       appBar: AppBar(
 | |
|         title: Text('Musicus account'),
 | |
|         actions: <Widget>[
 | |
|           Builder(
 | |
|             builder: (context) {
 | |
|               if (_loggedIn) {
 | |
|                 return Container();
 | |
|               } else if (_loading) {
 | |
|                 return Padding(
 | |
|                   padding: const EdgeInsets.all(16.0),
 | |
|                   child: Center(
 | |
|                     child: SizedBox(
 | |
|                       width: 24.0,
 | |
|                       height: 24.0,
 | |
|                       child: CircularProgressIndicator(
 | |
|                         strokeWidth: 2.0,
 | |
|                       ),
 | |
|                     ),
 | |
|                   ),
 | |
|                 );
 | |
|               } else {
 | |
|                 return FlatButton(
 | |
|                   onPressed: () async {
 | |
|                     setState(() {
 | |
|                       _loading = true;
 | |
|                     });
 | |
| 
 | |
|                     final credentials = MusicusAccountCredentials(
 | |
|                       username: _usernameController.text,
 | |
|                       password: _passwordController.text,
 | |
|                     );
 | |
| 
 | |
|                     _backend.client.credentials = credentials;
 | |
| 
 | |
|                     try {
 | |
|                       await _backend.client.login();
 | |
|                       await _backend.settings.setAccount(credentials);
 | |
|                       Navigator.pop(context);
 | |
|                     } on MusicusLoginFailedException {
 | |
|                       Scaffold.of(context).showSnackBar(
 | |
|                         SnackBar(
 | |
|                           content: Text('Login failed'),
 | |
|                         ),
 | |
|                       );
 | |
|                     }
 | |
| 
 | |
|                     setState(() {
 | |
|                       _loading = false;
 | |
|                     });
 | |
|                   },
 | |
|                   child: Text('LOGIN'),
 | |
|                 );
 | |
|               }
 | |
|             },
 | |
|           ),
 | |
|         ],
 | |
|       ),
 | |
|       body: ListView(
 | |
|         children: children,
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   @override
 | |
|   void dispose() {
 | |
|     super.dispose();
 | |
|     _accountSubscription.cancel();
 | |
|   }
 | |
| }
 |