all repos — caroster @ d2e622c85d686fafcb7ba38d2d47b959f085de8c

[Octree] Group carpool to your event https://caroster.io

feat: :sparkles: Hide/show map on travels view

#551
Tim Izzo tim@5ika.ch
Mon, 09 Dec 2024 14:51:49 +0100
commit

d2e622c85d686fafcb7ba38d2d47b959f085de8c

parent

91f723692697b7ff44b49705b0717b29dddc75c8

M frontend/containers/Map/MapWrapper.tsxfrontend/containers/Map/MapWrapper.tsx

@@ -11,7 +11,7 @@ <ThemeProvider theme={theme}>

<Box id="map" width="100%" - height={mobile ? '40vh' : '50vh'} + height={mobile ? '60vh' : '50vh'} sx={{position: 'relative'}} > {children}
M frontend/containers/Map/SearchField.tsxfrontend/containers/Map/SearchField.tsx

@@ -1,7 +1,7 @@

-import {Icon, InputAdornment, TextField} from '@mui/material'; +import {Icon, InputAdornment} from '@mui/material'; import {useTranslation} from 'react-i18next'; import PlaceInput from '../PlaceInput'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; type Props = {};
M frontend/containers/PlaceInput/index.tsxfrontend/containers/PlaceInput/index.tsx

