mirror of
https://github.com/myfatemi04/wheelshare-frontend.git
synced 2025-04-16 00:50:18 -04:00
improve carpool members list
This commit is contained in:
parent
504bc50c9e
commit
a4eeefb9a6
|
@ -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>
|
||||||
);
|
);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)}>
|
||||||
|
|
17
src/components/Carpool/useSignups.tsx
Normal file
17
src/components/Carpool/useSignups.tsx
Normal 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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user