improve carpool members list

This commit is contained in:
Michael Fatemi 2021-07-26 20:03:22 -04:00
parent 504bc50c9e
commit a4eeefb9a6
4 changed files with 42 additions and 31 deletions

View File

@ -167,8 +167,8 @@ export default function Carpool({ id }: { id: number }) {
<CarpoolDetails /> <CarpoolDetails />
<Members> <Members>
<CarpoolRouteEstimator /> <CarpoolRouteEstimator />
<MemberList />
</Members> </Members>
<MemberList />
</UISecondaryBox> </UISecondaryBox>
</CarpoolContext.Provider> </CarpoolContext.Provider>
); );

View File

@ -1,27 +1,10 @@
import { useMemo, useState } from 'react'; import { useContext, useMemo } from 'react';
import { useEffect } from 'react';
import { useContext } from 'react';
import { Location } from '../../lib/estimateoptimalpath'; import { Location } from '../../lib/estimateoptimalpath';
import getDistance from '../../lib/getdistance'; import getDistance from '../../lib/getdistance';
import { getEventSignupsBulk } from '../api'; import { IEventSignupComplete } from '../types';
import { IEventSignupComplete, IEventSignup } from '../types';
import useOptimalPath from '../useOptimalPath'; import useOptimalPath from '../useOptimalPath';
import { CarpoolContext } from './Carpool'; import { CarpoolContext } from './Carpool';
import useSignups from './useSignups';
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;
}
export default function CarpoolRouteEstimator() { export default function CarpoolRouteEstimator() {
const { carpool } = useContext(CarpoolContext); const { carpool } = useContext(CarpoolContext);
@ -34,7 +17,7 @@ export default function CarpoolRouteEstimator() {
const signups = useSignups(carpool.event.id, memberIds); const signups = useSignups(carpool.event.id, memberIds);
const signupsWithLocation = useMemo( const completedSignups = useMemo(
() => () =>
signups.filter( signups.filter(
(signup) => signup.latitude !== null (signup) => signup.latitude !== null
@ -42,7 +25,7 @@ export default function CarpoolRouteEstimator() {
[signups] [signups]
); );
const path = useOptimalPath(signupsWithLocation, carpool.event); const path = useOptimalPath(completedSignups, carpool.event);
return ( return (
<div <div

View File

@ -1,13 +1,19 @@
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
import { useContext, useMemo, useState } from 'react'; import { useContext, useMemo, useState } from 'react';
import { IEventSignup } from '../types';
import UIPressable from '../UI/UIPressable'; import UIPressable from '../UI/UIPressable';
import { CarpoolContext } from './Carpool'; import { CarpoolContext } from './Carpool';
import useSignups from './useSignups';
function MemberRow({ member }: { member: { id: number; name: string } }) { function MemberRow({ signup }: { signup: IEventSignup }) {
return ( return (
<div style={{ display: 'flex', alignItems: 'center' }} key={member.id}> <div
<AccountCircleIcon style={{ marginRight: '8px' }} /> style={{ display: 'flex', flexDirection: 'column', padding: '0.5rem' }}
<div>{member.name}</div> >
<div style={{ display: 'flex', alignItems: 'center' }}>
<div>{signup.user.name}</div>
</div>
<span>{signup.formattedAddress}</span>
{signup.canDrive && <b>Can drive</b>}
</div> </div>
); );
} }
@ -24,13 +30,18 @@ function formatOthers(hiddenMemberCount: number) {
return `${hiddenMemberCount} others...`; return `${hiddenMemberCount} others...`;
} }
const shownMembersCount = 2; const shownMembersCount = 4;
export default function MemberList() { export default function MemberList() {
const { carpool } = useContext(CarpoolContext); const { carpool } = useContext(CarpoolContext);
const [expanded, setExpanded] = useState(false); 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( const membersToShow = useMemo(
() => (expanded ? members : members.slice(0, shownMembersCount)), () => (expanded ? members : members.slice(0, shownMembersCount)),
[members, expanded] [members, expanded]
@ -60,7 +71,7 @@ export default function MemberList() {
}} }}
> >
{membersToShow.map((member) => ( {membersToShow.map((member) => (
<MemberRow member={member} key={member.id} /> <MemberRow signup={member} key={member.user.id} />
))} ))}
<br /> <br />
<UIPressable onClick={() => setExpanded((e) => !e)}> <UIPressable onClick={() => setExpanded((e) => !e)}>

View File

@ -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;
}