This commit is contained in:
Felipe
2023-11-09 11:21:54 -05:00
parent db2f965e4c
commit b3d1740649
51 changed files with 397 additions and 274 deletions
+18 -18
View File
@@ -4,25 +4,25 @@ import 'package:get/get.dart';
import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/providers/user_provider.dart';
import 'package:prosappco/src/screens/calendar.dart'; import 'package:prosappco/src/presentation/screens/calendar.dart';
import 'package:prosappco/src/screens/city.dart'; import 'package:prosappco/src/presentation/screens/city.dart';
import 'package:prosappco/src/screens/login/login.dart'; import 'package:prosappco/src/presentation/screens/login/login.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:prosappco/src/screens/login/login_email.dart'; import 'package:prosappco/src/presentation/screens/login/login_email.dart';
import 'package:prosappco/src/screens/my_services.dart'; import 'package:prosappco/src/presentation/screens/my_services.dart';
import 'package:prosappco/src/screens/my_services_pro.dart'; import 'package:prosappco/src/presentation/screens/my_services_pro.dart';
import 'package:prosappco/src/screens/new_number.dart'; import 'package:prosappco/src/presentation/screens/new_number.dart';
import 'package:prosappco/src/screens/new_password.dart'; import 'package:prosappco/src/presentation/screens/new_password.dart';
import 'package:prosappco/src/screens/profession.dart'; import 'package:prosappco/src/presentation/screens/profession.dart';
import 'package:prosappco/src/screens/professional_profile.dart'; import 'package:prosappco/src/presentation/screens/professional_profile.dart';
import 'package:prosappco/src/screens/professional_revision.dart'; import 'package:prosappco/src/presentation/screens/professional_revision.dart';
import 'package:prosappco/src/screens/profile.dart'; import 'package:prosappco/src/presentation/screens/profile/profile.dart';
import 'package:prosappco/src/screens/profile_pro.dart'; import 'package:prosappco/src/presentation/screens/profile/profile_pro.dart';
import 'package:prosappco/src/screens/register/register.dart'; import 'package:prosappco/src/presentation/screens/register/register.dart';
import 'package:prosappco/src/screens/request_sent.dart'; import 'package:prosappco/src/presentation/screens/request_sent.dart';
import 'package:prosappco/src/screens/reset_password/reset_password.dart'; import 'package:prosappco/src/presentation/screens/reset_password/reset_password.dart';
import 'package:prosappco/src/screens/service.dart'; import 'package:prosappco/src/presentation/screens/service.dart';
import 'package:prosappco/src/screens/solicitudes.dart'; import 'package:prosappco/src/presentation/screens/solicitudes.dart';
import 'package:prosappco/src/services/local_notifications.dart'; import 'package:prosappco/src/services/local_notifications.dart';
import 'firebase_options.dart'; import 'firebase_options.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
@@ -3,8 +3,8 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:google_sign_in/google_sign_in.dart'; import 'package:google_sign_in/google_sign_in.dart';
import 'package:prosappco/src/authentication/exceptions/register_failed.dart'; import 'package:prosappco/src/authentication/exceptions/register_failed.dart';
import 'package:prosappco/src/screens/login/login.dart'; import 'package:prosappco/src/presentation/screens/login/login.dart';
import 'package:prosappco/src/screens/service.dart'; import 'package:prosappco/src/presentation/screens/service.dart';
class AuthenticationRepository extends GetxController { class AuthenticationRepository extends GetxController {
static AuthenticationRepository get instance => Get.find(); static AuthenticationRepository get instance => Get.find();
+11 -11
View File
@@ -6,18 +6,18 @@ import 'package:flutter_rating_bar/flutter_rating_bar.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/photo_view.dart'; import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/calendar.dart'; import 'package:prosappco/src/presentation/screens/calendar.dart';
import 'package:prosappco/src/screens/messages.dart'; import 'package:prosappco/src/presentation/screens/messages.dart';
import 'package:prosappco/src/screens/my_services_pro.dart'; import 'package:prosappco/src/presentation/screens/my_services_pro.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:prosappco/src/screens/profile.dart'; import 'package:prosappco/src/presentation/screens/profile/profile.dart';
import 'package:prosappco/src/screens/profile_pro.dart'; import 'package:prosappco/src/presentation/screens/profile/profile_pro.dart';
import 'package:prosappco/src/screens/profile_pro_web.dart'; import 'package:prosappco/src/presentation/screens/profile/profile_pro_web.dart';
import 'package:prosappco/src/screens/reputacion_pro.dart'; import 'package:prosappco/src/presentation/screens/reputacion_pro.dart';
import 'package:prosappco/src/screens/web_view.dart'; import 'package:prosappco/src/presentation/screens/web_view.dart';
import '../models/scores_model.dart'; import '../models/scores_model.dart';
import '../screens/configuracion.dart'; import '../presentation/screens/configuracion.dart';
import '../screens/support.dart'; import '../presentation/screens/support.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class DrawerProfessional extends StatefulWidget { class DrawerProfessional extends StatefulWidget {
+1 -1
View File
@@ -1,6 +1,6 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/screens/service.dart'; import 'package:prosappco/src/presentation/screens/service.dart';
class OTPController extends GetxController { class OTPController extends GetxController {
static OTPController get instance => Get.find(); static OTPController get instance => Get.find();
+1 -1
View File
@@ -1,6 +1,6 @@
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_storage/firebase_storage.dart'; import 'package:firebase_storage/firebase_storage.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
class UserModel { class UserModel {
final String name; final String name;
@@ -3,7 +3,7 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/screens/web_view.dart'; import 'package:prosappco/src/presentation/screens/web_view.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
class AboutScreen extends StatefulWidget { class AboutScreen extends StatefulWidget {
@@ -6,7 +6,7 @@ import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/components/primary_btn.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/screens/cita.dart'; import 'package:prosappco/src/presentation/screens/cita.dart';
import 'package:table_calendar/table_calendar.dart'; import 'package:table_calendar/table_calendar.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
@@ -10,8 +10,8 @@ import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/chat_model.dart'; import 'package:prosappco/src/models/chat_model.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:prosappco/src/screens/professional_info.dart'; import 'package:prosappco/src/presentation/screens/professional_info.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
class ChatScreen extends StatefulWidget { class ChatScreen extends StatefulWidget {
@@ -13,8 +13,8 @@ import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/chat.dart'; import 'package:prosappco/src/presentation/screens/chat.dart';
import 'package:prosappco/src/screens/score.dart'; import 'package:prosappco/src/presentation/screens/score.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:community_material_icon/community_material_icon.dart'; import 'package:community_material_icon/community_material_icon.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
@@ -4,7 +4,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/screens/about.dart'; import 'package:prosappco/src/presentation/screens/about.dart';
class ConfiguracionScreen extends StatefulWidget { class ConfiguracionScreen extends StatefulWidget {
const ConfiguracionScreen({super.key}); const ConfiguracionScreen({super.key});
@@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/components/primary_btn.dart';
import '../components/schedule_picker.dart'; import '../../components/schedule_picker.dart';
class HorarioScreen extends StatelessWidget { class HorarioScreen extends StatelessWidget {
Map<String, Schedule> horarios; Map<String, Schedule> horarios;
@@ -9,8 +9,8 @@ import 'package:prosappco/src/components/primary_btn.dart';
import 'package:prosappco/src/controllers/phone_auth_controller.dart'; import 'package:prosappco/src/controllers/phone_auth_controller.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/providers/user_provider.dart';
import 'package:prosappco/src/screens/code_validation.dart'; import 'package:prosappco/src/presentation/screens/code_validation.dart';
import 'package:prosappco/src/screens/web_view.dart'; import 'package:prosappco/src/presentation/screens/web_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.dart'; import 'package:responsive_builder/responsive_builder.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@@ -6,7 +6,7 @@ import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/chat_model.dart'; import 'package:prosappco/src/models/chat_model.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/screens/chat.dart'; import 'package:prosappco/src/presentation/screens/chat.dart';
class MessagesScreen extends StatefulWidget { class MessagesScreen extends StatefulWidget {
const MessagesScreen({super.key}); const MessagesScreen({super.key});
@@ -7,7 +7,7 @@ import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/chat_model.dart'; import 'package:prosappco/src/models/chat_model.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/screens/chat.dart'; import 'package:prosappco/src/presentation/screens/chat.dart';
class MessagesUserScreen extends StatefulWidget { class MessagesUserScreen extends StatefulWidget {
const MessagesUserScreen({super.key}); const MessagesUserScreen({super.key});
@@ -8,7 +8,7 @@ import 'package:prosappco/src/components/drawer_professional.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/screens/cita.dart'; import 'package:prosappco/src/presentation/screens/cita.dart';
class MyServicesScreen extends StatelessWidget { class MyServicesScreen extends StatelessWidget {
MyServicesScreen({super.key}); MyServicesScreen({super.key});
@@ -8,7 +8,7 @@ import 'package:prosappco/src/components/drawer_professional.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/screens/cita.dart'; import 'package:prosappco/src/presentation/screens/cita.dart';
class MyServicesProScreen extends StatelessWidget { class MyServicesProScreen extends StatelessWidget {
MyServicesProScreen({super.key}); MyServicesProScreen({super.key});
@@ -11,7 +11,7 @@ class NewNumberValidationScreen extends StatefulWidget {
} }
class _NewNumberValidationScreenState extends State<NewNumberValidationScreen> { class _NewNumberValidationScreenState extends State<NewNumberValidationScreen> {
var otp; dynamic otp;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return SafeArea( return SafeArea(
@@ -4,7 +4,7 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/screens/support.dart'; import 'package:prosappco/src/presentation/screens/support.dart';
final CollectionReference professionsCollection = final CollectionReference professionsCollection =
FirebaseFirestore.instance.collection('professions'); FirebaseFirestore.instance.collection('professions');
@@ -9,8 +9,8 @@ import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/professional_info.dart'; import 'package:prosappco/src/presentation/screens/professional_info.dart';
import '../models/scores_model.dart'; import '../../models/scores_model.dart';
class ProfessionalScreen extends StatefulWidget { class ProfessionalScreen extends StatefulWidget {
final String profession; final String profession;
@@ -5,10 +5,10 @@ import 'package:intl/intl.dart';
import 'package:prosappco/src/components/photo_view.dart'; import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:prosappco/src/screens/reputation.dart'; import 'package:prosappco/src/presentation/screens/reputation.dart';
import '../models/scores_model.dart'; import '../../models/scores_model.dart';
class ProfessionalInfoScreen extends StatefulWidget { class ProfessionalInfoScreen extends StatefulWidget {
Professional professional; Professional professional;
@@ -9,13 +9,14 @@ import 'package:intl/intl.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/controllers/add_name_email_city.dart'; import 'package:prosappco/src/controllers/add_name_email_city.dart';
import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/presentation/widgets/profile/birth_date_picker.dart';
import 'package:prosappco/src/screens/city.dart'; import 'package:prosappco/src/presentation/screens/city.dart';
import 'package:prosappco/src/screens/new_number.dart'; import 'package:prosappco/src/presentation/screens/new_number.dart';
import 'package:prosappco/src/screens/new_password.dart'; import 'package:prosappco/src/presentation/screens/new_password.dart';
import 'package:prosappco/src/services/select_image_profile.dart'; import 'package:prosappco/src/services/select_image_profile.dart';
import 'package:provider/provider.dart'; import 'package:prosappco/src/presentation/widgets/profile/gender_dropdown.dart';
import '../components/photo_view.dart'; import 'package:prosappco/src/presentation/widgets/shared/primary_button.dart';
import '../../../components/photo_view.dart';
class ProfileScreen extends StatefulWidget { class ProfileScreen extends StatefulWidget {
const ProfileScreen({Key? key}) : super(key: key); const ProfileScreen({Key? key}) : super(key: key);
@@ -26,7 +27,7 @@ class ProfileScreen extends StatefulWidget {
class _ProfileScreenState extends State<ProfileScreen> { class _ProfileScreenState extends State<ProfileScreen> {
File? imagen_to_upload; File? imagen_to_upload;
final DateFormat formatter = DateFormat('dd/MM/yyyy');
final uid = AuthenticationRepository.instance.getCurrentUserUid(); final uid = AuthenticationRepository.instance.getCurrentUserUid();
bool _obscureText = true; bool _obscureText = true;
final _formKey = GlobalKey<FormState>(); final _formKey = GlobalKey<FormState>();
@@ -41,6 +42,8 @@ class _ProfileScreenState extends State<ProfileScreen> {
var _ciudad = '...'; var _ciudad = '...';
var _photo = '...'; var _photo = '...';
String? _email = ''; String? _email = '';
String gender = '';
DateTime? birthDate;
@override @override
void initState() { void initState() {
@@ -484,7 +487,6 @@ class _ProfileScreenState extends State<ProfileScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// final userProvider = Provider.of<UserProvider>(context);
String city = _ciudad.toString(); String city = _ciudad.toString();
return Scaffold( return Scaffold(
@@ -503,7 +505,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
_showChoiceDialog(context); _showChoiceDialog(context);
}, },
child: Container( child: Container(
margin: const EdgeInsets.symmetric(vertical: 50), margin: const EdgeInsets.symmetric(vertical: 20),
child: (imagen_to_upload != null) child: (imagen_to_upload != null)
? LocalPhoto(file: imagen_to_upload!) ? LocalPhoto(file: imagen_to_upload!)
: ReferencePhoto(ref: storage.ref().child(_photo))), : ReferencePhoto(ref: storage.ref().child(_photo))),
@@ -512,135 +514,159 @@ class _ProfileScreenState extends State<ProfileScreen> {
width: 300, width: 300,
padding: const EdgeInsets.only(top: 0), padding: const EdgeInsets.only(top: 0),
child: Form( child: Form(
key: _formKey, key: _formKey,
child: Column( child: Column(
children: [ children: [
TextFormField( TextFormField(
controller: _nameController, controller: _nameController,
maxLength: 50, maxLength: 50,
validator: (value) { validator: (value) {
if (value == null || value.isEmpty) { if (value == null || value.isEmpty) {
return 'Porfavor ingrese un nombre.'; return 'Porfavor ingrese un nombre.';
} }
if (value.length < 5) { if (value.length < 5) {
return 'Debe tener al menos 5 caracteres.'; return 'Debe tener al menos 5 caracteres.';
} }
return null; return null;
}, },
decoration: const InputDecoration( decoration: const InputDecoration(
prefixIcon: Icon(Icons.person_outline), prefixIcon: Icon(Icons.person_outline),
hintText: 'Nombre (Obligatorio)'), hintText: 'Nombre (Obligatorio)'),
), ),
const SizedBox(height: 0), const SizedBox(height: 0),
_email != null _email != null
? TextFormField( ? TextFormField(
onTap: () { onTap: () {
_showEmailUpdateDialog(context); _showEmailUpdateDialog(context);
}, },
readOnly: true, readOnly: true,
controller: _emailController, controller: _emailController,
decoration: const InputDecoration( decoration: const InputDecoration(
prefixIcon: Icon(Icons.email_outlined), prefixIcon: Icon(Icons.email_outlined),
hintText: 'Email (Obligatorio)'), hintText: 'Email (Obligatorio)'),
) )
: TextFormField( : TextFormField(
controller: _emailController, controller: _emailController,
validator: (String? value) { validator: (String? value) {
if (value == null || value.isEmpty) { if (value == null || value.isEmpty) {
return 'Por favor ingrese un email'; return 'Por favor ingrese un email';
} }
final RegExp emailRegExp = RegExp( final RegExp emailRegExp =
r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$'); RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
if (!emailRegExp.hasMatch(value)) { if (!emailRegExp.hasMatch(value)) {
return 'Por favor ingrese un email válido'; return 'Por favor ingrese un email válido';
} }
return null; return null;
}, },
decoration: const InputDecoration( decoration: const InputDecoration(
prefixIcon: Icon(Icons.email_outlined), prefixIcon: Icon(Icons.email_outlined),
hintText: 'Email (Obligatorio)'), hintText: 'Email (Obligatorio)'),
), ),
const SizedBox(height: 20.0), const SizedBox(height: 20.0),
_email != null _email != null
? const SizedBox.shrink() ? const SizedBox.shrink()
: TextFormField( : TextFormField(
controller: _passwordController, controller: _passwordController,
obscureText: _obscureText, obscureText: _obscureText,
validator: (value) { validator: (value) {
if (value == null || value.isEmpty) { if (value == null || value.isEmpty) {
return 'Porfavor ingrese una contraseña.'; return 'Porfavor ingrese una contraseña.';
} }
if (value.length < 5) { if (value.length < 5) {
return 'Debe tener al menos 5 caracteres.'; return 'Debe tener al menos 5 caracteres.';
} }
return null; return null;
}, },
decoration: InputDecoration( decoration: InputDecoration(
prefixIcon: const Icon(Icons.lock_outline), prefixIcon: const Icon(Icons.lock_outline),
suffixIcon: IconButton( suffixIcon: IconButton(
icon: Icon( icon: Icon(
_obscureText _obscureText
? Icons.visibility ? Icons.visibility
: Icons.visibility_off, : Icons.visibility_off,
color: Colors.grey, color: Colors.grey,
),
onPressed: () {
setState(() {
_obscureText = !_obscureText;
});
},
), ),
hintText: 'Contraseña (Obligatorio)'), onPressed: () {
), setState(() {
_email != null _obscureText = !_obscureText;
? const SizedBox.shrink() });
: const SizedBox(height: 20.0), },
TextFormField( ),
readOnly: true, hintText: 'Contraseña (Obligatorio)'),
onTap: () async { ),
final String? ciudad = await Navigator.push( _email != null
context, ? const SizedBox.shrink()
CupertinoPageRoute( : const SizedBox(height: 20.0),
builder: (BuildContext context) { TextFormField(
return const CityScreen(); readOnly: true,
}, onTap: () async {
), final String? ciudad = await Navigator.push(
) as String?; context,
CupertinoPageRoute(
builder: (BuildContext context) {
return const CityScreen();
},
),
) as String?;
if (ciudad != null) { if (ciudad != null) {
setState(() { setState(() {
_ciudad = ciudad; _ciudad = ciudad;
}); });
} }
}, },
decoration: InputDecoration( decoration: InputDecoration(
prefixIcon: const Icon(Icons.near_me), prefixIcon: const Icon(Icons.near_me),
suffixIcon: const Icon(Icons.arrow_drop_down), suffixIcon: const Icon(Icons.arrow_drop_down),
hintStyle: city == '' hintStyle: city == ''
? const TextStyle() ? const TextStyle()
: const TextStyle(color: Colors.black87), : const TextStyle(color: Colors.black87),
hintText: city == '' ? 'Ciudad' : city), hintText: city == '' ? 'Ciudad' : city,
), ),
const SizedBox(height: 20.0), ),
TextFormField( const SizedBox(height: 20.0),
controller: _phoneNumberController, TextFormField(
readOnly: true, controller: _phoneNumberController,
onTap: () { readOnly: true,
Navigator.of(context).push( onTap: () {
CupertinoPageRoute( Navigator.of(context).push(
builder: (BuildContext context) { CupertinoPageRoute(
return const NewNumberScreen(); builder: (BuildContext context) {
}, return const NewNumberScreen();
), },
); ),
}, );
decoration: const InputDecoration( },
prefixIcon: Icon(Icons.phone_android), decoration: const InputDecoration(
suffixIcon: Icon(Icons.edit_outlined), prefixIcon: Icon(Icons.phone_android),
hintText: '+57'), suffixIcon: Icon(Icons.edit_outlined),
hintText: '+57',
), ),
], ),
)), const SizedBox(height: 20.0),
GenderDropdown(
onChanged: (selectedGender) {
setState(() {
gender = selectedGender;
});
},
),
const SizedBox(height: 20.0),
BirthDatePicker(
onDateSelected: (birthDay) {
setState(() {
birthDate = birthDay;
});
},
controller: TextEditingController(
text: birthDate == null
? ''
: formatter.format(birthDate!),
),
),
],
),
),
), ),
Container( Container(
alignment: Alignment.bottomCenter, alignment: Alignment.bottomCenter,
@@ -649,7 +675,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
child: Column( child: Column(
children: [ children: [
_email != null _email != null
? ElevatedButton( ? PrimaryButton(
onPressed: () { onPressed: () {
Navigator.push( Navigator.push(
context, context,
@@ -660,47 +686,19 @@ class _ProfileScreenState extends State<ProfileScreen> {
), ),
); );
}, },
style: ElevatedButton.styleFrom( text: 'Cambiar Contraseña',
backgroundColor: const Color(0xFF2BA4EC), minWidth: 300,
shape: RoundedRectangleBorder( minHeight: 45,
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: const Size(300, 45),
),
child: const Text(
'Cambiar Contraseña',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 17,
),
),
) )
: const SizedBox(height: 20), : const SizedBox(height: 20),
const SizedBox(height: 60), const SizedBox(height: 60),
ElevatedButton( PrimaryButton(
onPressed: () async { onPressed: () async {
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
await updateInfo(); await updateInfo();
} }
}, },
style: ElevatedButton.styleFrom( text: 'Guardar',
backgroundColor: const Color(0xFF2BA4EC),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: const Size(200, 50),
),
child: const Text(
'Guardar',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 17,
),
),
), ),
], ],
), ),
@@ -12,9 +12,9 @@ import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/components/primary_btn.dart';
import 'package:prosappco/src/components/schedule_picker.dart'; import 'package:prosappco/src/components/schedule_picker.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/screens/horario.dart'; import 'package:prosappco/src/presentation/screens/horario.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:prosappco/src/screens/professional_direccion.dart'; import 'package:prosappco/src/presentation/screens/professional_direccion.dart';
import 'package:prosappco/src/services/select_image_profile.dart'; import 'package:prosappco/src/services/select_image_profile.dart';
class ProfileProScreen extends StatefulWidget { class ProfileProScreen extends StatefulWidget {
@@ -11,9 +11,9 @@ import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/components/primary_btn.dart'; import 'package:prosappco/src/components/primary_btn.dart';
import 'package:prosappco/src/components/schedule_picker.dart'; import 'package:prosappco/src/components/schedule_picker.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/screens/horario.dart'; import 'package:prosappco/src/presentation/screens/horario.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:prosappco/src/screens/ubicacion.dart'; import 'package:prosappco/src/presentation/screens/ubicacion.dart';
class ProfileProWebScreen extends StatefulWidget { class ProfileProWebScreen extends StatefulWidget {
const ProfileProWebScreen({super.key}); const ProfileProWebScreen({super.key});
@@ -11,9 +11,9 @@ import 'package:image_picker/image_picker.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/photo_view_web.dart'; import 'package:prosappco/src/components/photo_view_web.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/screens/city.dart'; import 'package:prosappco/src/presentation/screens/city.dart';
import 'package:prosappco/src/screens/new_number.dart'; import 'package:prosappco/src/presentation/screens/new_number.dart';
import 'package:prosappco/src/screens/new_password.dart'; import 'package:prosappco/src/presentation/screens/new_password.dart';
import 'package:universal_html/html.dart' as html; import 'package:universal_html/html.dart' as html;
class ProfileWebScreen extends StatefulWidget { class ProfileWebScreen extends StatefulWidget {
@@ -10,8 +10,8 @@ import 'package:prosappco/src/components/primary_btn.dart';
import 'package:prosappco/src/controllers/register_controller.dart'; import 'package:prosappco/src/controllers/register_controller.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/providers/user_provider.dart';
import 'package:prosappco/src/screens/login/login.dart'; import 'package:prosappco/src/presentation/screens/login/login.dart';
import 'package:prosappco/src/screens/web_view.dart'; import 'package:prosappco/src/presentation/screens/web_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:responsive_builder/responsive_builder.dart'; import 'package:responsive_builder/responsive_builder.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
@@ -12,17 +12,17 @@ import 'package:get/get.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:flutter_polyline_points/flutter_polyline_points.dart'; import 'package:flutter_polyline_points/flutter_polyline_points.dart';
import 'package:prosappco/src/authentication/authentication_repository.dart'; import 'package:prosappco/src/authentication/authentication_repository.dart';
import 'package:prosappco/src/components/drawer_menu.dart'; import 'package:prosappco/src/presentation/widgets/shared/drawer_menu.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/professional.dart'; import 'package:prosappco/src/presentation/screens/professional.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:prosappco/src/screens/profile.dart'; import 'package:prosappco/src/presentation/screens/profile/profile.dart';
import 'package:prosappco/src/screens/profile_web.dart'; import 'package:prosappco/src/presentation/screens/profile/profile_web.dart';
import 'package:prosappco/src/screens/service_after.dart'; import 'package:prosappco/src/presentation/screens/service_after.dart';
import 'package:prosappco/src/screens/service_type.dart'; import 'package:prosappco/src/presentation/screens/service_type.dart';
import 'package:prosappco/src/screens/ubicacion.dart'; import 'package:prosappco/src/presentation/screens/ubicacion.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:prosappco/src/components/network_utility.dart'; import 'package:prosappco/src/components/network_utility.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
@@ -62,7 +62,7 @@ class _ServiceScreenState extends State<ServiceScreen> {
// PolylinePoints polylinePoints = PolylinePoints(); // PolylinePoints polylinePoints = PolylinePoints();
// PolylineResult result = await polylinePoints.getRouteBetweenCoordinates( // PolylineResult result = await polylinePoints.getRouteBetweenCoordinates(
// 'AIzaSyBp7vsJvD6oXz0FORBLEeIELwId4a2onHQ', // 'AIzaSyCW_og6qQ8W8G-5_BxIS4sBnl8cLkjL95s',
// PointLatLng(startLat, startLng), // PointLatLng(startLat, startLng),
// PointLatLng(endLat, endLng), // PointLatLng(endLat, endLng),
// ); // );
@@ -738,6 +738,7 @@ class _ServiceScreenState extends State<ServiceScreen> {
height: MediaQuery.of(context).size.height * 0.5, height: MediaQuery.of(context).size.height * 0.5,
child: GoogleMap( child: GoogleMap(
myLocationEnabled: true, myLocationEnabled: true,
myLocationButtonEnabled: false,
mapType: MapType.normal, mapType: MapType.normal,
initialCameraPosition: initialCameraPosition, initialCameraPosition: initialCameraPosition,
markers: markers, markers: markers,
@@ -8,7 +8,7 @@ import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/models/setting_model.dart'; import 'package:prosappco/src/models/setting_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/screens/service.dart'; import 'package:prosappco/src/presentation/screens/service.dart';
class ServiceAfterScreen extends StatefulWidget { class ServiceAfterScreen extends StatefulWidget {
var eventoId; var eventoId;
@@ -1,7 +1,7 @@
import 'package:diacritic/diacritic.dart'; import 'package:diacritic/diacritic.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import 'package:prosappco/src/screens/profession.dart'; import 'package:prosappco/src/presentation/screens/profession.dart';
class ServiceTypeScreen extends StatefulWidget { class ServiceTypeScreen extends StatefulWidget {
const ServiceTypeScreen({super.key}); const ServiceTypeScreen({super.key});
@@ -6,7 +6,7 @@ import 'package:intl/intl.dart';
import 'package:prosappco/src/components/drawer_professional.dart'; import 'package:prosappco/src/components/drawer_professional.dart';
import 'package:prosappco/src/models/event_model.dart'; import 'package:prosappco/src/models/event_model.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/screens/cita.dart'; import 'package:prosappco/src/presentation/screens/cita.dart';
class SolicitudScreen extends StatelessWidget { class SolicitudScreen extends StatelessWidget {
SolicitudScreen({super.key}); SolicitudScreen({super.key});
@@ -3,7 +3,7 @@ import 'dart:convert';
import 'package:prosappco/src/components/network_utility.dart'; import 'package:prosappco/src/components/network_utility.dart';
import 'package:prosappco/src/components/pop_appbar.dart'; import 'package:prosappco/src/components/pop_appbar.dart';
import '../authentication/authentication_repository.dart'; import '../../authentication/authentication_repository.dart';
class UbicacionScreen extends StatefulWidget { class UbicacionScreen extends StatefulWidget {
const UbicacionScreen({super.key}); const UbicacionScreen({super.key});
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
class BirthDatePicker extends StatefulWidget {
final Function(DateTime) onDateSelected;
final TextEditingController controller;
const BirthDatePicker(
{Key? key, required this.onDateSelected, required this.controller})
: super(key: key);
@override
_BirthDatePickerState createState() => _BirthDatePickerState();
}
class _BirthDatePickerState extends State<BirthDatePicker> {
DateTime selectedDate =
DateTime.now().subtract(const Duration(days: 365 * 20));
Future<void> _selectDate(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: selectedDate,
firstDate: DateTime.now().subtract(const Duration(days: 365 * 120)),
lastDate: DateTime.now(),
);
if (picked != null && picked != selectedDate) {
setState(() {
selectedDate = picked;
widget.onDateSelected(selectedDate);
});
}
}
@override
Widget build(BuildContext context) {
return TextFormField(
onTap: () {
_selectDate(context);
},
readOnly: true,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.calendar_month),
suffixIcon: Icon(Icons.arrow_drop_down),
hintText: 'Fecha de nacimiento',
),
controller: widget.controller,
);
}
}
@@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
class GenderDropdown extends StatefulWidget {
final Function(String) onChanged;
const GenderDropdown({Key? key, required this.onChanged}) : super(key: key);
@override
_GenderDropdownState createState() => _GenderDropdownState();
}
class _GenderDropdownState extends State<GenderDropdown> {
String? selectedGender;
@override
Widget build(BuildContext context) {
return InputDecorator(
decoration: const InputDecoration(
border: UnderlineInputBorder(),
prefixIcon: Icon(Icons.people_outline),
contentPadding: EdgeInsets.symmetric(horizontal: 8.0),
),
child: DropdownButtonHideUnderline(
child: DropdownButton<String>(
isExpanded: true,
value: selectedGender,
hint: const Text('Selecciona tu género'),
onChanged: (String? newValue) {
setState(() {
selectedGender = newValue;
widget.onChanged(selectedGender!);
});
},
items: ['Masculino', 'Femenino', 'Otro']
.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
),
);
}
}
@@ -7,14 +7,14 @@ import 'package:prosappco/src/components/photo_view.dart';
import 'package:prosappco/src/models/scores_model.dart'; import 'package:prosappco/src/models/scores_model.dart';
import 'package:prosappco/src/models/user_model.dart'; import 'package:prosappco/src/models/user_model.dart';
import 'package:prosappco/src/providers/user_provider.dart'; import 'package:prosappco/src/providers/user_provider.dart';
import 'package:prosappco/src/screens/configuracion.dart'; import 'package:prosappco/src/presentation/screens/configuracion.dart';
import 'package:prosappco/src/screens/messages_user.dart'; import 'package:prosappco/src/presentation/screens/messages_user.dart';
import 'package:prosappco/src/screens/professional_profile_web.dart'; import 'package:prosappco/src/presentation/screens/professional_profile_web.dart';
import 'package:prosappco/src/screens/profile.dart'; import 'package:prosappco/src/presentation/screens/profile/profile.dart';
import 'package:prosappco/src/screens/profile_web.dart'; import 'package:prosappco/src/presentation/screens/profile/profile_web.dart';
import 'package:prosappco/src/screens/reputation.dart'; import 'package:prosappco/src/presentation/screens/reputation.dart';
import 'package:prosappco/src/screens/support.dart'; import 'package:prosappco/src/presentation/screens/support.dart';
import 'package:prosappco/src/screens/web_view.dart'; import 'package:prosappco/src/presentation/screens/web_view.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -0,0 +1,37 @@
import 'package:flutter/material.dart';
class PrimaryButton extends StatelessWidget {
final VoidCallback onPressed;
final String text;
final double? minWidth;
final double? minHeight;
const PrimaryButton(
{super.key,
required this.onPressed,
required this.text,
this.minWidth = 200,
this.minHeight = 50});
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: onPressed,
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2BA4EC),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: Size(minWidth!, minHeight!),
),
child: Text(
text,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 17,
),
));
}
}
+13 -21
View File
@@ -109,10 +109,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.2" version: "1.17.1"
community_material_icon: community_material_icon:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -737,10 +737,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: intl name: intl
sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" sha256: a3715e3bc90294e971cb7dc063fbf3cd9ee0ebf8604ffeafabd9e6f16abbdbe6
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.18.1" version: "0.18.0"
intl_phone_field: intl_phone_field:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -777,18 +777,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.16" version: "0.12.15"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.5.0" version: "0.2.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
@@ -1022,10 +1022,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.10.0" version: "1.9.1"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
@@ -1078,10 +1078,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.0" version: "0.5.1"
timezone: timezone:
dependency: transitive dependency: transitive
description: description:
@@ -1202,14 +1202,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
web:
dependency: transitive
description:
name: web
sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10
url: "https://pub.dev"
source: hosted
version: "0.1.4-beta"
webview_flutter: webview_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1275,5 +1267,5 @@ packages:
source: hosted source: hosted
version: "3.1.2" version: "3.1.2"
sdks: sdks:
dart: ">=3.1.0-185.0.dev <4.0.0" dart: ">=3.0.0 <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.10.0"