diff --git a/Sources/justMUSIC/lib/main.dart b/Sources/justMUSIC/lib/main.dart index bcba65c..45e9b19 100644 --- a/Sources/justMUSIC/lib/main.dart +++ b/Sources/justMUSIC/lib/main.dart @@ -16,6 +16,7 @@ import 'package:justmusic/screens/launching_rocker_screen.dart'; import 'package:justmusic/screens/post_screen.dart'; import 'package:justmusic/screens/profile_screen.dart'; import 'package:justmusic/screens/registration_screen.dart'; +import 'package:justmusic/screens/verify_email_screen.dart'; import 'package:justmusic/screens/welcome_screen.dart'; import 'package:justmusic/view_model/CommentViewModel.dart'; import 'package:justmusic/view_model/MusicViewModel.dart'; @@ -100,6 +101,7 @@ class _MyAppState extends State { '/explanation': (context) => const ExplanationsScreen(), '/addFriend': (context) => const AddFriendScreen(), '/launchingRocket': (context) => const LaunchingRocketScreen(), + '/verifyEmail': (context) => const VerifyEmailScreen(), }, debugShowCheckedModeBanner: false, theme: ThemeData( diff --git a/Sources/justMUSIC/lib/screens/registration_screen.dart b/Sources/justMUSIC/lib/screens/registration_screen.dart index f0ada00..160d56c 100644 --- a/Sources/justMUSIC/lib/screens/registration_screen.dart +++ b/Sources/justMUSIC/lib/screens/registration_screen.dart @@ -31,7 +31,7 @@ class _RegistrationScreenState extends State { if (_formKey.currentState!.validate()) { try { await MyApp.userViewModel.register(_userPseudoTextField.text, _passwordTextField.text, _userMailTextField.text); - Navigator.pushNamed(context, '/explanation'); + Navigator.pushNamed(context, '/verifyEmail'); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( diff --git a/Sources/justMUSIC/lib/screens/verify_email_screen.dart b/Sources/justMUSIC/lib/screens/verify_email_screen.dart new file mode 100644 index 0000000..53dccd4 --- /dev/null +++ b/Sources/justMUSIC/lib/screens/verify_email_screen.dart @@ -0,0 +1,120 @@ +import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/Material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:justmusic/main.dart'; + +class VerifyEmailScreen extends StatefulWidget { + const VerifyEmailScreen({Key? key}) : super(key: key); + + @override + State createState() => _VerifyEmailScreenState(); +} + +class _VerifyEmailScreenState extends State { + bool isEmailVerified = false; + bool canResendEmail = false; + Timer? timer; + + @override + void initState() { + super.initState(); + + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + + if (!isEmailVerified) { + sendVerificationEmail(); + + timer = Timer.periodic( + Duration(seconds: 3), + (_) => checkEmailVerified(), + ); + } + } + + @override + void dispose() { + timer?.cancel(); + + super.dispose(); + } + + Future checkEmailVerified() async { + await FirebaseAuth.instance.currentUser!.reload(); + + setState(() { + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + }); + + if (isEmailVerified) timer?.cancel(); + } + + cancel() { + Navigator.pushNamed(context, '/welcome'); + MyApp.userViewModel.delete(); + } + + Future sendVerificationEmail() async { + try { + final user = FirebaseAuth.instance.currentUser!; + await user.sendEmailVerification(); + + setState(() => canResendEmail = false); + await Future.delayed(Duration(minutes: 1)); + setState(() => canResendEmail = true); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + e.toString() ?? "", + style: GoogleFonts.plusJakartaSans( + color: Colors.white, + fontWeight: FontWeight.w400, + fontSize: 20.h), + ), + backgroundColor: Colors.red, + ), + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text('Verify Email'), + ), + body: Padding( + padding: EdgeInsets.all(16), + child: + Column(mainAxisAlignment: MainAxisAlignment.center, children: [ + Text('A verification email has been sent to your email.', + style: TextStyle(fontSize: 20), textAlign: TextAlign.center), + SizedBox(height: 24), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + minimumSize: Size.fromHeight(50), + ), + icon: Icon(Icons.email, size: 32), + label: Text( + 'ResentEmail', + style: TextStyle(fontSize: 24), + ), + onPressed: canResendEmail ? sendVerificationEmail : null, + ), + SizedBox(height: 8), + TextButton( + style: ElevatedButton.styleFrom( + minimumSize: Size.fromHeight(50), + ), + child: Text( + 'Cancel', + style: TextStyle(fontSize: 24), + ), + onPressed: cancel, + ) + ]))); + } +} diff --git a/Sources/justMUSIC/lib/services/AuthService.dart b/Sources/justMUSIC/lib/services/AuthService.dart index 79bb717..b668fba 100644 --- a/Sources/justMUSIC/lib/services/AuthService.dart +++ b/Sources/justMUSIC/lib/services/AuthService.dart @@ -103,7 +103,6 @@ class AuthService { await currentUser?.delete(); await FirebaseAuth.instance.signOut(); - } on FirebaseAuthException catch (e) { if (e.code == 'requires-recent-login') { throw ('Please log in again to delete your account'); diff --git a/Sources/justMUSIC/lib/view_model/UserViewModel.dart b/Sources/justMUSIC/lib/view_model/UserViewModel.dart index 34278f2..6bc8452 100644 --- a/Sources/justMUSIC/lib/view_model/UserViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/UserViewModel.dart @@ -35,13 +35,17 @@ class UserViewModel { try { var token; await authService.login(pseudo, password); - await updateUserCurrent(); - if (!kIsWeb) { - token = await FirebaseMessaging.instance.getToken(); - if (_userCurrent.token != token) { - _userService.updateTokenNotify(_userCurrent.id, token); - _userCurrent.token = token; + if (firebase_auth.FirebaseAuth.instance.currentUser!.emailVerified) { + await updateUserCurrent(); + if (!kIsWeb) { + token = await FirebaseMessaging.instance.getToken(); + if (_userCurrent.token != token) { + _userService.updateTokenNotify(_userCurrent.id, token); + _userCurrent.token = token; + } } + } else { + throw ("Le mail n'a pas encore été vérifié"); } } catch (e) { rethrow;