@@ -110,7 +110,7 @@ return (

<Autocomplete freeSolo autoComplete - getOptionLabel={option => option?.place_name} + getOptionLabel={option => option?.place_name || ''} options={options} defaultValue={previousOption} filterOptions={x => x}

@@ -130,8 +130,10 @@ formHelperText: {

sx: {color: 'warning.main'}, }, input: { + style: {paddingRight: 0}, ...params.InputProps, ...(textFieldProps?.slotProps?.input || { + paddingRight: 0, endAdornment: ( <InputAdornment position="end" sx={{mr: -0.5}}> <PlaceOutlinedIcon />

@@ -149,7 +151,7 @@

return ( <ListItem key={key || option.id || 'text'} {...props}> <ListItemText - primary={option.place_name} + primary={option?.place_name || ''} secondary={!option.center && t`placeInput.item.noCoordinates`} secondaryTypographyProps={{ color: option.center ? 'inherit' : 'warning.main',
M frontend/containers/TravelColumns/FilterByDate.tsxfrontend/containers/TravelColumns/FilterByDate.tsx

@@ -8,7 +8,7 @@ Menu,

MenuItem, } from '@mui/material'; import {type Moment} from 'moment'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; interface FilterByDateProps { dates: Moment[];
M frontend/containers/TravelColumns/index.tsxfrontend/containers/TravelColumns/index.tsx

@@ -1,4 +1,4 @@

-import {useMemo, useState} from 'react'; +import {useMemo, useReducer, useState} from 'react'; import Masonry from '@mui/lab/Masonry'; import Box from '@mui/material/Box'; import moment from 'moment';

@@ -21,7 +21,7 @@ import useDisplayTravels from './useDisplayTravels';

import useDisplayMarkers from './useDisplayMarkers'; import FilterByDate from './FilterByDate'; import {Button, Icon} from '@mui/material'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; interface Props { showTravelModal: () => void;

@@ -40,6 +40,7 @@ userPermissions: {canAddTravel},

} = usePermissions(); const [selectedTravel, setSelectedTravel] = useState<TravelEntity>(); + const [mapEnabled, toggleMap] = useReducer(i => !i, true); const datesFilters = useTravelsStore(s => s.datesFilter); const {addPassenger} = usePassengersActions(); const {displayedTravels} = useDisplayTravels();

@@ -72,12 +73,13 @@ };

const isCarosterPlus = event?.enabled_modules?.includes('caroster-plus'); - const showMap = + const haveGeopoints = (!!event?.latitude && !!event?.longitude) || travels?.some( ({attributes: {meeting_latitude, meeting_longitude}}) => meeting_latitude && meeting_longitude ); + const showMap = mapEnabled && haveGeopoints; if (!event || travels?.length === 0) return (

@@ -100,7 +102,15 @@

return ( <> {showMap && <Map />} - <Box px={3} py={2} display="flex" gap={2} maxWidth="100%" flexWrap="wrap"> + <Box + px={3} + pb={2} + pt={showMap ? 2 : 10} + display="flex" + gap={2} + maxWidth="100%" + flexWrap="wrap" + > <FilterByDate dates={dates} buttonFilterContent={buttonFilterContent} /> {canAddTravel() && ( <Button

@@ -114,10 +124,19 @@ >

{t('travel.creation.title')} </Button> )} + {haveGeopoints && ( + <Button + sx={{width: {xs: 1, sm: 'auto'}}} + onClick={toggleMap} + startIcon={<Icon>{mapEnabled ? 'visibility_off' : 'map'}</Icon>} + > + {mapEnabled ? t`travel.hideMap` : t`travel.showMap`} + </Button> + )} </Box> <Box p={0} - pt={showMap ? 0 : 13} + pt={showMap ? 0 : 3} pb={11} sx={{ overflowX: 'hidden',
M frontend/containers/TravelColumns/useDisplayMarkers.tsxfrontend/containers/TravelColumns/useDisplayMarkers.tsx

@@ -3,7 +3,7 @@ import {useEffect, useMemo} from 'react';

import useMapStore from '../../stores/useMapStore'; import dynamic from 'next/dynamic'; import {Event} from '../../generated/graphql'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; import {calculateHaversineDistance} from '../../lib/geography'; const EventMarker = dynamic(() => import('../Markers/EventMarker'), {

@@ -79,10 +79,6 @@ // Set bounds

useEffect(() => { let bounds = []; - // Set event bounds - const {latitude, longitude} = event || {}; - if (latitude && longitude) bounds.push([latitude, longitude]); - if (meetingFilter?.latitude && meetingFilter?.longitude) { bounds.push([meetingFilter.latitude, meetingFilter.longitude]);

@@ -106,6 +102,9 @@ travel.attributes.meeting_longitude,

]); bounds.push(...travelCoords); } else { + // Set event bounds + const {latitude, longitude} = event || {}; + if (latitude && longitude) bounds.push([latitude, longitude]); // Set travels bounds const travelCoords = travelsWithGeoloc.map(travel => [ travel.attributes.meeting_latitude,
M frontend/containers/TravelColumns/useDisplayTravels.tsxfrontend/containers/TravelColumns/useDisplayTravels.tsx

@@ -2,7 +2,7 @@ import useEventStore from '../../stores/useEventStore';

import {TravelEntity} from '../../generated/graphql'; import useProfile from '../../hooks/useProfile'; import moment from 'moment'; -import useTravelsStore from '../../stores/travelsStore'; +import useTravelsStore from '../../stores/useTravelsStore'; import {useMemo} from 'react'; import {calculateHaversineDistance} from '../../lib/geography';
M frontend/locales/en.jsonfrontend/locales/en.json

@@ -310,5 +310,7 @@ "travel.vehicle.add": "Add a new vehicle",

"travel.vehicle.empty": "There is no vehicle assigned to you. Click the button bellow in order to create one.", "travel.vehicle.name": "Name of the vehicle", "travel.vehicle.seats_number": "Seats number", - "travel.vehicle.title": "My Vehicles" + "travel.vehicle.title": "My Vehicles", + "travel.showMap": "Show map", + "travel.hideMap": "Hide map" }
M frontend/locales/fr.jsonfrontend/locales/fr.json

@@ -309,5 +309,7 @@ "travel.vehicle.add": "Ajouter un nouveau véhicule",

"travel.vehicle.empty": "Vous n'avez aucun véhicule assigné. Utilisez le bouton ci-dessous pour en créer un.", "travel.vehicle.name": "Nom du véhicule", "travel.vehicle.seats_number": "Nombre de places", - "travel.vehicle.title": "Mes véhicules" + "travel.vehicle.title": "Mes véhicules", + "travel.showMap": "Afficher la carte", + "travel.hideMap": "Masquer la carte" }