diff --git a/src/pages/users/publicar.jsx b/src/pages/users/publicar.jsx index f005a3c..f22fe38 100644 --- a/src/pages/users/publicar.jsx +++ b/src/pages/users/publicar.jsx @@ -8,9 +8,18 @@ import TurismoForm from './zturismo.jsx'; import CentrosDeportivosForm from './zcentros.jsx'; import EventosForm from './zeventos.jsx'; import HospedajeForm from './zhospedaje.jsx'; +import CampingForm from './zcamping.jsx'; import GastronomiaForm from './zgastronomia.jsx'; -import ServiciosForm from './zservicios.jsx'; - +import NegociosForm from './znegocios.jsx'; +import CulturaForm from './zcultura.jsx'; +import TourForm from './ztours.jsx'; +import DeporteForm from './zdeporte.jsx'; +import HolisticoForm from './zholistico.jsx'; +import MascotaForm from './zmascota.jsx'; +import EntretenimientoForm from './zentretenimiento.jsx'; +import OficioForm from './zoficio.jsx'; +import FamiliarForm from './zfamiliar.jsx'; +import Prueba from './zprueba.jsx'; import '../../styles/users/publicar.css'; const steps = ['Tipo de publicación', 'Información', 'Imágenes', 'Publicar y Pagar']; @@ -128,10 +137,34 @@ function Publicar() { ); case 1: - if (selectedType === 'propiedad' || selectedType === 'camping') { - return ; + if(selectedType === 'propiedad') { + return + ; + } else if (selectedType === 'camping') { + return ; } else if (selectedType === 'servicios') { - return ; + if(selectedSubCategory === 'negocios-tiendas') { + return ; + } else if (selectedSubCategory === 'restaurantes-comida') { + return ; + }else if (selectedSubCategory === 'cultura') { + return ; + }else if (selectedSubCategory === 'tours-transporte') { + return ; + }else if (selectedSubCategory === 'tiempo-libre-deporte') { + return ; + }else if (selectedSubCategory === 'entretencion') { + return ; + }else if (selectedSubCategory === 'mundo-holistico') { + return ; + }else if (selectedSubCategory === 'mundo-familiar-salud') { + return ; + } else if (selectedSubCategory === 'mascotas') { + return ; + } else if (selectedSubCategory === 'oficios') { + return ; + } + } else if (selectedType === 'eventos') { return ; } else if (selectedType === 'notificaciones') { diff --git a/src/pages/users/zcamping.jsx b/src/pages/users/zcamping.jsx index a3270d4..b4ff9aa 100644 --- a/src/pages/users/zcamping.jsx +++ b/src/pages/users/zcamping.jsx @@ -1,4 +1,4 @@ -import '../../styles/users/zhospedaje.css'; +import '../../styles/users/zcamping.css'; import { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { @@ -27,16 +27,7 @@ const center = { //-----------new -const subcategories = [ - { label: 'Arriendo', value: 'arriendo' }, - { label: 'Cabaña', value: 'cabaña' }, - { label: 'Departamento', value: 'departamento' }, - { label: 'Casa', value: 'casa' }, - { label: 'Hospedaje', value: 'hospedaje' }, - { label: 'Hotel', value: 'hotel' } -]; - -function HospedajeForm({ onNext }) { +function CampingForm({ onNext }) { //-----------new const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario @@ -88,11 +79,6 @@ function HospedajeForm({ onNext }) { descripcion: '', ubicacion: '', numeroUbicacion: '', - dormitorios: '', - camasSimples: '', - camasDobles: '', - cantidadMinima: '', - cantidadMaxima: '', nombreContacto: '', celularContacto: '', mailContacto: '', @@ -100,9 +86,7 @@ function HospedajeForm({ onNext }) { facebook: '', paginaWeb: '', precioPorNoche: '', - disponible: false, - incluyeDesayuno: false, - incluyeToallasSabanas: false + disponible: false }); const [errors, setErrors] = useState({}); @@ -119,7 +103,6 @@ function HospedajeForm({ onNext }) { const validateForm = () => { const newErrors = {}; - if (!formData.subcategoria) {newErrors.subcategoria = 'Selecciona un tipo de acomodación.';} if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} if (!formData.ubicacion) { @@ -128,12 +111,6 @@ function HospedajeForm({ onNext }) { newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; } - if (!formData.dormitorios) {newErrors.dormitorios = 'Ingresa cantidad de dormitorios.';} - if (!formData.camasSimples) {newErrors.camasSimples = 'Ingresa cantidad de camas simples.';} - if (!formData.camasDobles) {newErrors.camasDobles = 'Ingresa cantidad de camas dobles.';} - if (!formData.cantidadMaxima) {newErrors.cantidadMaxima = 'Ingresa cantidad máxima de personas para la acomodación.';} - if (!formData.cantidadMinima) {newErrors.cantidadMinima = 'Ingresa cantidad mínima de personas para la acomodación.';} - if (!formData.celularContacto && !formData.mailContacto) { newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; } else { @@ -155,15 +132,6 @@ function HospedajeForm({ onNext }) { return Object.keys(newErrors).length === 0; }; - //const handleSubmit = (e) => { - // e.preventDefault(); - // if (validateForm()) { - // console.log('Formulario válido, proceder...'); - // handleNext(); - //} else { - // console.log('Errores en el formulario:', errors); - //} - //} const handleSubmit = (event) => { event.preventDefault(); if (validateForm()) { @@ -174,30 +142,12 @@ function HospedajeForm({ onNext }) { } }; - return (
-

Propiedad

+

Camping

Ingresa la información de tu publicación

- - - Tipo de Acomodación - - {errors.subcategoria && {errors.subcategoria} || 'Campo Obligatorio'} - - -
- handleInputChange('cantidadMinima', e.target.value)} - margin="normal" - error={Boolean(errors.cantidadMinima)} - helperText={errors.cantidadMinima|| 'Campo Obligatorio'} - /> - - handleInputChange('cantidadMaxima', e.target.value)} - margin="normal" - error={Boolean(errors.cantidadMaxima)} - helperText={errors.cantidadMaxima|| 'Campo Obligatorio'} - /> -
- -
- handleInputChange('dormitorios', e.target.value)} - error={Boolean(errors.dormitorios)} - helperText={errors.dormitorios|| 'Campo Obligatorio'} - /> - - handleInputChange('camasSimples', e.target.value)} - margin="normal" - error={Boolean(errors.camasSimples)} - helperText={errors.camasSimples|| 'Campo Obligatorio'} - /> - - handleInputChange('camasDobles', e.target.value)} - margin="normal" - error={Boolean(errors.camasDobles)} - helperText={errors.camasDobles|| 'Campo Obligatorio'} - /> -
-
@@ -400,27 +291,6 @@ function HospedajeForm({ onNext }) { label="Actualmente Disponible" /> - handleInputChange('incluyeDesayuno', e.target.checked)} - className='checkboxs-orange' - /> - } - label="Incluye Desayuno" - /> - - handleInputChange('incluyeToallasSabanas', e.target.checked)} - className='checkboxs-orange' - /> - } - label="Incluye Toallas y Sábanas" - />
@@ -430,11 +300,8 @@ function HospedajeForm({ onNext }) { ); } -/*HospedajeForm.propTypes = { - handleNext: PropTypes.func.isRequired, -};*/ -HospedajeForm.propTypes = { +CampingForm.propTypes = { onNext: PropTypes.func.isRequired, }; -export default HospedajeForm; \ No newline at end of file +export default CampingForm; \ No newline at end of file diff --git a/src/pages/users/zservicios.jsx b/src/pages/users/zcultura.jsx similarity index 62% rename from src/pages/users/zservicios.jsx rename to src/pages/users/zcultura.jsx index 910f7f8..16c0666 100644 --- a/src/pages/users/zservicios.jsx +++ b/src/pages/users/zcultura.jsx @@ -1,5 +1,5 @@ import '../../styles/users/zservicios.css'; -import { useState } from 'react'; +import { useState, useEffect } from 'react'; import PropTypes from 'prop-types'; import { TextField, @@ -13,22 +13,71 @@ import { Grid, Typography, } from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; -const subcategories = [ - { label: 'Gasfiter', value: 'gasfiter' }, - { label: 'Talleres Mecánicos', value: 'talleres-mecanicos' }, - { label: 'Gasolineras', value: 'gasolineras' }, - { label: 'Supermercados', value: 'supermercados' }, - { label: 'Restaurantes', value: 'restaurantes' }, - { label: 'Centros Médicos', value: 'centros-medicos' }, - ]; +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function CulturaForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new -function ServiciosForm({ handleNext }) { const [formData, setFormData] = useState({ - subcategoria: '', titulo: '', descripcion: '', ubicacion: '', + numeroUbicacion: '', nombreContacto: '', celularContacto: '', mailContacto: '', @@ -36,15 +85,6 @@ function ServiciosForm({ handleNext }) { facebook: '', paginaWeb: '', disponible: false, - horarios: { - lunes: { inicio: '', fin: '', abierto: false }, - martes: { inicio: '', fin: '', abierto: false }, - miercoles: { inicio: '', fin: '', abierto: false }, - jueves: { inicio: '', fin: '', abierto: false }, - viernes: { inicio: '', fin: '', abierto: false }, - sabado: { inicio: '', fin: '', abierto: false }, - domingo: { inicio: '', fin: '', abierto: false }, - }, }); const [errors, setErrors] = useState({}); @@ -83,7 +123,6 @@ function ServiciosForm({ handleNext }) { const validateForm = () => { const newErrors = {}; - if (!formData.subcategoria) {newErrors.subcategoria = 'Selecciona una tipo de servicio.';} if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} if (!formData.ubicacion) { @@ -104,13 +143,7 @@ function ServiciosForm({ handleNext }) { if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; } - if (formData.disponible) { - Object.keys(formData.horarios).forEach(day => { - if (formData.horarios[day].abierto && (!formData.horarios[day].inicio || !formData.horarios[day].fin)) { - newErrors[`horario_${day}`] = `A los días seleccionados abiertos debes ponerle hora de inicio y fin.`; - } - }); - } + setErrors(newErrors); return Object.keys(newErrors).length === 0; @@ -129,21 +162,8 @@ function ServiciosForm({ handleNext }) { return ( -

Servicios Comunitarios

- - Tipo de Servicio - - {errors.subcategoria && {errors.subcategoria}||'Campo Obligatorio'} - +

Cultura

+

Ingresa la información de tu publicación

+
+ handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + +
+
{errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} +
+
+ +
+
- {formData.disponible && ( - <> -

Horarios de Apertura por Día

- - {Object.keys(formData.horarios).map(day => ( - - handleCheckboxChange(day)} - /> - } - label={`Abierto ${day.charAt(0).toUpperCase() + day.slice(1)}`} - /> - {formData.horarios[day].abierto && ( - <> - handleHorarioChange(day, 'inicio', e.target.value)} - margin="normal" - /> - handleHorarioChange(day, 'fin', e.target.value)} - margin="normal" - /> - {errors[`horario_${day}`] && {errors[`horario_${day}`]}} - - - )} - - ))} - - - )}
+
+ + + + ); +} + +DeporteForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default DeporteForm; diff --git a/src/pages/users/zentretenimiento.jsx b/src/pages/users/zentretenimiento.jsx new file mode 100644 index 0000000..191eb5e --- /dev/null +++ b/src/pages/users/zentretenimiento.jsx @@ -0,0 +1,314 @@ +import '../../styles/users/zservicios.css'; +import { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { + TextField, + MenuItem, + FormControl, + InputLabel, + Select, + Button, + Checkbox, + FormControlLabel, + Grid, + Typography, +} from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; + +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function EntretenimientoForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + const handleHorarioChange = (day, field, value) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + [field]: value + } + } + })); + }; + + const handleCheckboxChange = (day) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + abierto: !prev.horarios[day].abierto + } + } + })); + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( +
+

Entretenimiento

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ + +
+ +
+ + + + ); +} + +EntretenimientoForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default EntretenimientoForm; diff --git a/src/pages/users/zeventos.jsx b/src/pages/users/zeventos.jsx index 74f738a..197c278 100644 --- a/src/pages/users/zeventos.jsx +++ b/src/pages/users/zeventos.jsx @@ -1,12 +1,23 @@ import '../../styles/users/zeventos.css'; -import React, { useState } from 'react'; +import { useState, useEffect } from 'react'; import { TextField, Select, MenuItem, FormControl, InputLabel, Button, Typography } from '@mui/material'; import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; import { DatePicker } from '@mui/x-date-pickers/DatePicker'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import { format } from 'date-fns'; import PropTypes from 'prop-types'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new const subcategories = [ { label: 'Deportivos', value: 'deportivos' }, { label: 'Música', value: 'musica' }, @@ -15,19 +26,63 @@ const subcategories = [ ]; function EventosForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setEventDetails((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setEventDetails(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new const [eventDetails, setEventDetails] = useState({ tipo: '', titulo: '', descripcion: '', ubicacion: '', + numeroUbicacion: '', fechasDisponibles: [], nombreContacto: '', numeroCelular: '', mailContacto: '', instagram: '', facebook: '', - paginaWeb: '', - precio: '' + paginaWeb: '' }); const [errors, setErrors] = useState({}); @@ -92,7 +147,6 @@ function EventosForm({ handleNext }) { } } - if (!eventDetails.precio) newErrors.precio = 'Escribe un precio.'; if (eventDetails.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(eventDetails.paginaWeb)) { newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; @@ -122,6 +176,7 @@ function EventosForm({ handleNext }) { return (

Eventos

+

Ingresa la información de tu publicación

Tipo de Evento +
- + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + +
+
{errors.contacto && {errors.contacto}|| 'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} - +
+
+ + +
+ - handleInputChange('abiertoEnFeriados', e.target.checked)} - /> - } - label="Abierto en Feriados" - /> - {formData.disponible && ( - <> -

Horarios de Apertura por Día

- - {Object.keys(formData.horarios).map(day => ( - - handleCheckboxChange(day)} - /> - } - label={`Abierto ${day.charAt(0).toUpperCase() + day.slice(1)}`} - /> - {formData.horarios[day].abierto && ( - <> - handleHorarioChange(day, 'inicio', e.target.value)} - margin="normal" - /> - handleHorarioChange(day, 'fin', e.target.value)} - margin="normal" - /> - {errors[`horario_${day}`] && {errors[`horario_${day}`]}} - - )} - - ))} - - - )} + +
-
+
{ + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + const handleHorarioChange = (day, field, value) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + [field]: value + } + } + })); + }; + + const handleCheckboxChange = (day) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + abierto: !prev.horarios[day].abierto + } + } + })); + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( + +

Mundo Holístico

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ + +
+ +
+ + + + ); +} + +HolisticoForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default HolisticoForm; diff --git a/src/pages/users/zmascota.jsx b/src/pages/users/zmascota.jsx new file mode 100644 index 0000000..213cb76 --- /dev/null +++ b/src/pages/users/zmascota.jsx @@ -0,0 +1,314 @@ +import '../../styles/users/zservicios.css'; +import { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { + TextField, + MenuItem, + FormControl, + InputLabel, + Select, + Button, + Checkbox, + FormControlLabel, + Grid, + Typography, +} from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; + +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function MascotaForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + const handleHorarioChange = (day, field, value) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + [field]: value + } + } + })); + }; + + const handleCheckboxChange = (day) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + abierto: !prev.horarios[day].abierto + } + } + })); + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( +
+

Mascotas

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ + +
+ +
+ + + + ); +} + +MascotaForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default MascotaForm; diff --git a/src/pages/users/znegocios.jsx b/src/pages/users/znegocios.jsx new file mode 100644 index 0000000..aa11fde --- /dev/null +++ b/src/pages/users/znegocios.jsx @@ -0,0 +1,308 @@ +import '../../styles/users/zservicios.css'; +import { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { + TextField, + Button, + Checkbox, + FormControlLabel, + Grid, + Typography, +} from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; + +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function NegociosForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + const handleHorarioChange = (day, field, value) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + [field]: value + } + } + })); + }; + + const handleCheckboxChange = (day) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + abierto: !prev.horarios[day].abierto + } + } + })); + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( +
+

Negocios y Tiendas

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ +
+ +
+ + + + ); +} + +NegociosForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default NegociosForm; diff --git a/src/pages/users/zoficio.jsx b/src/pages/users/zoficio.jsx new file mode 100644 index 0000000..9c4b3a5 --- /dev/null +++ b/src/pages/users/zoficio.jsx @@ -0,0 +1,313 @@ +import '../../styles/users/zservicios.css'; +import { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { + TextField, + MenuItem, + FormControl, + InputLabel, + Select, + Button, + Checkbox, + FormControlLabel, + Grid, + Typography, +} from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; + +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function OficioForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + const handleHorarioChange = (day, field, value) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + [field]: value + } + } + })); + }; + + const handleCheckboxChange = (day) => { + setFormData(prev => ({ + ...prev, + horarios: { + ...prev.horarios, + [day]: { + ...prev.horarios[day], + abierto: !prev.horarios[day].abierto + } + } + })); + }; + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( +
+

Oficios

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ + +
+ +
+ + + + ); +} + +OficioForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default OficioForm; diff --git a/src/pages/users/ztours.jsx b/src/pages/users/ztours.jsx new file mode 100644 index 0000000..f994aec --- /dev/null +++ b/src/pages/users/ztours.jsx @@ -0,0 +1,284 @@ +import '../../styles/users/zservicios.css'; +import { useState, useEffect } from 'react'; +import PropTypes from 'prop-types'; +import { + TextField, + Button, + Checkbox, + FormControlLabel, + Typography, +} from '@mui/material'; +//------------new +import { GoogleMap, LoadScript, Marker } from '@react-google-maps/api'; // Importar componentes de Google Maps +const mapContainerStyle = { + height: "400px", + width: "100%" +}; + +const center = { + lat: -33.4489, // Cambia esto a la latitud de tu ubicación inicial + lng: -70.6693 // Cambia esto a la longitud de tu ubicación inicial +}; +//-----------new + + +function TourForm({ handleNext }) { + //-----------new + const [markerPosition, setMarkerPosition] = useState(center); // Estado para la posición del marcador + const [userLocation, setUserLocation] = useState(null); // Estado para la ubicación del usuario + + const handleMapClick = async (event) => { + const lat = event.latLng.lat(); + const lng = event.latLng.lng(); + setMarkerPosition({ lat, lng }); // Actualiza la posición del marcador + // Aquí puedes agregar lógica para convertir las coordenadas en una dirección si lo deseas + //const address = await getAddressFromLatLng(lat, lng); //new + setFormData((prev) => ({ ...prev, ubicacion: `Lat: ${lat}, Lng: ${lng}` })); // Actualiza el campo de ubicación + }; + + useEffect(() => { + // Obtener ubicación actual del usuario + if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(position => { + const newLocation = { + lat: position.coords.latitude, + lng: position.coords.longitude, + }; + setUserLocation(newLocation); + setMarkerPosition(newLocation); + //setFormData(prev => ({ ...prev, ubicacion: address })); //new + setFormData(prev => ({ ...prev, ubicacion: `Lat: ${position.coords.latitude}, Lng: ${position.coords.longitude}` })); + }, () => { + alert("No se pudo obtener la ubicación."); + }); + } else { + alert("Geolocalización no es soportada en este navegador."); + } + }, []); + + /*const getAddressFromLatLng = async (lat, lng) => { + const apiKey = "AIzaSyAJuzF9SX5VP6CU38hq-lgRopJ66jYgb5E"; // Reemplaza con tu API key + const response = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${apiKey}`); + const data = await response.json(); + if (data.results && data.results.length > 0) { + return data.results[0].formatted_address; // Retorna la primera dirección formateada + } else { + return ''; // Retorna vacío si no se encuentra dirección + } + };*/ + //-----------new + + const [formData, setFormData] = useState({ + titulo: '', + descripcion: '', + ubicacion: '', + numeroUbicacion: '', + nombreContacto: '', + celularContacto: '', + mailContacto: '', + instagram: '', + facebook: '', + paginaWeb: '', + abiertoEnFeriados: false, + disponible: false, + }); + + const [errors, setErrors] = useState({}); + + const handleInputChange = (field, value) => { + setFormData(prev => ({ ...prev, [field]: value })); + setErrors(prev => ({ ...prev, [field]: '' })); // Reset error when value changes + }; + + + const validateForm = () => { + const newErrors = {}; + + if (!formData.titulo) {newErrors.titulo = 'Escribe un título.';} + if (!formData.descripcion) {newErrors.descripcion = 'Escribe una descripción.';} + if (!formData.ubicacion) { + newErrors.ubicacion = 'Escribe una ubicación (Ej: Calle 123, Comuna, Ciudad).'; + } else if (!/^[\w\s,.-]+$/.test(formData.ubicacion)) { // Simple regex for address format + newErrors.ubicacion = 'Debes seguir el formato de dirección: Calle 123, Comuna, Ciudad.'; + } + if (!formData.celularContacto && !formData.mailContacto) { + newErrors.contacto = 'Debes incluir al menos el número de celular de contacto o el mail de contacto.'; + } else { + if (formData.celularContacto && !/^\d+$/.test(formData.celularContacto)) { // Validar que solo incluya números + newErrors.celularContacto = 'El número de celular debe contener solo números. Ej: 9 8765 4321.'; + } + if (formData.mailContacto && !/^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.mailContacto)) { // Simple regex for email + newErrors.mailContacto = 'Escribir el email en su debido formato. Ej: usuario@dominio.com'; + } + } + if (formData.paginaWeb && !/^(https?:\/\/)?([\w\-]+\.)+[\w\-]{2,4}(\/[\w\-\.]*)*$/.test(formData.paginaWeb)) { + newErrors.paginaWeb = 'Debes escribir en el formato indicado de página web. Ej: https://www.ejemplo.com'; + } + + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleSubmit = (e) => { + e.preventDefault(); + if (validateForm()) { + console.log('Formulario válido, proceder...'); + handleNext(); + } else { + console.log('Errores en el formulario:', errors); + } + }; + + + return ( +
+

