From 4a52953fba3ba6afabd4969d03b3297e51ffc156 Mon Sep 17 00:00:00 2001 From: chamod udara Date: Sat, 12 Apr 2025 21:48:29 +0530 Subject: [PATCH 1/3] add:new client side functions and uis for auth --- 80f4933d069dc239577ba181c546bd7f.jpg | Bin 0 -> 77316 bytes undomain/lib/main.dart | 1 + .../email_verification.dart | 96 +++++- .../fogotpassword/fogot_password.dart | 186 +++++++++++ .../authentication/login/login_screen.dart | 90 ++++- .../register/register_screen.dart | 312 ++++++++++++++---- .../authentication/spalshscreen/spalsh.dart | 29 +- .../terms_and_conditions.dart | 47 ++- undomain/lib/pages/home/homepage.dart | 38 ++- undomain/lib/router/go_router.dart | 37 ++- undomain/lib/router/router_names.dart | 1 + .../services/auth_services/authservices.dart | 150 +++++++++ undomain/lib/util/global/global_function.dart | 20 ++ undomain/lib/util/textstyles/text_styles.dart | 5 + .../lib/widgets/buttons/authpage_button.dart | 34 +- .../lib/widgets/textboxes/authtext_box.dart | 8 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 4 + undomain/pubspec.lock | 202 +++++++++++- undomain/pubspec.yaml | 5 + .../flutter/generated_plugin_registrant.cc | 3 + .../windows/flutter/generated_plugins.cmake | 1 + 23 files changed, 1140 insertions(+), 134 deletions(-) create mode 100644 80f4933d069dc239577ba181c546bd7f.jpg create mode 100644 undomain/lib/pages/authentication/fogotpassword/fogot_password.dart create mode 100644 undomain/lib/services/auth_services/authservices.dart create mode 100644 undomain/lib/util/global/global_function.dart diff --git a/80f4933d069dc239577ba181c546bd7f.jpg b/80f4933d069dc239577ba181c546bd7f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e9892c4a08d60a575787236565935664dbf46f50 GIT binary patch literal 77316 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 literal 0 HcmV?d00001 diff --git a/undomain/lib/main.dart b/undomain/lib/main.dart index 1c68576..f7e275a 100644 --- a/undomain/lib/main.dart +++ b/undomain/lib/main.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:undomain/router/go_router.dart'; void main() { + WidgetsFlutterBinding.ensureInitialized(); runApp(const MyApp()); } diff --git a/undomain/lib/pages/authentication/email_verification/email_verification.dart b/undomain/lib/pages/authentication/email_verification/email_verification.dart index 6299109..db8794c 100644 --- a/undomain/lib/pages/authentication/email_verification/email_verification.dart +++ b/undomain/lib/pages/authentication/email_verification/email_verification.dart @@ -1,15 +1,28 @@ import 'dart:async'; +import 'dart:convert'; +import 'dart:typed_data'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:pinput/pinput.dart'; import 'package:undomain/router/router_names.dart'; +import 'package:undomain/services/auth_services/authservices.dart'; +import 'package:undomain/util/colors/colors.dart'; +import 'package:undomain/util/global/global_function.dart'; import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; import 'package:undomain/widgets/buttons/authpage_button.dart'; class EmailVerification extends StatefulWidget { - const EmailVerification({super.key}); + final String userid; + final bool isForRegister; + final String? email; + const EmailVerification({ + super.key, + required this.userid, + required this.isForRegister, + this.email, + }); @override State createState() => _EmailVerificationState(); @@ -18,7 +31,10 @@ class EmailVerification extends StatefulWidget { class _EmailVerificationState extends State { late Timer _timer; int _start = 60; - + bool _isLoading = false; + TextEditingController _pincontroller = TextEditingController(); + final GlobalFunction _globalFunction = GlobalFunction(); + final Authservices _authservices = Authservices(); @override void initState() { startTimer(); @@ -44,9 +60,55 @@ class _EmailVerificationState extends State { }); } - void _onSubmit(String pin) { - // Validate or verify PIN here - print("Entered Code: $pin"); + //request when complete the pinput + void _onSubmit(String pin) async { + setState(() { + _isLoading = true; + }); + if (pin.isEmpty || widget.userid.isEmpty) { + _globalFunction.snackBarMassage(context, "Empty User Data", 3); + return; + // GoRouter.of(context).goNamed(RouterNames.homePage); + } + + //for user registration + if (widget.isForRegister) { + final response = await _authservices.verifyNewUser( + userId: widget.userid, + verifyCode: pin, + ); + if (response["success"]) { + String base64String = response["user"]["profileUrl"]; + Uint8List imagesBytes = base64Decode(base64String); + GoRouter.of(context).goNamed( + RouterNames.homePage, + extra: { + "userId": response["user"]["id"], + "username": response["user"]["username"], + "email": response["user"]["email"], + "profileUrl": imagesBytes, + }, + ); + } else { + _globalFunction.snackBarMassage(context, response["massage"], 3); + } + //for password reset + } else { + final response = await _authservices.verifyResetPassword( + email: widget.email!, + otp: pin, + password: widget.userid, + ); + if (response["success"]) { + GoRouter.of(context).goNamed(RouterNames.loginPage); + } else { + _globalFunction.snackBarMassage(context, response["massage"], 3); + } + + setState(() { + _isLoading = true; + }); + } } @override @@ -55,13 +117,22 @@ class _EmailVerificationState extends State { final defaultPinTheme = PinTheme( width: (pinputSize - 0.08) / 5, height: (pinputSize - 0.08) / 5, - textStyle: TextStyle(fontSize: 20, color: Colors.black), + textStyle: TextStyle(fontSize: 20, color: utilPrimaryBlack), decoration: BoxDecoration( - border: Border.all(color: Colors.grey), + // border: Border.all(color: utilPrimaryGrey), borderRadius: BorderRadius.circular(10), + color: utilPrimaryWhite, + boxShadow: [ + BoxShadow( + offset: Offset(1, 2), + blurRadius: 2, + color: utilPrimaryGrey.withOpacity(0.5), + ), + ], ), ); return Scaffold( + resizeToAvoidBottomInset: false, body: Padding( padding: EdgeInsets.symmetric( horizontal: authScreenPaddingH, @@ -80,6 +151,7 @@ class _EmailVerificationState extends State { SizedBox(height: MediaQuery.of(context).size.height * 0.02), //pinputs Pinput( + controller: _pincontroller, length: 5, keyboardType: TextInputType.number, onCompleted: _onSubmit, @@ -96,14 +168,20 @@ class _EmailVerificationState extends State { ], ), ) - : Text("Resend", style: textLabel), + : TextButton( + onPressed: () {}, + child: Text("Resend", style: textLabelRed), + ), ], ), SizedBox(height: MediaQuery.of(context).size.height * 0.08), Column( children: [ //verify button:to home page - AuthpageButton(path: RouterNames.homePage, text: "Verify"), + GestureDetector( + onTap: () => _onSubmit(_pincontroller.text), + child: AuthpageButton(text: "Verify", isLoading: _isLoading), + ), //to login page TextButton( onPressed: () { diff --git a/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart b/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart new file mode 100644 index 0000000..3d30578 --- /dev/null +++ b/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart @@ -0,0 +1,186 @@ +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:undomain/router/router_names.dart'; +import 'package:undomain/services/auth_services/authservices.dart'; +import 'package:undomain/util/global/global_function.dart'; +import 'package:undomain/util/global/global_varibles.dart'; +import 'package:undomain/util/textstyles/text_styles.dart'; +import 'package:undomain/widgets/buttons/authpage_button.dart'; +import 'package:undomain/widgets/textboxes/authtext_box.dart'; + +class FogotPassword extends StatefulWidget { + const FogotPassword({super.key}); + + @override + State createState() => _FogotPasswordState(); +} + +class _FogotPasswordState extends State { + final TextEditingController _confirmpasswordcontroller = + TextEditingController(); + final TextEditingController _passwordcontroller = TextEditingController(); + final TextEditingController _emailcontroller = TextEditingController(); + final _formKey = GlobalKey(); + bool _isLoading = false; + final Authservices _authservices = Authservices(); + final GlobalFunction _globalFunction = GlobalFunction(); + //regexp for password + final RegExp passwordRegExp = RegExp( + r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>]).{6,}$', + ); + String confirmpasswordHint = "@confirm password"; + bool isconfirmpasswordValid = true; + String passwordHint = "@password"; + String emailHint = "@email"; + bool isPasswordValid = true; + + Future _getCodeForResetPassword() async { + setState(() { + _isLoading = true; + }); + + final response = await _authservices.sendPasswordResetRequest( + email: _emailcontroller.text, + ); + if (response["success"]) { + GoRouter.of(context).goNamed( + RouterNames.verificationPage, + extra: { + "userId": _passwordcontroller.text, + "isFromRegister": false, + "email": response["user"]["id"], + }, + ); + } else { + _globalFunction.snackBarMassage(context, response["massage"], 3); + } + setState(() { + _isLoading = false; + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomInset: false, + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: authScreenPaddingH, + vertical: authScreenPaddingV, + ), + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * 0.08), + //title + Column(children: [Text("Date NET.", style: textDisplay)]), + SizedBox(height: MediaQuery.of(context).size.height * 0.15), + //auth details + Form( + key: _formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //password + AuthtextBox( + isValid: isPasswordValid, + controller: _emailcontroller, + hint: emailHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.next, + textInputType: TextInputType.emailAddress, + + validChecker: (value) => null, + ), + AuthtextBox( + isValid: isPasswordValid, + controller: _passwordcontroller, + hint: passwordHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.next, + textInputType: TextInputType.name, + + validChecker: (value) => null, + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + //confirm password + AuthtextBox( + controller: _confirmpasswordcontroller, + isValid: isconfirmpasswordValid, + hint: confirmpasswordHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.done, + textInputType: TextInputType.visiblePassword, + validChecker: (value) => null, + ), + + SizedBox(height: MediaQuery.of(context).size.height * 0.25), + Column( + children: [ + //if valid form state + GestureDetector( + onTap: () { + if (_confirmpasswordcontroller.text.isEmpty && + _passwordcontroller.text.isEmpty) { + setState(() { + isPasswordValid = false; + passwordHint = "please enter your @password"; + isconfirmpasswordValid = false; + confirmpasswordHint = + "please confirm your password"; + }); + } else if (!passwordRegExp.hasMatch( + _passwordcontroller.text, + )) { + setState(() { + passwordHint = "weak password"; + _passwordcontroller.clear(); + }); + } else if (_passwordcontroller.text != + _confirmpasswordcontroller.text) { + setState(() { + confirmpasswordHint = + "password mismatching please check your password"; + _confirmpasswordcontroller.clear(); + }); + } else { + GoRouter.of( + context, + ).goNamed(RouterNames.loginPage); + } + }, + + child: AuthpageButton( + text: "Submit", + isLoading: false, + ), + ), + //to register page + TextButton( + onPressed: () { + GoRouter.of( + context, + ).goNamed(RouterNames.registerPage); + }, + child: Text( + "Create new account", + style: textLabelRed, + ), + ), + ], + ), + + //to home page + ], + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/undomain/lib/pages/authentication/login/login_screen.dart b/undomain/lib/pages/authentication/login/login_screen.dart index 5910e57..d563323 100644 --- a/undomain/lib/pages/authentication/login/login_screen.dart +++ b/undomain/lib/pages/authentication/login/login_screen.dart @@ -1,6 +1,11 @@ +import 'dart:convert'; +import 'dart:typed_data'; + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:undomain/router/router_names.dart'; +import 'package:undomain/services/auth_services/authservices.dart'; +import 'package:undomain/util/global/global_function.dart'; import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; import 'package:undomain/widgets/buttons/authpage_button.dart'; @@ -16,7 +21,10 @@ class LoginScreen extends StatefulWidget { class _LoginScreenState extends State { final TextEditingController _usernamecontroller = TextEditingController(); final TextEditingController _passwordcontroller = TextEditingController(); - + final _formKey = GlobalKey(); + bool _isLoading = false; + final GlobalFunction _globalFunction = GlobalFunction(); + final Authservices _authservices = Authservices(); @override void dispose() { _passwordcontroller.dispose(); @@ -24,9 +32,45 @@ class _LoginScreenState extends State { super.dispose(); } + Future _userLogin() async { + setState(() { + _isLoading = true; + }); + + final response = await _authservices.login( + username: _usernamecontroller.text, + password: _passwordcontroller.text, + ); + if (response["success"]) { + String base64String = response["user"]["profileUrl"]; + Uint8List imagesBytes = base64Decode(base64String); + //MemoryImage(bytes) + GoRouter.of(context).goNamed( + RouterNames.homePage, + extra: { + "userId": response["user"]["id"], + "username": response["user"]["username"], + "email": response["user"]["email"], + "profileUrl": imagesBytes, + }, + ); + } else { + _globalFunction.snackBarMassage(context, response["massage"], 3); + } + setState(() { + _isLoading = false; + }); + } + + //login validation frontend properties + String usernameHint = "@username"; + bool isUsernameValid = true; + String passwordHint = "@password"; + bool isPasswordValid = true; @override Widget build(BuildContext context) { return Scaffold( + resizeToAvoidBottomInset: false, body: SingleChildScrollView( child: Padding( padding: EdgeInsets.symmetric( @@ -41,33 +85,65 @@ class _LoginScreenState extends State { SizedBox(height: MediaQuery.of(context).size.height * 0.15), //auth details Form( + key: _formKey, child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AuthtextBox( + isValid: isUsernameValid, controller: _usernamecontroller, - hint: "@username", + hint: usernameHint, isShow: false, onSubmit: (p0) {}, textInputAction: TextInputAction.next, textInputType: TextInputType.name, + + validChecker: (value) => null, ), SizedBox(height: MediaQuery.of(context).size.height * 0.02), //password AuthtextBox( controller: _passwordcontroller, - hint: "@password", + isValid: isPasswordValid, + hint: passwordHint, isShow: false, onSubmit: (p0) {}, textInputAction: TextInputAction.done, textInputType: TextInputType.visiblePassword, + validChecker: (value) => null, ), - SizedBox(height: MediaQuery.of(context).size.height * 0.3), + SizedBox(height: MediaQuery.of(context).size.height * 0.01), + TextButton( + onPressed: () { + GoRouter.of( + context, + ).goNamed(RouterNames.fogotpasswordScreen); + }, + child: Text("Fogot Password ?", style: textLabelRed), + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.25), Column( children: [ - AuthpageButton( - text: "Login", - path: RouterNames.homePage, + //if valid form state + GestureDetector( + onTap: () async { + if (_formKey.currentState!.validate() && + _usernamecontroller.text.isNotEmpty && + _passwordcontroller.text.isNotEmpty) { + await _userLogin(); + } else { + setState(() { + isPasswordValid = false; + passwordHint = "please enter your @password"; + isUsernameValid = false; + usernameHint = "please enter your @username"; + }); + } + }, + child: AuthpageButton( + text: "Login", + isLoading: _isLoading, + ), ), //to register page TextButton( diff --git a/undomain/lib/pages/authentication/register/register_screen.dart b/undomain/lib/pages/authentication/register/register_screen.dart index 23d6a7b..2ab369b 100644 --- a/undomain/lib/pages/authentication/register/register_screen.dart +++ b/undomain/lib/pages/authentication/register/register_screen.dart @@ -1,7 +1,13 @@ +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:undomain/router/router_names.dart'; +import 'package:undomain/services/auth_services/authservices.dart'; import 'package:undomain/util/colors/colors.dart'; +import 'package:undomain/util/global/global_function.dart'; import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; import 'package:undomain/widgets/buttons/authpage_button.dart'; @@ -20,6 +26,11 @@ class _RegisterScreenState extends State { final TextEditingController _confirmpasswordcontroller = TextEditingController(); final TextEditingController _emailcontroller = TextEditingController(); + final _formKey = GlobalKey(); + final Authservices _authservices = Authservices(); + final GlobalFunction _globalFunction = GlobalFunction(); + File? _file; + bool _isLoading = false; @override void dispose() { _passwordcontroller.dispose(); @@ -29,82 +40,239 @@ class _RegisterScreenState extends State { super.dispose(); } + //regexp for password + final RegExp passwordRegExp = RegExp( + r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[!@#$%^&*(),.?":{}|<>]).{6,}$', + ); + + //reg exp for username + final RegExp usernameRegExp = RegExp(r'[!@#$%^&*(),.?":{}|<>]'); + + ///regexp for email + final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); + + //login validation frontend properties + String usernameHint = "@username"; + bool isUsernameValid = true; + String passwordHint = "@password"; + bool isPasswordValid = true; + String emailHint = "@email"; + bool isEmailValid = true; + String confirmPasswordHint = "@confirm password"; + bool isConfirmPasswordValid = true; + + //set profile image + Future _setProfileImage(ImageSource source) async { + ImagePicker _imgPicker = ImagePicker(); + final image = await _imgPicker.pickImage(source: source); + if (image != null) { + setState(() { + _file = File(image.path); + }); + } + } + + //save valid user data and get verifcation code + Future userRegister() async { + setState(() { + _isLoading = true; + }); + + final response = await _authservices.register( + _file!, + username: _usernamecontroller.text, + email: _emailcontroller.text, + password: _passwordcontroller.text, + ); + if (response["succss"]) { + GoRouter.of(context).goNamed( + RouterNames.verificationPage, + extra: { + "userId": response["user"]["id"], + "isFromRegister": true, + "email": "", + }, + ); + } else { + _globalFunction.snackBarMassage(context, response["massage"], 3); + } + setState(() { + _isLoading = false; + }); + } + @override Widget build(BuildContext context) { return Scaffold( - body: Padding( - padding: EdgeInsets.symmetric( - horizontal: authScreenPaddingH, - vertical: authScreenPaddingV, - ), - child: Column( - children: [ - SizedBox(height: MediaQuery.of(context).size.height * 0.08), - //title - Text("Date NET.", style: textDisplay), - //auth details - Form( - child: Column( - children: [ - SizedBox(height: MediaQuery.of(context).size.height * 0.02), - CircleAvatar(backgroundColor: utilPrimaryGrey, radius: 64), - SizedBox(height: MediaQuery.of(context).size.height * 0.02), - //username - AuthtextBox( - controller: _usernamecontroller, - hint: "@username", - isShow: false, - onSubmit: (p0) {}, - textInputAction: TextInputAction.next, - textInputType: TextInputType.name, - ), - SizedBox(height: MediaQuery.of(context).size.height * 0.02), - //email - AuthtextBox( - controller: _passwordcontroller, - hint: "@email", - isShow: false, - onSubmit: (p0) {}, - textInputAction: TextInputAction.next, - textInputType: TextInputType.emailAddress, - ), - SizedBox(height: MediaQuery.of(context).size.height * 0.02), - //password - AuthtextBox( - controller: _confirmpasswordcontroller, - hint: "@password", - isShow: false, - onSubmit: (p0) {}, - textInputAction: TextInputAction.next, - textInputType: TextInputType.visiblePassword, - ), - SizedBox(height: MediaQuery.of(context).size.height * 0.02), - //password - AuthtextBox( - controller: _emailcontroller, - hint: "@password", - isShow: false, - onSubmit: (p0) {}, - textInputAction: TextInputAction.done, - textInputType: TextInputType.visiblePassword, - ), - SizedBox(height: MediaQuery.of(context).size.height * 0.08), - //to verification page - AuthpageButton( - text: "Register", - path: RouterNames.verificationPage, - ), - //to login page - TextButton( - onPressed: () { - GoRouter.of(context).goNamed(RouterNames.loginPage); - }, - child: Text("Login", style: textLabelRed), - ), - ], + resizeToAvoidBottomInset: false, + body: SingleChildScrollView( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: authScreenPaddingH, + vertical: authScreenPaddingV, + ), + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * 0.08), + //title + Text("Date NET.", style: textDisplay), + //auth details + Form( + key: _formKey, + child: Column( + children: [ + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + Stack( + children: [ + //profile picture + _file != null + ? CircleAvatar( + backgroundImage: FileImage(_file!), + backgroundColor: utilPrimaryWhite.withOpacity( + 0.8, + ), + radius: 64, + ) + : CircleAvatar( + backgroundColor: utilPrimaryWhite.withOpacity( + 0.8, + ), + radius: 64, + ), + Positioned( + bottom: 0, + right: -6, + child: IconButton( + onPressed: () { + _setProfileImage(ImageSource.gallery); + }, + icon: Icon( + CupertinoIcons.camera_circle, + color: utilPrimaryWhite, + size: 40, + ), + ), + ), + ], + ), + + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + //username + AuthtextBox( + isValid: isUsernameValid, + controller: _usernamecontroller, + hint: usernameHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.next, + textInputType: TextInputType.name, + validChecker: (value) => null, + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + //email + AuthtextBox( + isValid: isEmailValid, + controller: _emailcontroller, + hint: emailHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.next, + textInputType: TextInputType.emailAddress, + validChecker: (value) => null, + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + //password + AuthtextBox( + isValid: isPasswordValid, + controller: _passwordcontroller, + hint: passwordHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.next, + textInputType: TextInputType.visiblePassword, + validChecker: (value) => null, + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.02), + //password + AuthtextBox( + isValid: isConfirmPasswordValid, + controller: _confirmpasswordcontroller, + hint: confirmPasswordHint, + isShow: false, + onSubmit: (p0) {}, + textInputAction: TextInputAction.done, + textInputType: TextInputType.visiblePassword, + validChecker: (value) => null, + ), + SizedBox(height: MediaQuery.of(context).size.height * 0.08), + //to verification page + GestureDetector( + onTap: () async { + if (_usernamecontroller.text.isEmpty || + _emailcontroller.text.isEmpty || + _passwordcontroller.text.isEmpty || + _confirmpasswordcontroller.text.isEmpty) { + setState(() { + isUsernameValid = false; + isEmailValid = false; + isPasswordValid = false; + isConfirmPasswordValid = false; + usernameHint = "please enter your @username"; + emailHint = "please enter your @email"; + passwordHint = "please enter your @password"; + confirmPasswordHint = + "please enter your @confirm password"; + }); + } else if (usernameRegExp.hasMatch( + _usernamecontroller.text, + )) { + setState(() { + usernameHint = "@username cannot cantain symbols"; + _usernamecontroller.clear(); + }); + } else if (!emailRegex.hasMatch( + _emailcontroller.text, + )) { + setState(() { + emailHint = "Invalid @email format"; + _emailcontroller.clear(); + }); + } else if (!passwordRegExp.hasMatch( + _passwordcontroller.text, + )) { + setState(() { + passwordHint = "weak password"; + _passwordcontroller.clear(); + }); + } else if (_passwordcontroller.text != + _confirmpasswordcontroller.text) { + setState(() { + confirmPasswordHint = + "password mismatching please check your password"; + _confirmpasswordcontroller.clear(); + }); + } else { + //execute register function + await userRegister(); + } + }, + child: AuthpageButton( + text: "Register", + isLoading: _isLoading, + ), + ), + //to login page + TextButton( + onPressed: () { + GoRouter.of(context).goNamed(RouterNames.loginPage); + }, + child: Text("Login", style: textLabelRed), + ), + ], + ), ), - ), - ], + ], + ), ), ), ); diff --git a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart index 23e1e5b..465df71 100644 --- a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart +++ b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart @@ -1,8 +1,12 @@ import 'dart:async'; +import 'package:animated_splash_screen/animated_splash_screen.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; +import 'package:page_transition/page_transition.dart'; +import 'package:undomain/pages/authentication/terms&conditions/terms_and_conditions.dart'; import 'package:undomain/router/router_names.dart'; +import 'package:undomain/util/colors/colors.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; class SpalshScreen extends StatefulWidget { @@ -21,24 +25,19 @@ class _SpalshScreenState extends State { }); } + dynamic get splash => null; @override Widget build(BuildContext context) { - - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text("Date NET.", style: textDisplay), - SizedBox(height: 20), + return AnimatedSplashScreen( + splash: Text("Date NET.", style: textDisplay), + nextScreen: TermsAndConditions(), + // animationDuration: Duration(seconds: 3000), + backgroundColor: utilPrimaryWhite, + centered: true, + splashTransition: SplashTransition.fadeTransition, + pageTransitionType: PageTransitionType.fade, - SizedBox(height: 10), - CircularProgressIndicator( - color: Colors.blue, - ), // optional loading spinner - ], - ), - ), + duration: 3000, ); } } diff --git a/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart b/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart index f589af5..b342c12 100644 --- a/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart +++ b/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart @@ -1,14 +1,21 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:undomain/router/router_names.dart'; import 'package:undomain/util/colors/colors.dart'; import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; import 'package:undomain/widgets/buttons/authpage_button.dart'; -class TermsAndConditions extends StatelessWidget { +class TermsAndConditions extends StatefulWidget { const TermsAndConditions({super.key}); @override + State createState() => _TermsAndConditionsState(); +} + +class _TermsAndConditionsState extends State { + @override + bool isChecked = false; Widget build(BuildContext context) { final deviceWidth = MediaQuery.of(context).size.width; final deviceHeight = MediaQuery.of(context).size.height; @@ -39,20 +46,46 @@ class TermsAndConditions extends StatelessWidget { children: [ Row( children: [ + //acceptent check box Checkbox( - value: false, - onChanged: (value) {}, - checkColor: utilPrimaryRed, + value: isChecked, + activeColor: utilPrimaryRed, + onChanged: (value) { + setState(() { + isChecked = !isChecked; + }); + }, + checkColor: utilPrimaryWhite, autofocus: true, focusColor: utilPrimaryRed, side: BorderSide(color: utilPrimaryBlack, width: 1), ), Text("I agree terms & conditions", style: textLabel), - - //go to login page ], ), - AuthpageButton(path: RouterNames.loginPage, text: "Continue"), + //route to login page + GestureDetector( + onTap: () { + isChecked + ? GoRouter.of(context).goNamed(RouterNames.loginPage) + : ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: utilPrimaryRed, + closeIconColor: utilPrimaryWhite, + elevation: 1, + showCloseIcon: true, + padding: EdgeInsets.symmetric( + horizontal: authScreenPaddingH, + ), + content: Text( + "Please accept terms & conditions", + style: textSnackbar, + ), + ), + ); + }, + child: AuthpageButton(text: "Continue",isLoading: false,), + ), ], ), ], diff --git a/undomain/lib/pages/home/homepage.dart b/undomain/lib/pages/home/homepage.dart index e14ca6c..fe0d943 100644 --- a/undomain/lib/pages/home/homepage.dart +++ b/undomain/lib/pages/home/homepage.dart @@ -1,15 +1,49 @@ +import 'dart:typed_data'; + import 'package:flutter/material.dart'; +import 'package:undomain/util/global/global_varibles.dart'; +import 'package:undomain/util/textstyles/text_styles.dart'; class Homepage extends StatefulWidget { - const Homepage({super.key}); + final String userId; + final String username; + final String email; + final Uint8List prfileUrl; + const Homepage({ + super.key, + required this.userId, + required this.username, + required this.email, + required this.prfileUrl, + }); @override State createState() => _HomepageState(); } class _HomepageState extends State { + //Uint8List imageBytes = base64Decode() @override Widget build(BuildContext context) { - return Scaffold(body: Column(children: [Text("Welcome to Homepage")])); + return Scaffold( + body: Padding( + padding: const EdgeInsets.symmetric( + horizontal: authScreenPaddingH, + vertical: authScreenPaddingV, + ), + child: Column( + children: [ + Text("Welcome to Homepage"), + Text(widget.userId, style: textBody), + Text(widget.username, style: textBody), + Text(widget.email, style: textBody), + CircleAvatar( + radius: 64, + backgroundImage: MemoryImage(widget.prfileUrl), + ), + ], + ), + ), + ); } } diff --git a/undomain/lib/router/go_router.dart b/undomain/lib/router/go_router.dart index 9fcc157..62ac577 100644 --- a/undomain/lib/router/go_router.dart +++ b/undomain/lib/router/go_router.dart @@ -1,8 +1,11 @@ //page routes +import 'dart:typed_data'; + import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:undomain/pages/authentication/email_verification/email_verification.dart'; +import 'package:undomain/pages/authentication/fogotpassword/fogot_password.dart'; import 'package:undomain/pages/authentication/login/login_screen.dart'; import 'package:undomain/pages/authentication/register/register_screen.dart'; import 'package:undomain/pages/authentication/spalshscreen/spalsh.dart'; @@ -13,7 +16,7 @@ import 'package:undomain/router/router_names.dart'; class Routes { final goRouter = GoRouter( - initialLocation: "/verify", + initialLocation: "/", errorPageBuilder: (context, state) { return const MaterialPage(child: ErrorPage()); }, @@ -42,7 +45,7 @@ class Routes { return const TermsAndConditions(); }, ), - // //registerpage + //registerpage GoRoute( path: "/register", name: RouterNames.registerPage, @@ -55,7 +58,15 @@ class Routes { path: "/verify", name: RouterNames.verificationPage, builder: (context, state) { - return EmailVerification(); + final String userId = (state.extra as Map)["userId"]; + final bool isFromRegister = + (state.extra as Map)["isFromRegister"]; + final String email = (state.extra as Map)["email"]; + return EmailVerification( + userid: userId, + isForRegister: isFromRegister, + email: email, + ); }, ), //Homepage @@ -63,7 +74,25 @@ class Routes { path: "/home", name: RouterNames.homePage, builder: (context, state) { - return Homepage(); + String userId = (state.extra as Map)["userId"]; + String username = (state.extra as Map)["username"]; + String email = (state.extra as Map)["email"]; + Uint8List profileUrl = + (state.extra as Map)["profileUrl"]; + return Homepage( + email: email, + prfileUrl: profileUrl, + userId: userId, + username: username, + ); + }, + ), + //Homepage + GoRoute( + path: "/fogotpassword", + name: RouterNames.fogotpasswordScreen, + builder: (context, state) { + return FogotPassword(); }, ), ], diff --git a/undomain/lib/router/router_names.dart b/undomain/lib/router/router_names.dart index 56106b0..868560e 100644 --- a/undomain/lib/router/router_names.dart +++ b/undomain/lib/router/router_names.dart @@ -5,4 +5,5 @@ class RouterNames { static const String homePage = "home"; static const String termsAndConditions = "/terms"; static const String splashScreen = "/"; + static const String fogotpasswordScreen = "/fogotpassword"; } diff --git a/undomain/lib/services/auth_services/authservices.dart b/undomain/lib/services/auth_services/authservices.dart new file mode 100644 index 0000000..95bba05 --- /dev/null +++ b/undomain/lib/services/auth_services/authservices.dart @@ -0,0 +1,150 @@ +import "dart:convert"; +import "dart:io"; + +import "package:http/http.dart" as http; +import "package:shared_preferences/shared_preferences.dart"; + +class Authservices { + final baseUrl = "http://192.168.28.148:5000/api/auth"; + //register new user + Future> register( + File profileUrl, { + required String username, + required String email, + required String password, + }) async { + try { + final uri = Uri.parse("$baseUrl/register"); + //get response + final request = http.MultipartRequest('POST', uri); + //attach text fields + request.fields['username'] = username; + request.fields['email'] = email; + request.fields['password'] = password; + //attach file + request.files.add( + await http.MultipartFile.fromPath("profileUrl", profileUrl.path), + ); + //send request + final streamedResponse = await request.send(); + final response = await http.Response.fromStream(streamedResponse); + + //get body + final user = jsonDecode(response.body); + if (response.statusCode == 400 || response.statusCode == 500) { + return user; + } + + //store tooken in shared preferences + final SharedPreferences preferences = + await SharedPreferences.getInstance(); + preferences.setString("token", user["newToken"]); + print(user["newToken"]); + return user; + } catch (err) { + print("client side error $err"); + return {"succss": false, "massage": "Unexpected error"}; + } + } + + //verify new user + Future> verifyNewUser({ + required String userId, + required String verifyCode, + }) async { + try { + final response = await http.post( + Uri.parse("$baseUrl/verify"), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({"userId": userId, "verifyCode": verifyCode}), + ); + final user = jsonDecode(response.body); + if (response.statusCode == 400 || + response.statusCode == 408 || + response.statusCode == 500) { + return user; + } + return user; + } catch (err) { + print("client side error $err"); + return {"success": false, "massage": "Unexpected error"}; + } + } + + //login existing user + Future> login({ + required String username, + required String password, + }) async { + try { + final response = await http.post( + Uri.parse("$baseUrl/login"), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({"username": username, "password": password}), + ); + + final user = jsonDecode(response.body); + if (response.statusCode == 400 || response.statusCode == 500) { + return user; + } + //store tooken in shared preferences + final SharedPreferences preferences = + await SharedPreferences.getInstance(); + preferences.setString("token", user["newToken"]); + print(user["newToken"]); + return user; + } catch (err) { + print("client side error $err"); + return {"success": false, "massage": "Unexpected error"}; + } + } + + //send reset password request with email and new password + Future> sendPasswordResetRequest({ + required String email, + }) async { + try { + final response = await http.post( + Uri.parse("$baseUrl/user-verification"), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({"email": email}), + ); + + final user = jsonDecode(response.body); + if (response.statusCode == 404 || response.statusCode == 500) { + return user; + } + + return user; + } catch (err) { + print("client side error $err"); + return {"success": false, "massage": "Unexpected error"}; + } + } + + //verify resset password + Future> verifyResetPassword({ + required String email, + required String otp, + required String password, + }) async { + try { + final response = await http.post( + Uri.parse("$baseUrl/reset-password"), + headers: {'Content-Type': 'application/json'}, + body: jsonEncode({"email": email, "otp": otp, "password": password}), + ); + + final user = jsonDecode(response.body); + if (response.statusCode == 404 || + response.statusCode == 500 || + response.statusCode == 400 || + response.statusCode == 408) { + return user; + } + return user; + } catch (err) { + return {"success": false, "massage": "Unexpected error"}; + } + } +} diff --git a/undomain/lib/util/global/global_function.dart b/undomain/lib/util/global/global_function.dart new file mode 100644 index 0000000..de0c90e --- /dev/null +++ b/undomain/lib/util/global/global_function.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:undomain/util/colors/colors.dart'; +import 'package:undomain/util/global/global_varibles.dart'; +import 'package:undomain/util/textstyles/text_styles.dart'; + +class GlobalFunction { + void snackBarMassage(BuildContext context, String text, int duration) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + backgroundColor: utilPrimaryRed, + closeIconColor: utilPrimaryWhite, + elevation: 1, + showCloseIcon: true, + duration: Duration(seconds: duration), + padding: EdgeInsets.symmetric(horizontal: authScreenPaddingH), + content: Text(text, style: textSnackbar), + ), + ); + } +} diff --git a/undomain/lib/util/textstyles/text_styles.dart b/undomain/lib/util/textstyles/text_styles.dart index 8accaad..f4e7984 100644 --- a/undomain/lib/util/textstyles/text_styles.dart +++ b/undomain/lib/util/textstyles/text_styles.dart @@ -38,3 +38,8 @@ final textTitalSmall = GoogleFonts.poppins( fontSize: 16, fontWeight: FontWeight.w600, ); +final textSnackbar = GoogleFonts.poppins( + color: utilPrimaryWhite, + fontSize: 11, + fontWeight: FontWeight.w400, +); diff --git a/undomain/lib/widgets/buttons/authpage_button.dart b/undomain/lib/widgets/buttons/authpage_button.dart index 0a0bfb0..bdfe6e9 100644 --- a/undomain/lib/widgets/buttons/authpage_button.dart +++ b/undomain/lib/widgets/buttons/authpage_button.dart @@ -1,30 +1,32 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:undomain/util/colors/colors.dart'; import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; class AuthpageButton extends StatelessWidget { final String text; - - final String path; - const AuthpageButton({super.key, required this.text, required this.path}); + final bool isLoading; + const AuthpageButton({ + super.key, + required this.text, + required this.isLoading, + }); @override Widget build(BuildContext context) { - return GestureDetector( - onTap: () { - GoRouter.of(context).goNamed(path); - }, - child: Container( - width: double.infinity, - height: MediaQuery.of(context).size.height * 0.07, - child: Center(child: Text(text, style: textTitle)), + return Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.07, + child: Center( + child: + isLoading + ? CircularProgressIndicator(color: utilPrimaryWhite) + : Text(text, style: textTitle), + ), - decoration: BoxDecoration( - color: utilPrimaryRed, - borderRadius: BorderRadius.circular(authButtonRadius), - ), + decoration: BoxDecoration( + color: utilPrimaryRed, + borderRadius: BorderRadius.circular(authButtonRadius), ), ); } diff --git a/undomain/lib/widgets/textboxes/authtext_box.dart b/undomain/lib/widgets/textboxes/authtext_box.dart index a9c90e2..e4486d4 100644 --- a/undomain/lib/widgets/textboxes/authtext_box.dart +++ b/undomain/lib/widgets/textboxes/authtext_box.dart @@ -9,6 +9,8 @@ class AuthtextBox extends StatelessWidget { final bool isShow; final TextInputAction textInputAction; final TextInputType textInputType; + final String? Function(String?)? validChecker; + final bool isValid; const AuthtextBox({ super.key, required this.onSubmit, @@ -17,20 +19,24 @@ class AuthtextBox extends StatelessWidget { required this.isShow, required this.textInputAction, required this.textInputType, + this.validChecker, + required this.isValid, }); @override Widget build(BuildContext context) { return TextFormField( onFieldSubmitted: onSubmit, + validator: validChecker, controller: controller, textInputAction: textInputAction, keyboardType: textInputType, obscureText: isShow, cursorColor: utilPrimaryGrey, + decoration: InputDecoration( hintText: hint, - hintStyle: textHint, + hintStyle: isValid ? textHint : textLabelRed, contentPadding: EdgeInsets.symmetric( vertical: MediaQuery.of(context).size.height * 0.02, diff --git a/undomain/linux/flutter/generated_plugin_registrant.cc b/undomain/linux/flutter/generated_plugin_registrant.cc index e71a16d..64a0ece 100644 --- a/undomain/linux/flutter/generated_plugin_registrant.cc +++ b/undomain/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); } diff --git a/undomain/linux/flutter/generated_plugins.cmake b/undomain/linux/flutter/generated_plugins.cmake index 2e1de87..2db3c22 100644 --- a/undomain/linux/flutter/generated_plugins.cmake +++ b/undomain/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/undomain/macos/Flutter/GeneratedPluginRegistrant.swift b/undomain/macos/Flutter/GeneratedPluginRegistrant.swift index e777c67..4b4e1ac 100644 --- a/undomain/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/undomain/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,12 @@ import FlutterMacOS import Foundation +import file_selector_macos import path_provider_foundation +import shared_preferences_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) } diff --git a/undomain/pubspec.lock b/undomain/pubspec.lock index 3a53c7d..50c55b4 100644 --- a/undomain/pubspec.lock +++ b/undomain/pubspec.lock @@ -1,6 +1,14 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + animated_splash_screen: + dependency: "direct main" + description: + name: animated_splash_screen + sha256: f45634db6ec4e8cf034c53e03f3bd83898a16fe3c9286bf5510b6831dfcf2124 + url: "https://pub.dev" + source: hosted + version: "1.3.0" ansicolor: dependency: transitive description: @@ -65,6 +73,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.19.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" crypto: dependency: transitive description: @@ -105,6 +121,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "54cbbd957e1156d29548c7d9b9ec0c0ebb6de0a90452198683a7d23aed617a33" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: "271ab9986df0c135d45c3cdb6bd0faa5db6f4976d3e4b437cf7d0f258d941bfc" + url: "https://pub.dev" + source: hosted + version: "0.9.4+2" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "320fcfb6f33caa90f0b58380489fc5ac05d99ee94b61aa96ec2bff0ba81d3c2b" + url: "https://pub.dev" + source: hosted + version: "0.9.3+4" flutter: dependency: "direct main" description: flutter @@ -126,6 +182,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.6" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "5a1e6fb2c0561958d7e4c33574674bda7b77caaca7a33b758876956f2902eea3" + url: "https://pub.dev" + source: hosted + version: "2.0.27" flutter_test: dependency: "direct dev" description: flutter @@ -161,7 +225,7 @@ packages: source: hosted version: "0.15.5+1" http: - dependency: transitive + dependency: "direct main" description: name: http sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f @@ -184,6 +248,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.4" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "8bd392ba8b0c8957a157ae0dc9fcf48c58e6c20908d5880aea1d79734df090e9" + url: "https://pub.dev" + source: hosted + version: "0.8.12+22" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "717eb042ab08c40767684327be06a5d8dbb341fe791d514e4b92c7bbe1b7bb83" + url: "https://pub.dev" + source: hosted + version: "3.0.6" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" + url: "https://pub.dev" + source: hosted + version: "0.8.12+2" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "34a65f6740df08bbbeb0a1abd8e6d32107941fd4868f67a507b25601651022c9" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "1b90ebbd9dcf98fb6c1d01427e49a55bd96b5d67b8c67cf955d60a5de74207c1" + url: "https://pub.dev" + source: hosted + version: "0.2.1+2" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" + url: "https://pub.dev" + source: hosted + version: "2.10.1" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" leak_tracker: dependency: transitive description: @@ -248,6 +376,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.16.0" + mime: + dependency: transitive + description: + name: mime + sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + page_transition: + dependency: "direct main" + description: + name: page_transition + sha256: "9d2a780d7d68b53ae82fbcc43e06a16195e6775e9aae40e55dc0cbb593460f9d" + url: "https://pub.dev" + source: hosted + version: "2.2.1" path: dependency: transitive description: @@ -344,6 +488,62 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.1" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: "6e8bf70b7fef813df4e9a36f658ac46d107db4b4cfe1048b477d4e453a8159f5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: c2c8c46297b5d6a80bed7741ec1f2759742c77d272f1a1698176ae828f8e1a18 + url: "https://pub.dev" + source: hosted + version: "2.4.9" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "6a52cfcdaeac77cad8c97b539ff688ccfc458c007b4db12be584fbe5c0e49e03" + url: "https://pub.dev" + source: hosted + version: "2.5.4" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: c49bd060261c9a3f0ff445892695d6212ff603ef3115edbb448509d407600019 + url: "https://pub.dev" + source: hosted + version: "2.4.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" + url: "https://pub.dev" + source: hosted + version: "2.4.1" sky_engine: dependency: transitive description: flutter diff --git a/undomain/pubspec.yaml b/undomain/pubspec.yaml index c047d5d..624f6a7 100644 --- a/undomain/pubspec.yaml +++ b/undomain/pubspec.yaml @@ -38,6 +38,11 @@ dependencies: go_router: ^14.8.1 pinput: ^5.0.1 flutter_native_splash: ^2.4.6 + animated_splash_screen: ^1.3.0 + page_transition: ^2.2.1 + image_picker: ^1.1.2 + http: ^1.3.0 + shared_preferences: ^2.5.3 dev_dependencies: flutter_test: diff --git a/undomain/windows/flutter/generated_plugin_registrant.cc b/undomain/windows/flutter/generated_plugin_registrant.cc index 8b6d468..77ab7a0 100644 --- a/undomain/windows/flutter/generated_plugin_registrant.cc +++ b/undomain/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); } diff --git a/undomain/windows/flutter/generated_plugins.cmake b/undomain/windows/flutter/generated_plugins.cmake index b93c4c3..a423a02 100644 --- a/undomain/windows/flutter/generated_plugins.cmake +++ b/undomain/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST From 93bb0ffbf4646c24edbec9b63313b11f8f5e7b98 Mon Sep 17 00:00:00 2001 From: chamod udara Date: Sun, 13 Apr 2025 14:42:46 +0530 Subject: [PATCH 2/3] add:some route changes --- .../assets/pic.jpg | Bin .../email_verification.dart | 8 ++-- .../fogotpassword/fogot_password.dart | 7 ++- .../register/register_screen.dart | 2 +- .../authentication/spalshscreen/spalsh.dart | 40 +++++++++++++++-- .../terms_and_conditions.dart | 3 +- undomain/lib/pages/home/homepage.dart | 41 +++++++++++++----- .../lib/pages/wrapper/wrapper_screen.dart | 10 +++++ undomain/lib/router/go_router.dart | 7 +++ undomain/lib/router/router_names.dart | 1 + undomain/lib/util/global/global_varibles.dart | 1 + undomain/pubspec.yaml | 7 ++- 12 files changed, 98 insertions(+), 29 deletions(-) rename 80f4933d069dc239577ba181c546bd7f.jpg => undomain/assets/pic.jpg (100%) create mode 100644 undomain/lib/pages/wrapper/wrapper_screen.dart diff --git a/80f4933d069dc239577ba181c546bd7f.jpg b/undomain/assets/pic.jpg similarity index 100% rename from 80f4933d069dc239577ba181c546bd7f.jpg rename to undomain/assets/pic.jpg diff --git a/undomain/lib/pages/authentication/email_verification/email_verification.dart b/undomain/lib/pages/authentication/email_verification/email_verification.dart index db8794c..f7404ea 100644 --- a/undomain/lib/pages/authentication/email_verification/email_verification.dart +++ b/undomain/lib/pages/authentication/email_verification/email_verification.dart @@ -104,11 +104,11 @@ class _EmailVerificationState extends State { } else { _globalFunction.snackBarMassage(context, response["massage"], 3); } - - setState(() { - _isLoading = true; - }); } + setState(() { + _isLoading = false; + _pincontroller.clear(); + }); } @override diff --git a/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart b/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart index 3d30578..e5db645 100644 --- a/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart +++ b/undomain/lib/pages/authentication/fogotpassword/fogot_password.dart @@ -93,6 +93,7 @@ class _FogotPasswordState extends State { validChecker: (value) => null, ), + SizedBox(height: MediaQuery.of(context).size.height * 0.02), AuthtextBox( isValid: isPasswordValid, controller: _passwordcontroller, @@ -122,7 +123,7 @@ class _FogotPasswordState extends State { children: [ //if valid form state GestureDetector( - onTap: () { + onTap: () async { if (_confirmpasswordcontroller.text.isEmpty && _passwordcontroller.text.isEmpty) { setState(() { @@ -147,9 +148,7 @@ class _FogotPasswordState extends State { _confirmpasswordcontroller.clear(); }); } else { - GoRouter.of( - context, - ).goNamed(RouterNames.loginPage); + await _getCodeForResetPassword(); } }, diff --git a/undomain/lib/pages/authentication/register/register_screen.dart b/undomain/lib/pages/authentication/register/register_screen.dart index 2ab369b..527fd2d 100644 --- a/undomain/lib/pages/authentication/register/register_screen.dart +++ b/undomain/lib/pages/authentication/register/register_screen.dart @@ -104,7 +104,7 @@ class _RegisterScreenState extends State { @override Widget build(BuildContext context) { return Scaffold( - resizeToAvoidBottomInset: false, + // resizeToAvoidBottomInset: false, body: SingleChildScrollView( child: Padding( padding: EdgeInsets.symmetric( diff --git a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart index 465df71..34360c1 100644 --- a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart +++ b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart @@ -4,7 +4,9 @@ import 'package:animated_splash_screen/animated_splash_screen.dart'; import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:page_transition/page_transition.dart'; -import 'package:undomain/pages/authentication/terms&conditions/terms_and_conditions.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:undomain/pages/authentication/login/login_screen.dart'; +import 'package:undomain/pages/home/homepage.dart'; import 'package:undomain/router/router_names.dart'; import 'package:undomain/util/colors/colors.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; @@ -21,7 +23,7 @@ class _SpalshScreenState extends State { void initState() { super.initState(); Timer(Duration(seconds: 3), () { - GoRouter.of(context).goNamed(RouterNames.termsAndConditions); + GoRouter.of(context).goNamed(RouterNames.wrapperScreen); }); } @@ -30,7 +32,7 @@ class _SpalshScreenState extends State { Widget build(BuildContext context) { return AnimatedSplashScreen( splash: Text("Date NET.", style: textDisplay), - nextScreen: TermsAndConditions(), + nextScreen: WrapperScreen(), // animationDuration: Duration(seconds: 3000), backgroundColor: utilPrimaryWhite, centered: true, @@ -41,3 +43,35 @@ class _SpalshScreenState extends State { ); } } + +//chack auth states +class WrapperScreen extends StatefulWidget { + const WrapperScreen({super.key}); + + @override + State createState() => _WrapperScreenState(); +} + +class _WrapperScreenState extends State { + bool isLoged = false; + + @override + void initState() { + _checkLoginState(); + super.initState(); + } + + void _checkLoginState() async { + SharedPreferences _pref = await SharedPreferences.getInstance(); + String? token = _pref.getString("token"); + + setState(() { + isLoged = token != null; + }); + } + + @override + Widget build(BuildContext context) { + return isLoged ? Homepage() : LoginScreen(); + } +} diff --git a/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart b/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart index b342c12..763cc65 100644 --- a/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart +++ b/undomain/lib/pages/authentication/terms&conditions/terms_and_conditions.dart @@ -52,6 +52,7 @@ class _TermsAndConditionsState extends State { activeColor: utilPrimaryRed, onChanged: (value) { setState(() { + isInitialUser = true; isChecked = !isChecked; }); }, @@ -84,7 +85,7 @@ class _TermsAndConditionsState extends State { ), ); }, - child: AuthpageButton(text: "Continue",isLoading: false,), + child: AuthpageButton(text: "Continue", isLoading: false), ), ], ), diff --git a/undomain/lib/pages/home/homepage.dart b/undomain/lib/pages/home/homepage.dart index fe0d943..da9f9a5 100644 --- a/undomain/lib/pages/home/homepage.dart +++ b/undomain/lib/pages/home/homepage.dart @@ -5,16 +5,17 @@ import 'package:undomain/util/global/global_varibles.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; class Homepage extends StatefulWidget { - final String userId; - final String username; - final String email; - final Uint8List prfileUrl; + final String? userId; + final String? username; + final String? email; + final Uint8List? prfileUrl; const Homepage({ super.key, - required this.userId, - required this.username, - required this.email, - required this.prfileUrl, + + this.userId, + this.username, + this.email, + this.prfileUrl, }); @override @@ -22,6 +23,19 @@ class Homepage extends StatefulWidget { } class _HomepageState extends State { + late String id; + late String name; + late String email; + + @override + void initState() { + id = widget.userId ?? ""; + name = widget.username ?? ""; + email = widget.email ?? ""; + + super.initState(); + } + //Uint8List imageBytes = base64Decode() @override Widget build(BuildContext context) { @@ -34,12 +48,15 @@ class _HomepageState extends State { child: Column( children: [ Text("Welcome to Homepage"), - Text(widget.userId, style: textBody), - Text(widget.username, style: textBody), - Text(widget.email, style: textBody), + Text(id, style: textBody), + Text(name, style: textBody), + Text(email, style: textBody), CircleAvatar( radius: 64, - backgroundImage: MemoryImage(widget.prfileUrl), + backgroundImage: + widget.prfileUrl != null + ? MemoryImage(widget.prfileUrl!) + : AssetImage("assets/pic.jpg"), ), ], ), diff --git a/undomain/lib/pages/wrapper/wrapper_screen.dart b/undomain/lib/pages/wrapper/wrapper_screen.dart new file mode 100644 index 0000000..e7d24ef --- /dev/null +++ b/undomain/lib/pages/wrapper/wrapper_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class WrapperScreen extends StatelessWidget { + const WrapperScreen({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} \ No newline at end of file diff --git a/undomain/lib/router/go_router.dart b/undomain/lib/router/go_router.dart index 62ac577..7211959 100644 --- a/undomain/lib/router/go_router.dart +++ b/undomain/lib/router/go_router.dart @@ -95,6 +95,13 @@ class Routes { return FogotPassword(); }, ), + GoRoute( + path: "/wrapper", + name: RouterNames.wrapperScreen, + builder: (context, state) { + return WrapperScreen(); + }, + ), ], ); } diff --git a/undomain/lib/router/router_names.dart b/undomain/lib/router/router_names.dart index 868560e..f1822f2 100644 --- a/undomain/lib/router/router_names.dart +++ b/undomain/lib/router/router_names.dart @@ -6,4 +6,5 @@ class RouterNames { static const String termsAndConditions = "/terms"; static const String splashScreen = "/"; static const String fogotpasswordScreen = "/fogotpassword"; + static const String wrapperScreen = "/wrapper"; } diff --git a/undomain/lib/util/global/global_varibles.dart b/undomain/lib/util/global/global_varibles.dart index 8f087a1..dd768e3 100644 --- a/undomain/lib/util/global/global_varibles.dart +++ b/undomain/lib/util/global/global_varibles.dart @@ -1,3 +1,4 @@ const double authScreenPaddingH = 20; const double authScreenPaddingV = 40; const double authButtonRadius = 36; + bool isInitialUser = true; diff --git a/undomain/pubspec.yaml b/undomain/pubspec.yaml index 624f6a7..4918a1d 100644 --- a/undomain/pubspec.yaml +++ b/undomain/pubspec.yaml @@ -67,10 +67,9 @@ flutter: uses-material-design: true # To add assets to your application, add an assets section, like this: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - + assets: + - assets/ + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/to/resolution-aware-images From 667ca0a65dd00f1eafa5ec7d85c9084d9a8cc3f5 Mon Sep 17 00:00:00 2001 From: chamod udara Date: Thu, 17 Apr 2025 17:35:36 +0530 Subject: [PATCH 3/3] add homescreen --- undomain/assets/Frame 15.png | Bin 0 -> 50467 bytes undomain/assets/box1.jpeg | Bin 0 -> 8243 bytes undomain/assets/box2.jpeg | Bin 0 -> 18050 bytes undomain/assets/mess.jpeg | Bin 0 -> 47375 bytes .../authentication/spalshscreen/spalsh.dart | 15 +- undomain/lib/pages/home/home_screen.dart | 161 ++++++++++++++++++ undomain/lib/pages/home/homepage.dart | 66 ------- undomain/lib/pages/home/main_screen.dart | 130 ++++++++++++++ undomain/lib/pages/profile/profile_scren.dart | 10 ++ undomain/lib/pages/reels/reel_screen.dart | 10 ++ .../lib/pages/streaming/streaming_screen.dart | 10 ++ undomain/lib/pages/update/update_screen.dart | 10 ++ .../lib/pages/wrapper/wrapper_screen.dart | 10 -- undomain/lib/router/go_router.dart | 30 ++-- undomain/lib/router/router_names.dart | 2 +- .../services/auth_services/authservices.dart | 10 +- .../services/userservices/userservices.dart | 108 ++++++++++++ undomain/lib/util/colors/colors.dart | 1 + undomain/lib/util/global/global_varibles.dart | 5 +- undomain/pubspec.lock | 16 ++ undomain/pubspec.yaml | 3 + 21 files changed, 501 insertions(+), 96 deletions(-) create mode 100644 undomain/assets/Frame 15.png create mode 100644 undomain/assets/box1.jpeg create mode 100644 undomain/assets/box2.jpeg create mode 100644 undomain/assets/mess.jpeg create mode 100644 undomain/lib/pages/home/home_screen.dart delete mode 100644 undomain/lib/pages/home/homepage.dart create mode 100644 undomain/lib/pages/home/main_screen.dart create mode 100644 undomain/lib/pages/profile/profile_scren.dart create mode 100644 undomain/lib/pages/reels/reel_screen.dart create mode 100644 undomain/lib/pages/streaming/streaming_screen.dart create mode 100644 undomain/lib/pages/update/update_screen.dart delete mode 100644 undomain/lib/pages/wrapper/wrapper_screen.dart create mode 100644 undomain/lib/services/userservices/userservices.dart diff --git a/undomain/assets/Frame 15.png b/undomain/assets/Frame 15.png new file mode 100644 index 0000000000000000000000000000000000000000..32c45b2b8f655b7cacbb30ae79ae005bb203ce06 GIT binary patch literal 50467 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 literal 0 HcmV?d00001 diff --git a/undomain/assets/box1.jpeg b/undomain/assets/box1.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..80786b2110fabb606579f10b5c1fac149f03c02f GIT binary patch literal 8243 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 O-}fA3#C2c^a1#J>=tgq@ literal 0 HcmV?d00001 diff --git a/undomain/assets/box2.jpeg b/undomain/assets/box2.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..f2638c8f5dcf572b4c966921ec88488662dd2de4 GIT binary patch literal 18050 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 literal 0 HcmV?d00001 diff --git a/undomain/assets/mess.jpeg b/undomain/assets/mess.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..fe7535d186e2f088cc689243440a341b56403753 GIT binary patch literal 47375 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

_gKfeU+p{GHD6qWznKte~JEUkPP>Y!dO8 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 literal 0 HcmV?d00001 diff --git a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart index 34360c1..d3cf435 100644 --- a/undomain/lib/pages/authentication/spalshscreen/spalsh.dart +++ b/undomain/lib/pages/authentication/spalshscreen/spalsh.dart @@ -6,7 +6,8 @@ import 'package:go_router/go_router.dart'; import 'package:page_transition/page_transition.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:undomain/pages/authentication/login/login_screen.dart'; -import 'package:undomain/pages/home/homepage.dart'; +import 'package:undomain/pages/authentication/terms&conditions/terms_and_conditions.dart'; +import 'package:undomain/pages/home/main_screen.dart'; import 'package:undomain/router/router_names.dart'; import 'package:undomain/util/colors/colors.dart'; import 'package:undomain/util/textstyles/text_styles.dart'; @@ -54,7 +55,8 @@ class WrapperScreen extends StatefulWidget { class _WrapperScreenState extends State { bool isLoged = false; - + bool isInitUser = false; + String? userId; @override void initState() { _checkLoginState(); @@ -64,14 +66,19 @@ class _WrapperScreenState extends State { void _checkLoginState() async { SharedPreferences _pref = await SharedPreferences.getInstance(); String? token = _pref.getString("token"); - + userId = _pref.getString("user"); setState(() { isLoged = token != null; + isInitUser = userId == null; }); } @override Widget build(BuildContext context) { - return isLoged ? Homepage() : LoginScreen(); + return isInitUser + ? TermsAndConditions() + : isLoged + ? Homepage() + : LoginScreen(); } } diff --git a/undomain/lib/pages/home/home_screen.dart b/undomain/lib/pages/home/home_screen.dart new file mode 100644 index 0000000..26e2a1a --- /dev/null +++ b/undomain/lib/pages/home/home_screen.dart @@ -0,0 +1,161 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'package:material_floating_search_bar_2/material_floating_search_bar_2.dart'; +import 'package:undomain/services/userservices/userservices.dart'; +import 'package:undomain/util/colors/colors.dart'; +import 'package:undomain/util/global/global_function.dart'; +import 'package:undomain/util/textstyles/text_styles.dart'; + +class HomeScreen extends StatefulWidget { + // final String userId; + const HomeScreen({super.key}); + + @override + State createState() => _HomeScreenState(); +} + +class _HomeScreenState extends State { + String _serchItem = ""; + final FloatingSearchBarController _floatingSearchBarController = + FloatingSearchBarController(); + final Userservices _userservices = Userservices(); + final GlobalFunction _globalFunction = GlobalFunction(); + late Map user; + Uint8List? imagebytes; + String username = ""; + //get device user + Future _getDeviceUser() async { + user = await _userservices.getCurrentUser(); + if (!user["succss"]) { + _globalFunction.snackBarMassage(context, user["massage"], 3); + } else { + setState(() { + username = user["user"]["username"]; + + String base64String = user["user"]["profileUrl"]; + imagebytes = base64Decode(base64String); + }); + } + } + + @override + void initState() { + _getDeviceUser(); + super.initState(); + } + + @override + Widget build(BuildContext context) { + double deviceW = MediaQuery.of(context).size.width; + double deviceH = MediaQuery.of(context).size.height; + double space = (deviceW - 72) / 2; + return SafeArea( + child: Scaffold( + body: Stack( + //fit: StackFit.expand, + children: [ + //background image + Image.asset( + "assets/mess.jpeg", + fit: BoxFit.fill, + height: deviceH * 0.4, + width: double.infinity, + ), + //user name + Positioned( + top: deviceH * 0.03, + left: deviceW * 0.03, + child: Chip( + label: RichText( + text: TextSpan( + children: [ + TextSpan(text: "Welcome ", style: textLabelRed), + TextSpan(text: username, style: textLabel), + ], + ), + ), + autofocus: true, + backgroundColor: utilPrimaryWhite, + labelPadding: EdgeInsets.all(2), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(24), + ), + ), + ), + + //uaer profile picture + Positioned( + top: deviceH * 0.03, + right: deviceW * 0.03, + child: + imagebytes == null + ? CircleAvatar( + backgroundColor: utilPrimaryGrey, + radius: 24, + ) + : CircleAvatar( + backgroundColor: utilPrimaryGrey, + radius: 24, + backgroundImage: MemoryImage(imagebytes!), + ), + ), + //search bar + Positioned( + child: Padding( + padding: EdgeInsets.only(top: deviceH * 0.3), + child: searchBar(context), + ), + ), + ], + ), + ), + ); + } + + Widget searchBar(BuildContext context) { + final isPortrait = + MediaQuery.of(context).orientation == Orientation.portrait; + + return FloatingSearchBar( + hint: "Who you are looking for?", + controller: _floatingSearchBarController, + hintStyle: GoogleFonts.poppins( + color: utilPrimaryGrey, + fontSize: 11, + fontWeight: FontWeight.w500, + ), + scrollPadding: EdgeInsets.all(8), + transitionDuration: Duration(microseconds: 600), + transitionCurve: Curves.easeInOut, + autocorrect: true, + + borderRadius: BorderRadius.circular(24), + textInputAction: TextInputAction.search, + elevation: 2, + automaticallyImplyBackButton: false, + iconColor: utilPrimaryBlack, + leadingActions: [Icon(Icons.search, color: utilPrimaryGrey)], + physics: BouncingScrollPhysics(), + openAxisAlignment: 0, + width: isPortrait ? 500 : 750, + debounceDelay: Duration(microseconds: 400), + onQueryChanged: (query) { + setState(() { + _serchItem = query; + }); + }, + transition: CircularFloatingSearchBarTransition(), + + actions: [], + builder: (context, transition) { + return ClipRRect( + borderRadius: BorderRadius.circular(24), + child: Material(color: utilPrimaryWhite, elevation: 1), + ); + }, + ); + } +} diff --git a/undomain/lib/pages/home/homepage.dart b/undomain/lib/pages/home/homepage.dart deleted file mode 100644 index da9f9a5..0000000 --- a/undomain/lib/pages/home/homepage.dart +++ /dev/null @@ -1,66 +0,0 @@ -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; -import 'package:undomain/util/global/global_varibles.dart'; -import 'package:undomain/util/textstyles/text_styles.dart'; - -class Homepage extends StatefulWidget { - final String? userId; - final String? username; - final String? email; - final Uint8List? prfileUrl; - const Homepage({ - super.key, - - this.userId, - this.username, - this.email, - this.prfileUrl, - }); - - @override - State createState() => _HomepageState(); -} - -class _HomepageState extends State { - late String id; - late String name; - late String email; - - @override - void initState() { - id = widget.userId ?? ""; - name = widget.username ?? ""; - email = widget.email ?? ""; - - super.initState(); - } - - //Uint8List imageBytes = base64Decode() - @override - Widget build(BuildContext context) { - return Scaffold( - body: Padding( - padding: const EdgeInsets.symmetric( - horizontal: authScreenPaddingH, - vertical: authScreenPaddingV, - ), - child: Column( - children: [ - Text("Welcome to Homepage"), - Text(id, style: textBody), - Text(name, style: textBody), - Text(email, style: textBody), - CircleAvatar( - radius: 64, - backgroundImage: - widget.prfileUrl != null - ? MemoryImage(widget.prfileUrl!) - : AssetImage("assets/pic.jpg"), - ), - ], - ), - ), - ); - } -} diff --git a/undomain/lib/pages/home/main_screen.dart b/undomain/lib/pages/home/main_screen.dart new file mode 100644 index 0000000..6bd030c --- /dev/null +++ b/undomain/lib/pages/home/main_screen.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:persistent_bottom_nav_bar/persistent_bottom_nav_bar.dart'; +import 'package:undomain/pages/home/home_screen.dart'; +import 'package:undomain/pages/profile/profile_scren.dart'; +import 'package:undomain/pages/reels/reel_screen.dart'; +import 'package:undomain/pages/streaming/streaming_screen.dart'; +import 'package:undomain/pages/update/update_screen.dart'; +import 'package:undomain/util/colors/colors.dart'; +import 'package:undomain/util/textstyles/text_styles.dart'; + +class Homepage extends StatefulWidget { + // final String userId; + // final String? username; + // final String? email; + // final Uint8List? prfileUrl; + const Homepage({ + super.key, + // required this.userId, + + // this.userId, + // this.username, + // this.email, + // this.prfileUrl, + }); + + @override + State createState() => _HomepageState(); +} + +class _HomepageState extends State { + late PersistentTabController _tabController; + //renderd screens + List _buildScreen() { + return [ + HomeScreen(), + ReelScreen(), + StreamingScreen(), + UpdateScreen(), + ProfileScren(), + ]; + } + + //nav bar items + List _navBarItems() { + return [ + PersistentBottomNavBarItem( + icon: Icon(Icons.home_outlined), + title: "Home", + activeColorPrimary: utilPrimaryRed, + inactiveColorPrimary: utilPrimaryGrey, + ), + PersistentBottomNavBarItem( + icon: Icon(Icons.camera), + title: "Reels", + activeColorPrimary: utilPrimaryRed, + inactiveColorPrimary: utilPrimaryGrey, + ), + PersistentBottomNavBarItem( + icon: Icon(Icons.live_tv), + title: "Live", + activeColorPrimary: utilPrimaryRed, + inactiveColorPrimary: utilPrimaryGrey, + ), + PersistentBottomNavBarItem( + icon: Icon(Icons.update), + title: "Upgrade", + activeColorPrimary: utilPrimaryRed, + inactiveColorPrimary: utilPrimaryGrey, + ), + PersistentBottomNavBarItem( + icon: Icon(Icons.person_2_outlined), + title: "Profile", + textStyle: textLabel, + + activeColorPrimary: utilPrimaryRed, + inactiveColorPrimary: utilPrimaryGrey, + ), + ]; + } + + @override + void initState() { + _tabController = PersistentTabController(initialIndex: 0); + super.initState(); + } + + //Uint8List imageBytes = base64Decode() + @override + Widget build(BuildContext context) { + return PersistentTabView( + context, + screens: _buildScreen(), + controller: _tabController, + items: _navBarItems(), + confineToSafeArea: true, + // backgroundColor: Color.fromARGB(247, 254, 254, 254), + handleAndroidBackButtonPress: true, + resizeToAvoidBottomInset: true, + stateManagement: true, + hideNavigationBarWhenKeyboardAppears: true, + margin: EdgeInsets.symmetric(horizontal: 8, vertical: 8), + decoration: NavBarDecoration( + borderRadius: BorderRadius.circular(24), + colorBehindNavBar: utilPrimaryWhite, + boxShadow: [ + BoxShadow( + color: utilPrimaryGrey.withOpacity(0.5), + offset: Offset(0, 0.5), + spreadRadius: 0, + blurRadius: 1, + ), + ], + ), + popBehaviorOnSelectedNavBarItemPress: PopBehavior.all, + animationSettings: NavBarAnimationSettings( + navBarItemAnimation: ItemAnimationSettings( + duration: Duration(milliseconds: 400), + curve: Curves.ease, + ), + screenTransitionAnimation: ScreenTransitionAnimationSettings( + animateTabTransition: true, + curve: Curves.ease, + duration: Duration(milliseconds: 200), + screenTransitionAnimationType: ScreenTransitionAnimationType.fadeIn, + ), + ), + // navBarStyle: NavBarStyle.style10, + ); + } +} diff --git a/undomain/lib/pages/profile/profile_scren.dart b/undomain/lib/pages/profile/profile_scren.dart new file mode 100644 index 0000000..5584b5d --- /dev/null +++ b/undomain/lib/pages/profile/profile_scren.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class ProfileScren extends StatelessWidget { + const ProfileScren({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(); + } +} \ No newline at end of file diff --git a/undomain/lib/pages/reels/reel_screen.dart b/undomain/lib/pages/reels/reel_screen.dart new file mode 100644 index 0000000..da4baf0 --- /dev/null +++ b/undomain/lib/pages/reels/reel_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class ReelScreen extends StatelessWidget { + const ReelScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(); + } +} \ No newline at end of file diff --git a/undomain/lib/pages/streaming/streaming_screen.dart b/undomain/lib/pages/streaming/streaming_screen.dart new file mode 100644 index 0000000..53e4315 --- /dev/null +++ b/undomain/lib/pages/streaming/streaming_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class StreamingScreen extends StatelessWidget { + const StreamingScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(); + } +} \ No newline at end of file diff --git a/undomain/lib/pages/update/update_screen.dart b/undomain/lib/pages/update/update_screen.dart new file mode 100644 index 0000000..59d446c --- /dev/null +++ b/undomain/lib/pages/update/update_screen.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class UpdateScreen extends StatelessWidget { + const UpdateScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold(); + } +} diff --git a/undomain/lib/pages/wrapper/wrapper_screen.dart b/undomain/lib/pages/wrapper/wrapper_screen.dart deleted file mode 100644 index e7d24ef..0000000 --- a/undomain/lib/pages/wrapper/wrapper_screen.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; - -class WrapperScreen extends StatelessWidget { - const WrapperScreen({super.key}); - - @override - Widget build(BuildContext context) { - return const Placeholder(); - } -} \ No newline at end of file diff --git a/undomain/lib/router/go_router.dart b/undomain/lib/router/go_router.dart index 7211959..82fa70e 100644 --- a/undomain/lib/router/go_router.dart +++ b/undomain/lib/router/go_router.dart @@ -1,7 +1,5 @@ //page routes -import 'dart:typed_data'; - import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:undomain/pages/authentication/email_verification/email_verification.dart'; @@ -11,7 +9,7 @@ import 'package:undomain/pages/authentication/register/register_screen.dart'; import 'package:undomain/pages/authentication/spalshscreen/spalsh.dart'; import 'package:undomain/pages/authentication/terms&conditions/terms_and_conditions.dart'; import 'package:undomain/pages/error/error_page.dart'; -import 'package:undomain/pages/home/homepage.dart'; +import 'package:undomain/pages/home/main_screen.dart'; import 'package:undomain/router/router_names.dart'; class Routes { @@ -74,16 +72,16 @@ class Routes { path: "/home", name: RouterNames.homePage, builder: (context, state) { - String userId = (state.extra as Map)["userId"]; - String username = (state.extra as Map)["username"]; - String email = (state.extra as Map)["email"]; - Uint8List profileUrl = - (state.extra as Map)["profileUrl"]; + // String userId = (state.extra as Map)["userId"]; + // String username = (state.extra as Map)["username"]; + // String email = (state.extra as Map)["email"]; + // Uint8List profileUrl = + // (state.extra as Map)["profileUrl"]; return Homepage( - email: email, - prfileUrl: profileUrl, - userId: userId, - username: username, + // email: email, + // prfileUrl: profileUrl, + // userId: userId, + // username: username, ); }, ), @@ -102,6 +100,14 @@ class Routes { return WrapperScreen(); }, ), + //main screen + // GoRoute( + // path: "/main", + // name: RouterNames.mainScreen, + // builder: (context, state) { + // return Homepage(); + // }, + // ), ], ); } diff --git a/undomain/lib/router/router_names.dart b/undomain/lib/router/router_names.dart index f1822f2..e133fc7 100644 --- a/undomain/lib/router/router_names.dart +++ b/undomain/lib/router/router_names.dart @@ -2,7 +2,7 @@ class RouterNames { static const String loginPage = "login"; static const String registerPage = "register"; static const String verificationPage = "verify"; - static const String homePage = "home"; + static const String homePage = "main"; static const String termsAndConditions = "/terms"; static const String splashScreen = "/"; static const String fogotpasswordScreen = "/fogotpassword"; diff --git a/undomain/lib/services/auth_services/authservices.dart b/undomain/lib/services/auth_services/authservices.dart index 95bba05..e3ebf24 100644 --- a/undomain/lib/services/auth_services/authservices.dart +++ b/undomain/lib/services/auth_services/authservices.dart @@ -5,7 +5,7 @@ import "package:http/http.dart" as http; import "package:shared_preferences/shared_preferences.dart"; class Authservices { - final baseUrl = "http://192.168.28.148:5000/api/auth"; + final baseUrl = "http://192.168.12.148:5000/api/auth"; //register new user Future> register( File profileUrl, { @@ -38,7 +38,10 @@ class Authservices { //store tooken in shared preferences final SharedPreferences preferences = await SharedPreferences.getInstance(); + //set jwt token preferences.setString("token", user["newToken"]); + //set user id + preferences.setString("user", user["user"]["id"]); print(user["newToken"]); return user; } catch (err) { @@ -90,7 +93,10 @@ class Authservices { //store tooken in shared preferences final SharedPreferences preferences = await SharedPreferences.getInstance(); - preferences.setString("token", user["newToken"]); + //save jwt + await preferences.setString("token", user["newToken"]); + //save user id + await preferences.setString("user", user["user"]["id"]); print(user["newToken"]); return user; } catch (err) { diff --git a/undomain/lib/services/userservices/userservices.dart b/undomain/lib/services/userservices/userservices.dart new file mode 100644 index 0000000..1b5c2aa --- /dev/null +++ b/undomain/lib/services/userservices/userservices.dart @@ -0,0 +1,108 @@ +import "dart:convert"; + +import "package:http/http.dart" as http; +import "package:shared_preferences/shared_preferences.dart"; + +class Userservices { + final baseUrl = "http://192.168.12.148:5000/api/user"; + //get jwt token + Future getToken() async { + final pref = await SharedPreferences.getInstance(); + return pref.getString("token"); + } + + //get userid + Future getUserId() async { + final pref = await SharedPreferences.getInstance(); + return pref.getString("user"); + } + + //get current device user details + Future> getCurrentUser() async { + try { + final token = await getToken(); + if (token == null) { + print("token not valid"); + return {"success": false, "massage": "Authenticated token not found"}; + } + final response = await http.get( + Uri.parse("$baseUrl/getcurrentuser"), + + headers: {'Content-Type': 'application/json', 'Authorization': token}, + ); + final user = jsonDecode(response.body); + print(user); + if (response.statusCode == 401) { + print("user getting error $user"); + return user; + } + + return user; + } catch (err) { + print("client side error $err"); + return {"success": false, "massage": "Unexpected error"}; + } + } + + //get all user details(avalible working) + Future>?> getAllUser() async { + try { + final token = await getToken(); + if (token == null) { + return [ + {"success": false, "massage": "Authenticated token not found"}, + ]; + } + final response = await http.get( + Uri.parse("$baseUrl/getalluser"), + + headers: {'Content-Type': 'application/json', 'Authorization': token}, + ); + + final allUsers = jsonDecode(response.body); + if (response.statusCode == 500) { + return [allUsers]; + } + + return allUsers["users"]; + } catch (err) { + print("client side error $err"); + return [ + {"success": false, "massage": "Unexpected error"}, + ]; + } + } + + //get user by usernname + Future>?> getUserByUserName(String username) async { + try { + final token = await getToken(); + if (token == null) { + return [ + {"success": false, "massage": "Authenticated token not found"}, + ]; + } + final response = await http.get( + Uri.parse("$baseUrl/getuserbyusername/$username"), + + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer $token', + }, + ); + final user = jsonDecode(response.body); + if (response.statusCode == 404 || response.statusCode == 500) { + return [user]; + } + if (user["users"].length > 1) { + return user["users"]; + } + return user["users"].toList(); + } catch (err) { + print("client side error $err"); + return [ + {"success": false, "massage": "Unexpected error"}, + ]; + } + } +} diff --git a/undomain/lib/util/colors/colors.dart b/undomain/lib/util/colors/colors.dart index 254bb27..6bacd4a 100644 --- a/undomain/lib/util/colors/colors.dart +++ b/undomain/lib/util/colors/colors.dart @@ -5,3 +5,4 @@ final utilPrimaryRed = Color(0xffCD0000); final utilPrimaryWhite = Color(0xffEDECEC); final utilPrimaryBlack = Color(0xff1E1E1E); final utilPrimaryGrey = Color(0xff676767); +final utilNavBarColor = Color(0xff476810); diff --git a/undomain/lib/util/global/global_varibles.dart b/undomain/lib/util/global/global_varibles.dart index dd768e3..14d050d 100644 --- a/undomain/lib/util/global/global_varibles.dart +++ b/undomain/lib/util/global/global_varibles.dart @@ -1,4 +1,7 @@ const double authScreenPaddingH = 20; const double authScreenPaddingV = 40; const double authButtonRadius = 36; - bool isInitialUser = true; +const double mainPagePaddingH = 10; +const double mainPagePaddingV = 15; + +bool isInitialUser = true; diff --git a/undomain/pubspec.lock b/undomain/pubspec.lock index 50c55b4..9760d1c 100644 --- a/undomain/pubspec.lock +++ b/undomain/pubspec.lock @@ -368,6 +368,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.11.1" + material_floating_search_bar_2: + dependency: "direct main" + description: + name: material_floating_search_bar_2 + sha256: ab0c6d209d9491f98dd4c72f2641d0ba1dd35c87effca1f23d8679bece43add0 + url: "https://pub.dev" + source: hosted + version: "0.5.0" meta: dependency: transitive description: @@ -448,6 +456,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + persistent_bottom_nav_bar: + dependency: "direct main" + description: + name: persistent_bottom_nav_bar + sha256: "6aa9b97ced1abd92c90cedd1997d34ea0b35c3ded762ac6063baccc299b0c4c5" + url: "https://pub.dev" + source: hosted + version: "6.2.1" petitparser: dependency: transitive description: diff --git a/undomain/pubspec.yaml b/undomain/pubspec.yaml index 4918a1d..a946d3d 100644 --- a/undomain/pubspec.yaml +++ b/undomain/pubspec.yaml @@ -43,6 +43,9 @@ dependencies: image_picker: ^1.1.2 http: ^1.3.0 shared_preferences: ^2.5.3 + persistent_bottom_nav_bar: ^6.2.1 + material_floating_search_bar_2: ^0.5.0 + dev_dependencies: flutter_test: