import { useState, useEffect } from 'react'; import useForm from '../../../hooks/useForm'; import { DeleteButton, RightSideWrapper, ZoneSectorAndDeleteButtonWrapper, SaveButton, CancelButton, CloseIcon, ModalContainer, ModalTitle, ModalDescription, ButtonsWrapper, ModalButton, } from './styles'; import ZoneSectorEdit from './ZoneSectorEdit'; import ResponsiblePersonsSectorEdit from './ResponsiblePersonsSectorEdit'; import ParkingSpacesSectorEdit from './ParkingSpacesSectorEdit'; import { IconButton, Fade } from '@mui/material'; import Modal from '@mui/material/Modal'; import Backdrop from '@mui/material/Backdrop'; import useGetData from '../../../hooks/useGetData'; import useDeleteZone from '../../../hooks/useDeleteZone'; import useUpdateZone from '../../../hooks/useUpdateZone'; import AbsoluteLoader from '../../Loaders/AbsoluteLoader'; import { employeesAddData } from './mockData'; const ParkingZoneInfoEdit = ({ zone, setEditMode, setZone }) => { const { deleteZone, isLoading: isLoadingDeleteZone } = useDeleteZone(); const { updateZone, isLoading: isLoadingUpdateZone } = useUpdateZone(); const { data: responsiblePersonsData, isLoading: isLoadingResponsiblePersonsData, } = useGetData({ url: `/vraboten/vrabotenDemo` }); const { data: zoneSectorData, onFormChange: setZoneSectorData } = useForm({ zoneName: zone?.pzName ?? '', hourlyRate: zone?.price ?? 0, from: zone?.from ?? 0, to: zone?.to ?? 0, lat: zone?.parkingZoneLocation?.centre?.lat ?? '', lng: zone?.parkingZoneLocation?.centre?.lng ?? '', }); const [zoneColor, setZoneColor] = useState(zone?.color ?? ''); const [newCoord, setNewCoord] = useState({ newLat: '', newLng: '', }); const [coords, setCoords] = useState( zone?.parkingZoneLocation?.coords ?? [] ); const handleCoordsChange = ({ type, payload }) => { switch (type) { case 'add': const createdCoord = { lat: parseFloat(newCoord.newLat), lng: parseFloat(newCoord.newLng), }; setNewCoord({ newLat: '', newLng: '', }); setCoords([...coords, createdCoord]); return; case 'delete': const updatedDeleteCoords = [...coords]; updatedDeleteCoords.splice(payload.index, 1); setCoords(updatedDeleteCoords); return; case 'update': const updatedCoords = [...coords]; updatedCoords[payload.index] = { ...updatedCoords[payload.index], [payload.column]: parseFloat(payload.value), }; setCoords(updatedCoords); return; default: return; } }; // ResponsiblePersonSectorEdit const [responsiblePersons, setResponsiblePersons] = useState( zone?.responsibleWorkers ?? [] ); const [employeesDataModal, setEmployeesDataModal] = useState([]); const handleEmployeesAndResponsiblePersonsChange = ({ type, person }) => { switch (type) { case 'delete': setResponsiblePersons( responsiblePersons.filter( (p) => p.workerId !== person.workerId ) ); setEmployeesDataModal([...employeesDataModal, person]); return; case 'add': setEmployeesDataModal( employeesDataModal.filter( (emp) => emp.workerId !== person.workerId ) ); setResponsiblePersons([...responsiblePersons, person]); return; default: return; } }; // ParkingSpacesSectorEdit const [parkingSpacesNumber, setParkingSpacesNumber] = useState( zone?.parkingSpaces?.length ?? 0 ); const [newParkingSpace, setNewParkingSpace] = useState({ lat: '', lng: '', psName: '', }); const [parkingSpaces, setParkingSpaces] = useState( zone?.parkingSpaces ?? [] ); const handleParkingSpacesChange = ({ type, payload }) => { switch (type) { case 'add': const createParkingSpace = { lat: parseFloat(newParkingSpace.lat), lng: parseFloat(newParkingSpace.lng), psName: newParkingSpace.psName, }; setNewParkingSpace({ lat: '', lng: '', psName: '', }); setParkingSpaces([...parkingSpaces, createParkingSpace]); setParkingSpacesNumber(parkingSpacesNumber + 1); return; case 'delete': const updatedDeleteParkingSpaces = [...parkingSpaces]; updatedDeleteParkingSpaces.splice(payload.index, 1); setParkingSpaces(updatedDeleteParkingSpaces); setParkingSpacesNumber(parkingSpacesNumber - 1); return; case 'update': const updatedParkingSpaces = [...parkingSpaces]; updatedParkingSpaces[payload.index] = { ...updatedParkingSpaces[payload.index], [payload.column]: payload.column !== 'psName' ? parseFloat(payload.value) : payload.value, }; setParkingSpaces(updatedParkingSpaces); return; default: return; } }; const [modal, setModal] = useState({ open: false, title: '', description: '', btnLeftText: '', btnRightText: '', btnLeftOnClick: null, btnRightOnClick: null, }); const closeModal = () => { setModal({ open: false, title: '', description: '', btnLeftText: '', btnRightText: '', btnLeftOnClick: null, btnRightOnClick: null, }); }; // CANCEL BUTTON MODAL HANDLING const handleCancelLeftClick = () => { setEditMode(false); }; const handleCancel = () => { setModal({ open: true, title: 'Несочувани Измени', description: 'Изменетите податоците нема да бидат сочувани. Дали сакате да ги зачувате?', btnLeftText: 'НЕ', btnRightText: 'ДА', btnLeftOnClick: handleCancelLeftClick, btnRightOnClick: handleSaveChangesRightClick, }); }; // SAVE CHANGES BUTTON MODAL HANDLING const handleSaveChangesRightClick = () => { const editedZoneN = { ...zone, pzName: zoneSectorData.zoneName, price: zoneSectorData.hourlyRate, from: zoneSectorData.from, to: zoneSectorData.to, color: zoneColor, parkingZoneLocation: { centre: { lat: zoneSectorData.lat, lng: zoneSectorData.lng, }, coords: coords, }, parkingSpaces: parkingSpaces, responsibleWorkers: responsiblePersons ?? [], }; console.log(`The new data is saved:`, editedZoneN); updateZone({ zone: editedZoneN, setEditMode, setZone, setModal }); }; const handleSaveChanges = () => { setModal({ open: true, title: 'Зачувување Измени', description: 'Дали сте сигурни дека сакате да ги сочувате измените?', btnLeftText: 'НЕ', btnRightText: 'ДА', btnLeftOnClick: closeModal, btnRightOnClick: handleSaveChangesRightClick, }); }; // DELETE ZONE BUTTON MODAL HANDLING const handleDeleteZoneRightClick = () => { deleteZone({ id: zone.pzId }); }; const handleDeleteZone = () => { setModal({ open: true, title: 'Бришење на Зона', description: 'Дали сте сигурни дека сакате да ја избришете зоната?', btnLeftText: 'НЕ', btnRightText: 'ДА', btnLeftOnClick: closeModal, btnRightOnClick: handleDeleteZoneRightClick, }); }; useEffect(() => { if (responsiblePersonsData) { setEmployeesDataModal(() => { const responsiblePersonsId = zone && zone?.responsibleWorkers.map((p) => p.workerId); const filteredEmployees = responsiblePersonsData.filter( (emp) => !responsiblePersonsId.includes(emp.workerId) ); return filteredEmployees; }); } }, [responsiblePersonsData ]); return ( <> {modal.title} {isLoadingDeleteZone || isLoadingUpdateZone ? ( ) : ( <> {modal.description} {modal.btnLeftText} {modal.btnRightText} )} Избриши Зона Зачувај Промени Откажи ); }; export default ParkingZoneInfoEdit;