mirror of
https://github.com/myfatemi04/wheelshare-frontend.git
synced 2025-04-21 11:20:17 -04:00
feat: added marker funcitonality
This commit is contained in:
parent
fd84e41d7c
commit
4042d4038e
|
@ -8,6 +8,11 @@ import { makeAPIPostCall } from '../api/utils';
|
||||||
import AuthenticationContext from './AuthenticationContext';
|
import AuthenticationContext from './AuthenticationContext';
|
||||||
import PoolMap from './PoolMap';
|
import PoolMap from './PoolMap';
|
||||||
|
|
||||||
|
import PlacesAutocomplete, {
|
||||||
|
geocodeByAddress,
|
||||||
|
getLatLng,
|
||||||
|
} from 'react-places-autocomplete';
|
||||||
|
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
const SAMPLE_POOL = {
|
const SAMPLE_POOL = {
|
||||||
id: '123',
|
id: '123',
|
||||||
|
@ -42,7 +47,14 @@ export default function Pool({
|
||||||
triggerUpdate: Function;
|
triggerUpdate: Function;
|
||||||
}) {
|
}) {
|
||||||
const { user } = useContext(AuthenticationContext);
|
const { user } = useContext(AuthenticationContext);
|
||||||
|
const [address, setAddress] = useState('');
|
||||||
|
const handleChange = (address: string) => {
|
||||||
|
setAddress(address);
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSelect = (address: string) => {
|
||||||
|
setAddress(address);
|
||||||
|
};
|
||||||
const commentTextareaRef = useRef<HTMLTextAreaElement>(null);
|
const commentTextareaRef = useRef<HTMLTextAreaElement>(null);
|
||||||
const [commentStatus, setCommentStatus] = useState<
|
const [commentStatus, setCommentStatus] = useState<
|
||||||
null | 'pending' | 'errored'
|
null | 'pending' | 'errored'
|
||||||
|
@ -79,13 +91,78 @@ export default function Pool({
|
||||||
);
|
);
|
||||||
|
|
||||||
const onRegister = useCallback(() => {
|
const onRegister = useCallback(() => {
|
||||||
makeAPIPostCall(`/pools/${pool._id}/join`).then(() => triggerUpdate());
|
makeAPIPostCall(`/pools/${pool._id}/join`)
|
||||||
}, [pool._id, triggerUpdate]);
|
.then(() => geocodeByAddress(address))
|
||||||
|
.then((results) => getLatLng(results[0]))
|
||||||
|
.then(({ lat, lng }) =>
|
||||||
|
makeAPIPostCall(`/addresses`, {
|
||||||
|
pool: pool._id,
|
||||||
|
location: address,
|
||||||
|
lat: lat,
|
||||||
|
lng: lng,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.then(() => triggerUpdate());
|
||||||
|
}, [pool._id, address, triggerUpdate]);
|
||||||
|
|
||||||
const onUnregister = useCallback(() => {
|
const onUnregister = useCallback(() => {
|
||||||
makeAPIPostCall(`/pools/${pool._id}/leave`).then(() => triggerUpdate());
|
makeAPIPostCall(`/pools/${pool._id}/leave`)
|
||||||
|
.then(() =>
|
||||||
|
makeAPIPostCall(`/addresses/remove`, {
|
||||||
|
pool: pool._id,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
.then(() => triggerUpdate());
|
||||||
}, [pool._id, triggerUpdate]);
|
}, [pool._id, triggerUpdate]);
|
||||||
|
|
||||||
|
const mapField = (
|
||||||
|
<div className="form-group">
|
||||||
|
<PlacesAutocomplete
|
||||||
|
value={address}
|
||||||
|
onChange={handleChange}
|
||||||
|
onSelect={handleSelect}
|
||||||
|
>
|
||||||
|
{({ getInputProps, suggestions, getSuggestionItemProps, loading }) => (
|
||||||
|
<div>
|
||||||
|
<label className="" htmlFor="address">
|
||||||
|
Address:
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
name="address"
|
||||||
|
id="address"
|
||||||
|
{...getInputProps({
|
||||||
|
placeholder: 'Search Places ...',
|
||||||
|
className: 'location-search-input form-control',
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
<div className="autocomplete-dropdown-container">
|
||||||
|
{loading && <div>Loading...</div>}
|
||||||
|
{suggestions.map((suggestion) => {
|
||||||
|
const className = suggestion.active
|
||||||
|
? 'suggestion-item--active'
|
||||||
|
: 'suggestion-item';
|
||||||
|
// inline style for demonstration purpose
|
||||||
|
const style = suggestion.active
|
||||||
|
? { backgroundColor: '#fafafa', cursor: 'pointer' }
|
||||||
|
: { backgroundColor: '#ffffff', cursor: 'pointer' };
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
{...getSuggestionItemProps(suggestion, {
|
||||||
|
className,
|
||||||
|
style,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<span>{suggestion.description}</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</PlacesAutocomplete>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card style={{ margin: '3rem auto', padding: '1rem 1rem', width: '50%' }}>
|
<Card style={{ margin: '3rem auto', padding: '1rem 1rem', width: '50%' }}>
|
||||||
{pool && (
|
{pool && (
|
||||||
|
@ -103,6 +180,9 @@ export default function Pool({
|
||||||
<b>End Time</b>: {pool.end_time || '3:30 PM'}
|
<b>End Time</b>: {pool.end_time || '3:30 PM'}
|
||||||
</Typography>
|
</Typography>
|
||||||
<Typography variant="body1">{pool.description}</Typography>
|
<Typography variant="body1">{pool.description}</Typography>
|
||||||
|
{user && pool.participant_ids?.includes(user._id)
|
||||||
|
? undefined
|
||||||
|
: mapField}
|
||||||
{user && (
|
{user && (
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
|
@ -120,7 +200,7 @@ export default function Pool({
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
)}
|
||||||
<hr />
|
<hr />
|
||||||
<PoolMap />
|
<PoolMap pool={pool._id} />
|
||||||
<hr />
|
<hr />
|
||||||
<Textarea
|
<Textarea
|
||||||
cols={80}
|
cols={80}
|
||||||
|
|
|
@ -1,15 +1,29 @@
|
||||||
import GoogleMapReact from 'google-map-react';
|
import GoogleMapReact from 'google-map-react';
|
||||||
|
import { makeAPIGetCall } from '../api/utils';
|
||||||
|
|
||||||
const position = { lat: 39.043758, lng: -77.487442 };
|
const position = { lat: 38.817, lng: -77.1679 };
|
||||||
|
|
||||||
export default function PoolMap() {
|
export default function PoolMap(pool: any) {
|
||||||
const renderMarkers = (map: any, maps: any) => {
|
const renderMarkers = (map: any, maps: any) => {
|
||||||
|
let markers: any[] = [];
|
||||||
|
makeAPIGetCall(`/addresses/pool/${pool.pool}`).then((res) => {
|
||||||
|
if (res.data.data) {
|
||||||
|
res.data.data.forEach((element: any) => {
|
||||||
let marker = new maps.Marker({
|
let marker = new maps.Marker({
|
||||||
position,
|
position: {
|
||||||
|
lat: parseFloat(element.lat),
|
||||||
|
lng: parseFloat(element.lng),
|
||||||
|
},
|
||||||
map,
|
map,
|
||||||
title: 'Hello World!',
|
title: 'Hello World!',
|
||||||
});
|
});
|
||||||
return marker;
|
markers.push(marker);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(markers);
|
||||||
|
return markers;
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
8
src/types.d.ts
vendored
8
src/types.d.ts
vendored
|
@ -48,4 +48,12 @@ declare namespace Carpool {
|
||||||
start_time: string;
|
start_time: string;
|
||||||
end_time: string;
|
end_time: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface Address {
|
||||||
|
user: string;
|
||||||
|
pool: string;
|
||||||
|
location: string;
|
||||||
|
lat: string;
|
||||||
|
lng: string;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user