diff --git a/src/components/Event.tsx b/src/components/Event.tsx
index e3ecc69..278339b 100644
--- a/src/components/Event.tsx
+++ b/src/components/Event.tsx
@@ -1,6 +1,7 @@
-import { useEffect, useRef, useState } from 'react';
-import { addEventSignup, removeEventSignup } from './api';
+import { useCallback, useEffect, useRef, useState } from 'react';
+import { addEventSignup, getEventSignups, removeEventSignup } from './api';
import { green, lightgrey } from './colors';
+import { useMe } from './hooks';
import latlongdist, { R_miles } from './latlongdist';
import UIButton from './UIButton';
import UIPlacesAutocomplete from './UIPlacesAutocomplete';
@@ -186,39 +187,39 @@ function Carpools({ event }: { event: IEvent }) {
);
}
-export type IPerson = {
- id: number;
- name: string;
+export type IEventSignup = {
+ user: {
+ id: number;
+ name: number;
+ };
+ placeId: string;
+ formattedAddress: string;
latitude: number;
longitude: number;
};
-const dummyPeopleData: IPerson[] = [
- {
- id: 0,
- name: 'Rushil Umaretiya',
- latitude: 11.1,
- longitude: 10.09,
- },
- {
- id: 1,
- name: 'Nitin Kanchinadam',
- latitude: 11.09,
- longitude: 10.12,
- },
-];
-function People({ event, placeId }: { event: IEvent; placeId: string | null }) {
+function Signups({
+ event,
+ signups,
+ myPlaceId,
+}: {
+ event: IEvent;
+ signups: IEventSignup[];
+ myPlaceId: string | null;
+}) {
const PADDING = '1rem';
- // eslint-disable-next-line
- const [people, setPeople] = useState(dummyPeopleData);
- const placeDetails = usePlace(placeId);
+ const placeDetails = usePlace(myPlaceId);
const locationLongitude = event.latitude;
const locationLatitude = event.longitude;
+ const me = useMe();
return (
People
- {people.map(({ name, latitude, longitude, id }) => {
+ {signups.map(({ latitude, longitude, user }) => {
+ if (user.id === me?.id) {
+ return null;
+ }
let extraDistance = null;
if (placeDetails != null) {
const myLatitude = placeDetails.latitude;
@@ -260,8 +261,9 @@ function People({ event, placeId }: { event: IEvent; placeId: string | null }) {
marginTop: '0.5rem',
marginBottom: '0.5rem',
}}
+ key={user.id}
>
-
{name}
+
{user.name}
{extraDistance ? `: +${extraDistance.toFixed(1)} miles` : ''}
(null);
- const [interested, toggleInterested] = useToggle(false);
+ const [interested, setInterested] = useState(false);
const [updating, setUpdating] = useState(false);
+ const [signups, setSignups] = useState([]);
+ const toggleInterested = useCallback(() => setInterested((i) => !i), []);
const toggleInterestedThrottled = useThrottle(toggleInterested, 500);
const existingSignup = useRef({
interested: false,
placeId: null as string | null,
eventId: null as number | null,
});
+ const me = useMe();
useEffect(() => {
+ const removeSignup = () => {
+ if (prev.interested) {
+ removeEventSignup(event.id)
+ .then(() => {
+ prev.interested = false;
+ })
+ .finally(() => setUpdating(false));
+ }
+ };
+
+ const addSignup = () => {
+ if (!prev.interested) {
+ addEventSignup(event.id, placeId!)
+ .then(() => {
+ prev.placeId = placeId;
+ prev.eventId = event.id;
+ prev.interested = true;
+ })
+ .finally(() => setUpdating(false));
+ }
+ };
+
const prev = existingSignup.current;
- if (prev.interested === false && interested === false) {
- return;
- }
- if (
- (prev.interested === true && interested === false) ||
- (interested === true && prev.placeId !== null && placeId === null)
- ) {
- removeEventSignup(event.id).finally(() => setUpdating(false));
- prev.interested = false;
- return;
- }
-
- if (
- interested === true &&
- (prev.placeId !== placeId || prev.eventId !== event.id) &&
- placeId !== null
- ) {
- prev.placeId = placeId;
- prev.eventId = event.id;
- prev.interested = true;
-
- addEventSignup(event.id, placeId!).finally(() => setUpdating(false));
- return;
+ if (!interested) {
+ removeSignup();
+ } else if (placeId == null) {
+ removeSignup();
+ } else {
+ addSignup();
}
}, [event.id, interested, placeId, updating]);
+ useEffect(() => {
+ getEventSignups(event.id)
+ .then((signups) => {
+ setSignups(signups);
+ for (let signup of signups) {
+ if (signup.user.id === me?.id) {
+ setInterested(true);
+ existingSignup.current.eventId = event.id;
+ existingSignup.current.placeId = signup.placeId;
+ existingSignup.current.interested = true;
+ }
+ }
+ })
+ .catch(console.error);
+ }, [event.id, me?.id]);
+
return (
{name}
@@ -373,7 +399,7 @@ export default function Event({ event }: { event: IEvent }) {
)}
-
+
>
)}
diff --git a/src/components/api.ts b/src/components/api.ts
index b704b12..5565c7e 100644
--- a/src/components/api.ts
+++ b/src/components/api.ts
@@ -1,3 +1,5 @@
+import { IEventSignup } from './Event';
+
async function post(path: string, data: any) {
const res = await fetch('http://localhost:5000/api' + path, {
method: 'post',
@@ -47,8 +49,14 @@ export async function getPlaceDetails(
return await get('/place/' + placeId);
}
+export async function getEventSignups(
+ eventId: number
+): Promise
{
+ return await get(`/events/${eventId}/signups`);
+}
+
export async function addEventSignup(eventId: number, placeId: string) {
- post(`/events/${eventId}/signup`, {
+ return await post(`/events/${eventId}/signup`, {
placeId,
});
}
diff --git a/src/components/hooks.ts b/src/components/hooks.ts
new file mode 100644
index 0000000..7372eda
--- /dev/null
+++ b/src/components/hooks.ts
@@ -0,0 +1,5 @@
+import { useContext } from 'react';
+import AuthenticationContext from './Authentication/AuthenticationContext';
+
+export const useAuth = () => useContext(AuthenticationContext);
+export const useMe = () => useAuth().user;