ubicacion

This commit is contained in:
Juan Felipe Duarte
2023-06-15 18:00:04 -05:00
parent deef3c56f4
commit 743fa56fe7
2 changed files with 275 additions and 143 deletions
+198 -143
View File
@@ -1,3 +1,5 @@
import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:firebase_storage/firebase_storage.dart';
@@ -22,6 +24,7 @@ import 'package:prosappco/src/screens/service_after.dart';
import 'package:prosappco/src/screens/service_type.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:prosappco/src/screens/ubicacion.dart';
class ServiceScreen extends StatefulWidget {
const ServiceScreen({super.key});
@@ -35,6 +38,7 @@ class _ServiceScreenState extends State<ServiceScreen> {
final TextEditingController _locationController = TextEditingController();
String _locationPosition = '';
String ubicacion = '';
final _ubicationController = TextEditingController();
final _profesionalController = TextEditingController();
final _serviceTypeController = TextEditingController();
final _observacionController = TextEditingController();
@@ -204,40 +208,6 @@ class _ServiceScreenState extends State<ServiceScreen> {
return address;
}
void placeAutoComplete(String query) async {
String url = "https://admin.prosapp.co/autocomplete?input=$query";
Uri uri = Uri.parse(url);
// Imprimir la URL completa
print(uri.toString());
try {
http.Response response = await http.get(uri);
if (response.statusCode == 200) {
// Imprimir la respuesta
print(response.body);
} else {
// Manejar otros códigos de estado de respuesta
print("Error: ${response.statusCode}");
}
} catch (error) {
// Manejar errores de conexión o solicitud
print("Error: $error");
}
// Uri uri = Uri.https("admin.prosapp.co", "/autocomplete", {
// "input": query,
// });
// String? response = await NetworkUtility.fetchUrl(uri);
// if (response != null) {
// print(response);
// }
}
@override
Widget build(BuildContext context) {
if (kIsWeb) {
@@ -261,52 +231,203 @@ class _ServiceScreenState extends State<ServiceScreen> {
'Prosapp',
),
),
const SizedBox(width: 8),
TextButton(
style: TextButton.styleFrom(
foregroundColor: Colors.white,
),
onPressed: () {
showDialog(
context: context,
builder: (context) {
return _EnterLocationDialog();
},
);
},
child: const Row(
children: [
Icon(Icons.location_on),
SizedBox(width: 8),
Text('Ingresar mi ubicación'),
SizedBox(width: 4),
Icon(Icons.keyboard_arrow_down_rounded, size: 16),
],
),
),
],
), // Texto del título
),
body: Container(
child: ElevatedButton(
onPressed: () {
placeAutoComplete("Colombia");
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2BA4EC),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: const Size(230, 50),
),
child: const Text(
'Aceptar',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 18,
),
body: Center(
child: Container(
width: 300,
child: Column(
children: [
const SizedBox(height: 20.0),
TextFormField(
controller: _ubicationController,
readOnly: true,
onTap: () async {
final dynamic datos = await Navigator.push(
context,
CupertinoPageRoute(
builder: (BuildContext context) {
return UbicacionScreen();
},
),
);
print(datos);
if (datos != null) {
setState(() {
_ubicationController.text = datos;
print(_ubicationController.text);
});
}
},
decoration: const InputDecoration(
hintText: 'Escribe tu ubicación',
prefixIcon: Icon(Icons.location_on),
),
),
const SizedBox(height: 20.0),
TextFormField(
controller: _profesionalController,
readOnly: true,
onTap: () async {
final dynamic datos = await Navigator.push(
context,
CupertinoPageRoute(
builder: (BuildContext context) {
return ProfessionalScreen(
profession: _serviceTypeController.text,
);
},
),
);
if (datos != null) {
Professional? profesional = datos[0];
ubicacion = datos[1];
if (profesional != null) {
setState(() {
_profesionalController.text =
profesional.name.toString();
// professionalId = profesional.id;
// professionalTarifa = profesional.tarifa ?? 0;
// professionalUbicacion = profesional.ubicacion;
// professionalLatitude = profesional.latitude;
// professionalLongitude = profesional.longitude;
// if (ubicacion == 'sitio') {
// professionalAddress = profesional.realAddress;
// _locationController.text = profesional.realAddress;
// if (professionalLatitude != null &&
// professionalLatitude != 0 &&
// professionalLongitude != null &&
// professionalLongitude != 0) {
// googleMapController.animateCamera(
// CameraUpdate.newCameraPosition(
// CameraPosition(
// target: LatLng(
// professionalLatitude!,
// professionalLongitude!,
// ),
// zoom: 17),
// ),
// );
// }
// }
});
}
}
},
decoration: const InputDecoration(
prefixIcon: Icon(Icons.assignment_ind_rounded),
suffixIcon: Icon(Icons.arrow_drop_down),
hintText: 'Seleccionar profesional'),
),
const SizedBox(height: 20.0),
TextFormField(
onTap: () {
if (_profesionalController.text.isNotEmpty) {
_selectDate(context);
} else {
final snackBar = SnackBar(
backgroundColor: Colors.blue,
content: const Text(
'Selecciona un profesional',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
},
readOnly: true,
decoration: InputDecoration(
prefixIcon: const Icon(Icons.calendar_month),
suffixIcon: _selectedDate == null
? const Icon(Icons.arrow_drop_down)
: null,
hintText: 'Fecha',
),
controller: TextEditingController(
text: _selectedDate == null
? ''
: formatter.format(_selectedDate!)),
),
const SizedBox(height: 20.0),
TextFormField(
onTap: () {
if (_profesionalController.text.isNotEmpty) {
_selectTime(context);
} else {
final snackBar = SnackBar(
backgroundColor: Colors.blue,
content: const Text(
'Selecciona un profesional',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10.0),
),
);
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
},
readOnly: true,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.access_time),
suffixIcon: Icon(Icons.arrow_drop_down),
hintText: 'Hora',
),
controller: TextEditingController(
text: _selectedTime == null
? ''
: ' ${_selectedTime!.format(context)}'),
),
const SizedBox(height: 20.0),
TextFormField(
controller: _observacionController,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.message_outlined),
hintText: 'Observaciones'),
),
const SizedBox(height: 20.0),
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2BA4EC),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: const Size(230, 50),
),
child: const Text(
'Solicitar servicio',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
),
],
),
),
),
@@ -779,69 +900,3 @@ class _ServiceScreenState extends State<ServiceScreen> {
);
}
}
class _EnterLocationDialog extends StatelessWidget {
const _EnterLocationDialog({super.key});
void placeAutoComplete(String query) async {
Uri uri =
Uri.https("maps.googleapis.com", "/maps/api/place/autocomplete/json", {
"input": query,
"key": apiKey,
});
String? response = await NetworkUtility.fetchUrl(uri);
if (response != null) {
print(response);
}
}
@override
Widget build(BuildContext context) {
return AlertDialog(
content: SizedBox(
height: 200,
child: Column(
children: [
const Text(
'Ingresa la ubicación',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
const SizedBox(height: 20),
TextFormField(
decoration: const InputDecoration(
hintText: 'Escribe tu ubicación',
),
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
placeAutoComplete("Dubai");
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2BA4EC),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
elevation: 0,
minimumSize: const Size(230, 50),
),
child: const Text(
'Aceptar',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 18,
),
),
),
],
),
),
);
}
}
+77
View File
@@ -0,0 +1,77 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:prosappco/src/components/network_utility.dart';
import 'package:prosappco/src/components/pop_appbar.dart';
class UbicacionScreen extends StatefulWidget {
const UbicacionScreen({super.key});
@override
State<UbicacionScreen> createState() => _UbicacionScreenState();
}
class _UbicacionScreenState extends State<UbicacionScreen> {
List<dynamic> _placesList = [];
String selectedPlace = '';
void placeAutoComplete(String query) async {
Uri uri = Uri.https("admin.prosapp.co", "/autocomplete", {
"input": query,
});
String? response = await NetworkUtility.fetchUrl(uri);
if (response != null) {
setState(() {
_placesList = jsonDecode(response.toString())['predictions'];
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PopAppbar(
onPressed: () {
Navigator.pop(context);
},
label: 'Tu ubicación'),
body: Center(
child: Container(
width: 300,
child: Column(
children: [
const SizedBox(height: 20.0),
TextFormField(
decoration: const InputDecoration(
hintText: 'Escribe tu ubicación',
prefixIcon: Icon(Icons.location_on),
),
onChanged: (value) {
String modifiedValue = value.replaceAll(' ', '_');
placeAutoComplete(modifiedValue);
},
),
const SizedBox(height: 20.0),
Expanded(
child: ListView.builder(
itemCount: _placesList.length,
itemBuilder: (context, index) {
return ListTile(
onTap: () {
Navigator.pop(
context, _placesList[index]['description']);
},
title: Text(_placesList[index]['description']),
);
},
),
),
],
),
),
),
);
}
}