Tours y Transporte

+

Ingresa la información de tu publicación

+ + handleInputChange('titulo', e.target.value)} + error={Boolean(errors.titulo)} + helperText={errors.titulo||'Campo Obligatorio'} + /> + handleInputChange('descripcion', e.target.value)} + error={Boolean(errors.descripcion)} + helperText={errors.descripcion||'Campo Obligatorio'} + /> +
+ handleInputChange('ubicacion', e.target.value)} + error={Boolean(errors.ubicacion)} + helperText={errors.ubicacion||'Campo Obligatorio'} + /> + handleInputChange('ubicacion', e.target.value)} + margin="normal" + /> +
+ + {/* Reemplaza con tu API key */} + + {/* Muestra un marcador en la posición seleccionada */} + + + + +
+ handleInputChange('nombreContacto', e.target.value)} + /> + handleInputChange('celularContacto', e.target.value)} + type = "number" + error={Boolean(errors.celularContacto)} + helperText={errors.celularContacto} + /> + + handleInputChange('mailContacto', e.target.value)} + error={Boolean(errors.mailContacto)} + helperText={errors.mailContacto} + /> +
+ + {errors.contacto && {errors.contacto}||'Incluir al menos el número de celular o mail de contacto'} {/* Mensaje de error de contacto */} + +
+ handleInputChange('instagram', e.target.value)} + /> + handleInputChange('facebook', e.target.value)} + /> + handleInputChange('paginaWeb', e.target.value)} + error={Boolean(errors.paginaWeb)} + helperText={errors.paginaWeb} + /> +
+ +
+ + handleInputChange('disponible', e.target.checked)} + /> + } + label="Actualmente Disponible" + /> +
+ + +
+ +
+ + + + ); +} + +TourForm.propTypes = { + handleNext: PropTypes.func.isRequired, + }; +export default TourForm; diff --git a/src/styles/users/zcamping.css b/src/styles/users/zcamping.css new file mode 100644 index 0000000..e174145 --- /dev/null +++ b/src/styles/users/zcamping.css @@ -0,0 +1,38 @@ +html, body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; /* Usar San Francisco */ +} + +.form-container { + width: 60%; + margin: 0 auto; + padding: 20px; + border-radius: 8px; +} + + +.contacto-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.contacto-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} + +.redes-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.redes-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} +.direccion-container { + display: flex; + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} diff --git a/src/styles/users/zeventos.css b/src/styles/users/zeventos.css index 02f6006..ac2a221 100644 --- a/src/styles/users/zeventos.css +++ b/src/styles/users/zeventos.css @@ -17,4 +17,40 @@ html, body { } .submit-button:hover { background-color: #fc7b03; /* Color al pasar el ratón (más oscuro) */ -} \ No newline at end of file +} + + +.form-container { + width: 60%; + margin: 0 auto; + padding: 20px; + border-radius: 8px; +} + + +.contacto-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.contacto-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} + +.redes-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.redes-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} +.direccion-container { + display: flex; + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} diff --git a/src/styles/users/zservicios.css b/src/styles/users/zservicios.css index 992aa39..13ac905 100644 --- a/src/styles/users/zservicios.css +++ b/src/styles/users/zservicios.css @@ -17,4 +17,39 @@ html, body { } .submit-button:hover { background-color: #fc7b03; /* Color al pasar el ratón (más oscuro) */ -} \ No newline at end of file +} + +.form-container { + width: 60%; + margin: 0 auto; + padding: 20px; + border-radius: 8px; +} + + +.contacto-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.contacto-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} + +.redes-container { + display: flex; + justify-content: space-between; /* Espacio igual entre los campos */ + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +} + +.redes-container .MuiTextField-root { + flex: 1; /* Asegura que todos los campos ocupen el mismo espacio */ +} +.direccion-container { + display: flex; + align-items: flex-start; /* Alinea los campos en la parte superior */ + gap: 16px; /* Espacio entre los campos */ +}