mirror of
https://github.com/myfatemi04/wheelshare-frontend.git
synced 2025-04-21 19:29:51 -04:00
add leave carpool button
This commit is contained in:
parent
4bc7a97365
commit
10ff0baa50
|
@ -1,7 +1,12 @@
|
||||||
import MailOutlineIcon from '@material-ui/icons/MailOutline';
|
import MailOutlineIcon from '@material-ui/icons/MailOutline';
|
||||||
import PersonAddIcon from '@material-ui/icons/PersonAdd';
|
import PersonAddIcon from '@material-ui/icons/PersonAdd';
|
||||||
import { createContext, useCallback, useEffect, useState } from 'react';
|
import { createContext, useCallback, useEffect, useState } from 'react';
|
||||||
import { cancelCarpoolInvite, getCarpool, sendCarpoolInvite } from '../api';
|
import {
|
||||||
|
cancelCarpoolInvite,
|
||||||
|
getCarpool,
|
||||||
|
leaveCarpool,
|
||||||
|
sendCarpoolInvite,
|
||||||
|
} from '../api';
|
||||||
import { lightgrey } from '../colors';
|
import { lightgrey } from '../colors';
|
||||||
import { ICarpool } from '../types';
|
import { ICarpool } from '../types';
|
||||||
import UIButton from '../UI/UIButton';
|
import UIButton from '../UI/UIButton';
|
||||||
|
@ -19,6 +24,9 @@ export const CarpoolContext = createContext({
|
||||||
cancelInvite: (user: { id: number; name: string }) => {
|
cancelInvite: (user: { id: number; name: string }) => {
|
||||||
console.error('not implemented: cancelInvite');
|
console.error('not implemented: cancelInvite');
|
||||||
},
|
},
|
||||||
|
leave: () => {
|
||||||
|
console.error('not implemented: leave');
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
export default function Carpool({ id }: { id: number }) {
|
export default function Carpool({ id }: { id: number }) {
|
||||||
|
@ -75,12 +83,31 @@ export default function Carpool({ id }: { id: number }) {
|
||||||
[id]
|
[id]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const eventId = carpool?.eventId;
|
||||||
|
|
||||||
|
const leave = useCallback(() => {
|
||||||
|
if (eventId) {
|
||||||
|
leaveCarpool(id)
|
||||||
|
.then(() => {
|
||||||
|
window.location.href = '/events/' + eventId;
|
||||||
|
})
|
||||||
|
.catch(console.error);
|
||||||
|
}
|
||||||
|
}, [eventId, id]);
|
||||||
|
|
||||||
if (!carpool) {
|
if (!carpool) {
|
||||||
return <>Loading...</>;
|
return <>Loading...</>;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CarpoolContext.Provider value={{ carpool, sendInvite, cancelInvite }}>
|
<CarpoolContext.Provider
|
||||||
|
value={{
|
||||||
|
carpool,
|
||||||
|
sendInvite,
|
||||||
|
cancelInvite,
|
||||||
|
leave,
|
||||||
|
}}
|
||||||
|
>
|
||||||
<UISecondaryBox style={{ width: '100%', alignItems: 'center' }}>
|
<UISecondaryBox style={{ width: '100%', alignItems: 'center' }}>
|
||||||
{carpool ? (
|
{carpool ? (
|
||||||
<>
|
<>
|
||||||
|
|
|
@ -1,4 +1,17 @@
|
||||||
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
|
import AccountCircleIcon from '@material-ui/icons/AccountCircle';
|
||||||
|
import { useContext } from 'react';
|
||||||
|
import { lightgrey } from '../colors';
|
||||||
|
import UIButton from '../UI/UIButton';
|
||||||
|
import { CarpoolContext } from './Carpool';
|
||||||
|
|
||||||
|
function MemberRow({ member }: { member: { id: number; name: string } }) {
|
||||||
|
return (
|
||||||
|
<div style={{ display: 'flex', alignItems: 'center' }} key={member.id}>
|
||||||
|
<AccountCircleIcon style={{ marginRight: '8px' }} />
|
||||||
|
<div>{member.name}</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
export default function MemberList({
|
export default function MemberList({
|
||||||
members,
|
members,
|
||||||
|
@ -8,42 +21,36 @@ export default function MemberList({
|
||||||
name: string;
|
name: string;
|
||||||
}[];
|
}[];
|
||||||
}) {
|
}) {
|
||||||
|
const { leave } = useContext(CarpoolContext);
|
||||||
|
const membersToShow = members.slice(0, 2);
|
||||||
|
const hiddenMemberCount = members.length - membersToShow.length;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="MemberList"
|
|
||||||
style={{
|
style={{
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
alignSelf: 'center',
|
alignSelf: 'center',
|
||||||
alignItems: 'flex-start',
|
alignItems: 'center',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<h3 style={{ marginBlockEnd: '0' }}>Members</h3>
|
<h3 style={{ marginBlockEnd: '0' }}>Members</h3>
|
||||||
{members.length > 0 ? (
|
{members.length > 0 ? (
|
||||||
<div>
|
<div style={{ display: 'flex', flexDirection: 'column' }}>
|
||||||
{members.map((member, index) => {
|
{membersToShow.map((member) => (
|
||||||
return index < 2 ? (
|
<MemberRow member={member} key={member.id} />
|
||||||
<div
|
))}
|
||||||
className="member"
|
{hiddenMemberCount > 0 &&
|
||||||
style={{ display: 'flex', alignItems: 'center' }}
|
(hiddenMemberCount === 1
|
||||||
key={member.id}
|
? hiddenMemberCount + ' other...'
|
||||||
>
|
: hiddenMemberCount + ' others...')}
|
||||||
<AccountCircleIcon style={{ marginRight: '8px' }} />
|
|
||||||
<div>{member.name}</div>
|
|
||||||
</div>
|
|
||||||
) : (
|
|
||||||
''
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
{members.length > 2
|
|
||||||
? members.length - 2 === 1
|
|
||||||
? members.length - 2 + ' other...'
|
|
||||||
: members.length - 2 + ' others...'
|
|
||||||
: ''}{' '}
|
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
'This carpool has no members.'
|
'This carpool has no members.'
|
||||||
)}
|
)}
|
||||||
|
<UIButton onClick={leave} style={{ backgroundColor: lightgrey }}>
|
||||||
|
Leave
|
||||||
|
</UIButton>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,3 +189,7 @@ export async function sendCarpoolInvite(carpoolId: number, userId: number) {
|
||||||
export async function cancelCarpoolInvite(carpoolId: number, userId: number) {
|
export async function cancelCarpoolInvite(carpoolId: number, userId: number) {
|
||||||
return await delete$('/carpools/' + carpoolId + '/invite', { userId });
|
return await delete$('/carpools/' + carpoolId + '/invite', { userId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function leaveCarpool(carpoolId: number) {
|
||||||
|
return await post(`/carpools/${carpoolId}/leave`, {});
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user