From a4eeefb9a648af2af155e8b0eebd29c7016a66ac Mon Sep 17 00:00:00 2001
From: Michael Fatemi <myfatemi04@gmail.com>
Date: Mon, 26 Jul 2021 20:03:22 -0400
Subject: [PATCH] improve carpool members list

---
 src/components/Carpool/Carpool.tsx            |  2 +-
 .../Carpool/CarpoolRouteEstimator.tsx         | 27 ++++---------------
 src/components/Carpool/MemberList.tsx         | 27 +++++++++++++------
 src/components/Carpool/useSignups.tsx         | 17 ++++++++++++
 4 files changed, 42 insertions(+), 31 deletions(-)
 create mode 100644 src/components/Carpool/useSignups.tsx

diff --git a/src/components/Carpool/Carpool.tsx b/src/components/Carpool/Carpool.tsx
index ad0690b..e0713ad 100644
--- a/src/components/Carpool/Carpool.tsx
+++ b/src/components/Carpool/Carpool.tsx
@@ -167,8 +167,8 @@ export default function Carpool({ id }: { id: number }) {
 				<CarpoolDetails />
 				<Members>
 					<CarpoolRouteEstimator />
+					<MemberList />
 				</Members>
-				<MemberList />
 			</UISecondaryBox>
 		</CarpoolContext.Provider>
 	);
diff --git a/src/components/Carpool/CarpoolRouteEstimator.tsx b/src/components/Carpool/CarpoolRouteEstimator.tsx
index df59e27..8d972e0 100644
--- a/src/components/Carpool/CarpoolRouteEstimator.tsx
+++ b/src/components/Carpool/CarpoolRouteEstimator.tsx
@@ -1,27 +1,10 @@
-import { useMemo, useState } from 'react';
-import { useEffect } from 'react';
-import { useContext } from 'react';
+import { useContext, useMemo } from 'react';
 import { Location } from '../../lib/estimateoptimalpath';
 import getDistance from '../../lib/getdistance';
-import { getEventSignupsBulk } from '../api';
-import { IEventSignupComplete, IEventSignup } from '../types';
+import { IEventSignupComplete } from '../types';
 import useOptimalPath from '../useOptimalPath';
 import { CarpoolContext } from './Carpool';
-
-function useSignups(eventId: number, userIds: number[]) {
-	// Fetchs bulk signups from the API for the given event and user ids
-	// and returns a memoized result.
-
-	const [signups, setSignups] = useState<IEventSignup[]>([]);
-
-	useEffect(() => {
-		getEventSignupsBulk(eventId, userIds).then((signups) => {
-			setSignups(signups);
-		});
-	}, [eventId, userIds]);
-
-	return signups;
-}
+import useSignups from './useSignups';
 
 export default function CarpoolRouteEstimator() {
 	const { carpool } = useContext(CarpoolContext);
@@ -34,7 +17,7 @@ export default function CarpoolRouteEstimator() {
 
 	const signups = useSignups(carpool.event.id, memberIds);
 
-	const signupsWithLocation = useMemo(
+	const completedSignups = useMemo(
 		() =>
 			signups.filter(
 				(signup) => signup.latitude !== null
@@ -42,7 +25,7 @@ export default function CarpoolRouteEstimator() {
 		[signups]
 	);
 
-	const path = useOptimalPath(signupsWithLocation, carpool.event);
+	const path = useOptimalPath(completedSignups, carpool.event);
 
 	return (
 		<div
diff --git a/src/components/Carpool/MemberList.tsx b/src/components/Carpool/MemberList.tsx
index 180a409..849cc20 100644
--- a/src/components/Carpool/MemberList.tsx
+++ b/src/components/Carpool/MemberList.tsx
@@ -1,13 +1,19 @@
-import AccountCircleIcon from '@material-ui/icons/AccountCircle';
 import { useContext, useMemo, useState } from 'react';
+import { IEventSignup } from '../types';
 import UIPressable from '../UI/UIPressable';
 import { CarpoolContext } from './Carpool';
+import useSignups from './useSignups';
 
-function MemberRow({ member }: { member: { id: number; name: string } }) {
+function MemberRow({ signup }: { signup: IEventSignup }) {
 	return (
-		<div style={{ display: 'flex', alignItems: 'center' }} key={member.id}>
-			<AccountCircleIcon style={{ marginRight: '8px' }} />
-			<div>{member.name}</div>
+		<div
+			style={{ display: 'flex', flexDirection: 'column', padding: '0.5rem' }}
+		>
+			<div style={{ display: 'flex', alignItems: 'center' }}>
+				<div>{signup.user.name}</div>
+			</div>
+			<span>{signup.formattedAddress}</span>
+			{signup.canDrive && <b>Can drive</b>}
 		</div>
 	);
 }
@@ -24,13 +30,18 @@ function formatOthers(hiddenMemberCount: number) {
 	return `${hiddenMemberCount} others...`;
 }
 
-const shownMembersCount = 2;
+const shownMembersCount = 4;
 
 export default function MemberList() {
 	const { carpool } = useContext(CarpoolContext);
 	const [expanded, setExpanded] = useState(false);
 
-	const members = carpool.members;
+	const memberIDs = useMemo(
+		() => carpool.members.map((member) => member.id),
+		[carpool]
+	);
+	const members = useSignups(carpool.id, memberIDs);
+
 	const membersToShow = useMemo(
 		() => (expanded ? members : members.slice(0, shownMembersCount)),
 		[members, expanded]
@@ -60,7 +71,7 @@ export default function MemberList() {
 					}}
 				>
 					{membersToShow.map((member) => (
-						<MemberRow member={member} key={member.id} />
+						<MemberRow signup={member} key={member.user.id} />
 					))}
 					<br />
 					<UIPressable onClick={() => setExpanded((e) => !e)}>
diff --git a/src/components/Carpool/useSignups.tsx b/src/components/Carpool/useSignups.tsx
new file mode 100644
index 0000000..925e7ef
--- /dev/null
+++ b/src/components/Carpool/useSignups.tsx
@@ -0,0 +1,17 @@
+import { useState, useEffect } from 'react';
+import { getEventSignupsBulk } from '../api';
+import { IEventSignup } from '../types';
+
+// Fetchs bulk signups from the API for the given event and user ids
+// and returns a memoized result.
+export default function useSignups(eventId: number, userIds: number[]) {
+	const [signups, setSignups] = useState<IEventSignup[]>([]);
+
+	useEffect(() => {
+		getEventSignupsBulk(eventId, userIds).then((signups) => {
+			setSignups(signups);
+		});
+	}, [eventId, userIds]);
+
+	return signups;
+}