From acaa9f046c646e7beba5544ba6a9bb26ecb0056f Mon Sep 17 00:00:00 2001 From: venbaittech Date: Thu, 14 Nov 2024 10:15:20 +0530 Subject: [PATCH] register functionality added --- .../services/pocketbase_service.dart | 2 +- lib/presentation/Screens/profilepage.dart | 62 ++++----- lib/presentation/Screens/registration.dart | 131 +++++++++++++----- 3 files changed, 130 insertions(+), 65 deletions(-) diff --git a/lib/infrastructure/services/pocketbase_service.dart b/lib/infrastructure/services/pocketbase_service.dart index 02d70cb0..20fb6ace 100644 --- a/lib/infrastructure/services/pocketbase_service.dart +++ b/lib/infrastructure/services/pocketbase_service.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'package:pocketbase/pocketbase.dart'; abstract class PocketBaseService { - static const _host = 'https://pocket.fcsc.gov.ae'; + static const _host = 'https://pb.venbait.in'; // static const _host = 'http://127.0.0.1:8090'; static final _pb = PocketBase(_host); static final users = _pb.collection('users'); diff --git a/lib/presentation/Screens/profilepage.dart b/lib/presentation/Screens/profilepage.dart index f39ca581..26e3a013 100644 --- a/lib/presentation/Screens/profilepage.dart +++ b/lib/presentation/Screens/profilepage.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'package:image_picker/image_picker.dart'; import 'package:intl/intl.dart'; @@ -11,6 +12,9 @@ import 'package:pocketbase/pocketbase.dart'; import 'changepassword.dart'; class ProfileScreen extends StatefulWidget { + final String userId; // Add this field to hold the user ID + + const ProfileScreen({Key? key, required this.userId}) : super(key: key); @override State createState() => _ProfileScreenState(); } @@ -42,10 +46,12 @@ class _ProfileScreenState extends State { // Regular expression to validate Full Name (no special characters) final RegExp _nameRegExp = RegExp(r"^[a-zA-Z\s]+$"); + late Future userDetails; @override void initState() { super.initState(); + print(widget.userId); _fetchUserData(); // Call the function to fetch user data } @@ -56,32 +62,24 @@ class _ProfileScreenState extends State { super.dispose(); } - void _fetchUserData() async { + Future _fetchUserData() async { try { - final userId = 'tsgehyvgy6owypj'; final adminAuth = await _pb.admins .authWithPassword('pb@venbainfotech.com', 'pb@venbainfotech.com'); final adminToken = adminAuth.token; - final response = await http.get( - Uri.parse( - 'https://pb.venbait.in/api/collections/users/records/$userId'), + final userDetailsResponse = await _pb.collection('users').getOne( + widget.userId, headers: { - 'Authorization': 'Bearer $adminToken', // Add token to header - 'Content-Type': 'application/json', + 'Authorization': 'Bearer $adminToken', }, ); - - if (response.statusCode == 200) { - final data = jsonDecode(response.body); - setState(() { - _usernameController.text = data['username']; - _emailController.text = data['email']; - }); - } else { - print('Failed to fetch user data: ${response.body}'); - } - } catch (error) { - print('Failed to fetch user data: $error'); + print('userDetails: $userDetailsResponse'); + setState(() { + _usernameController.text = userDetailsResponse.data['username'] ?? ''; + _emailController.text = userDetailsResponse.data['email'] ?? ''; + }); + } catch (e) { + print('Error fetching user details: $e'); } } @@ -160,7 +158,7 @@ class _ProfileScreenState extends State { if (result == true) { if (_formKey.currentState?.validate() ?? false) { try { - String userID = 'tsgehyvgy6owypj'; + String userID = widget.userId; // Retrieve data from text fields and other inputs String fullName = _fullNameController.text; // String username = 'users55538'; @@ -208,7 +206,7 @@ class _ProfileScreenState extends State { if (response.statusCode == 200) { print(response.statusCode); _resetFormFields(); - Navigator.pushNamed(context, 'home'); + // Navigator.pushNamed(context, 'home'); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("Profile updated successfully!"))); } else { @@ -379,7 +377,10 @@ class _ProfileScreenState extends State { border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), ), + counterText: '', ), + maxLength: 40, // Set the maximum length to 20 characters + maxLengthEnforcement: MaxLengthEnforcement.enforced, ), SizedBox(height: 10), Row( @@ -526,7 +527,6 @@ class _ProfileScreenState extends State { ), ], ), - SizedBox(height: 20), Center( child: GestureDetector( @@ -548,14 +548,14 @@ class _ProfileScreenState extends State { SizedBox(height: 20), ElevatedButton.icon( onPressed: () { - - if((_formKey.currentState?.validate() ?? false) && (isChecked)){ + if ((_formKey.currentState?.validate() ?? false) && + (isChecked)) { _formKey.currentState?.save(); showConfirmationDialog(context); - } - else { + } else { setState(() { - showError = !isChecked; // Show error if the checkbox is not checked + showError = + !isChecked; // Show error if the checkbox is not checked }); } // if ((_formKey.currentState?.validate() ?? false) && (isChecked)) { @@ -571,10 +571,10 @@ class _ProfileScreenState extends State { // showError = !isChecked; // Show error if the checkbox is not checked // }); - // ScaffoldMessenger.of(context).showSnackBar( - // SnackBar(content: Text('Please accept the terms and conditions.',style: TextStyle(color: Colors.white),)), - // ); - //} + // ScaffoldMessenger.of(context).showSnackBar( + // SnackBar(content: Text('Please accept the terms and conditions.',style: TextStyle(color: Colors.white),)), + // ); + //} //} }, icon: Icon( diff --git a/lib/presentation/Screens/registration.dart b/lib/presentation/Screens/registration.dart index fea5bcd8..30507d83 100644 --- a/lib/presentation/Screens/registration.dart +++ b/lib/presentation/Screens/registration.dart @@ -1,6 +1,10 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:pocketbase/pocketbase.dart'; import 'package:uae_stat/presentation/Screens/profilepage.dart'; +import '../../infrastructure/services/pocketbase_service.dart'; + class RegisterScreen extends StatefulWidget { @override _RegisterScreenState createState() => _RegisterScreenState(); @@ -8,13 +12,30 @@ class RegisterScreen extends StatefulWidget { class _RegisterScreenState extends State { final _formKey = GlobalKey(); + final _usernameController = TextEditingController(); + final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); bool _obscurePassword = true; bool _obscureConfirmPassword = true; bool isChecked = false; bool showError = false; - String? _password; + final pb = PocketBase('https://pb.venbait.in'); + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + _usernameController.dispose(); + _emailController.dispose(); + _passwordController.dispose(); + super.dispose(); + } + String? _validateUsername(String? value) { if (value == null || value.isEmpty) { return 'Required'; @@ -52,6 +73,53 @@ class _RegisterScreenState extends State { return null; } + Future _registerUser() async { + if (_formKey.currentState?.validate() ?? false) { + if (isChecked) { + try { + // Create user in PocketBase + final response = await pb.collection('users').create(body: { + 'username': _usernameController.text, + 'email': _emailController.text, + 'password': _passwordController.text, + 'passwordConfirm': _passwordController + .text, // PocketBase requires password confirmation + }); + if (response.id != null) { + // Request email verification + PocketBaseService.users.requestVerification(_emailController.text); + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Registration Successed')), + ); + + // Navigate to ProfileScreen after successful registration + Navigator.pushReplacement( + context, + MaterialPageRoute( + builder: (context) => ProfileScreen(userId: response.id)), + ); + } else { + throw Exception('User registration failed: missing user ID'); + } + } catch (e) { + // Handle registration error + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Registration failed: $e')), + ); + } + } else { + setState(() { + showError = true; // Show error if checkbox is not checked + }); + } + } else { + setState(() { + showError = !isChecked; // Show error if the checkbox is not checked + }); + } + } + @override Widget build(BuildContext context) { double screenheight = MediaQuery.of(context).size.height; @@ -75,6 +143,7 @@ class _RegisterScreenState extends State { Text('Please enter your details'), SizedBox(height: 20), TextFormField( + controller: _usernameController, decoration: InputDecoration( hintText: 'Username', prefixIcon: Icon( @@ -82,11 +151,15 @@ class _RegisterScreenState extends State { color: Colors.blue, ), border: OutlineInputBorder(), + counterText: '', ), validator: _validateUsername, + maxLength: 40, // Set the maximum length to 20 characters + maxLengthEnforcement: MaxLengthEnforcement.enforced, ), SizedBox(height: 15), TextFormField( + controller: _emailController, decoration: InputDecoration( hintText: 'Enter your email', prefixIcon: Icon( @@ -99,6 +172,7 @@ class _RegisterScreenState extends State { ), SizedBox(height: 15), TextFormField( + controller: _passwordController, obscureText: _obscurePassword, decoration: InputDecoration( hintText: 'Enter your password', @@ -203,23 +277,12 @@ class _RegisterScreenState extends State { ), SizedBox(height: 20), SizedBox( - width: screenwidth/1.3, + width: screenwidth / 1.3, child: ElevatedButton( - onPressed: () { - if ((_formKey.currentState?.validate() ?? false) && isChecked) { - // Proceed with registration if form is valid and checkbox is checked - Navigator.push( - context, - MaterialPageRoute(builder: (context) => ProfileScreen()), - ); - } else { - setState(() { - showError = !isChecked; // Show error if the checkbox is not checked - }); - } - }, + onPressed: _registerUser, style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFFA7887A), // Brownish color for Register + backgroundColor: + Color(0xFFA7887A), // Brownish color for Register shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), @@ -244,13 +307,14 @@ class _RegisterScreenState extends State { ), SizedBox(height: 10), SizedBox( - width: screenwidth/1.3, + width: screenwidth / 1.3, child: ElevatedButton( onPressed: () { // Add your login logic here }, style: ElevatedButton.styleFrom( - backgroundColor: Color(0xFF82AFCB), // Blueish color for Login + backgroundColor: + Color(0xFF82AFCB), // Blueish color for Login shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), @@ -268,18 +332,22 @@ class _RegisterScreenState extends State { ), ), ), - SizedBox(height: 10,), - Center( - child: Container( - height: screenheight/8, - width: screenwidth/2, - decoration: BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/splash_screen/logo.png"), // Background image asset - fit: BoxFit.fill, - ), - ), - ))], + SizedBox( + height: 10, + ), + Center( + child: Container( + height: screenheight / 8, + width: screenwidth / 2, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + "assets/splash_screen/logo.png"), // Background image asset + fit: BoxFit.fill, + ), + ), + )) + ], ), ), ), @@ -287,6 +355,3 @@ class _RegisterScreenState extends State { ); } } - - -