wheelshare-frontend/src/components/api.ts
2021-07-15 07:39:30 -04:00

221 lines
5.2 KiB
TypeScript

import { GroupPreview } from './GroupJoinerLink';
import { IInvitation, IEventSignup, ICarpool, IEvent, IGroup } from './types';
const base = (() => {
const domain =
process.env.NODE_ENV === 'production'
? process.env.REACT_APP_API_PROD
: process.env.REACT_APP_API_LOCAL;
if (domain?.endsWith('/')) {
return domain.slice(0, -1) + '/api';
} else {
return domain + '/api';
}
})();
async function post(path: string, data: any) {
const res = await fetch(base + path, {
method: 'post',
body: JSON.stringify(data),
headers: {
Authorization: 'Bearer ' + localStorage.getItem('session_token'),
'Content-Type': 'application/json',
},
});
return await res.json();
}
async function delete$(path: string, body?: any) {
const res = await fetch(base + path, {
method: 'delete',
headers: {
Authorization: 'Bearer ' + localStorage.getItem('session_token'),
'Content-Type': 'application/json',
},
body: body ? JSON.stringify(body) : undefined,
});
return await res.json();
}
async function get(path: string) {
const res = await fetch(base + path, {
headers: {
Authorization: 'Bearer ' + localStorage.getItem('session_token'),
},
});
return await res.json();
}
export async function getEventSignups(
eventId: number
): Promise<IEventSignup[]> {
return await get(`/events/${eventId}/signups`);
}
export async function addOrUpdateEventSignup(
eventId: number,
placeId: string | null
) {
return await post(`/events/${eventId}/signup`, {
placeId,
});
}
export async function removeEventSignup(eventId: number) {
return await delete$(`/events/${eventId}/signup`);
}
export async function createEvent({
name,
startTime,
duration,
endDate,
groupId,
placeId,
daysOfWeek,
}: {
name: string;
startTime: Date;
duration: number;
endDate: Date | null;
groupId: number;
placeId: string;
daysOfWeek: number;
}) {
const { id } = await post('/events', {
name,
startTime,
duration,
endDate,
groupId,
placeId,
daysOfWeek,
});
return {
id,
};
}
export async function getEvents(): Promise<IEvent[]> {
return await get('/events');
}
export async function getEvent(id: number): Promise<IEvent> {
return await get('/events/' + id);
}
export async function getGroup(id: number): Promise<IGroup> {
return await get('/groups/' + id);
}
export async function getGroupEvents(id: number) {
return await get('/groups/' + id + '/events');
}
export async function getGroups() {
return await get('/groups');
}
export async function deleteGroup(id: number) {
return await delete$('/groups/' + id);
}
export async function createGroup(name: string) {
const result = await post('/groups', {
name,
});
return {
id: result.id,
};
}
export async function getNotifications() {
return await get('/users/@me/received_requests_and_invites');
}
export async function acceptRequest(carpoolId: number, userId: number) {
return await post(`/carpools/${carpoolId}/accept_request`, { userId });
}
export async function acceptInvite(carpoolId: number, userId: number) {
return await post(`/carpools/${carpoolId}/accept_invite`, { userId });
}
export async function denyRequest(carpoolId: number, userId: number) {
return await post(`/carpools/${carpoolId}/deny_request`, { userId });
}
export async function denyInvite(carpoolId: number, userId: number) {
return await post(`/carpools/${carpoolId}/deny_invite`, { userId });
}
export async function getMe() {
return await get('/users/@me');
}
export async function resolveCode(code: string): Promise<GroupPreview> {
return await get('/resolve_code/' + code);
}
export async function joinGroup(id: number, code: string) {
const result = await post('/groups/' + id + '/join', { code });
return {
status: result.status,
};
}
export async function generateCode(groupId: number) {
return await post('/groups/' + groupId + '/generate_code', {});
}
export async function resetCode(groupId: number) {
return await post('/groups/' + groupId + '/reset_code', {});
}
export async function getReceivedInvitationsAndRequests() {
return (await get(
'/users/@me/received_requests_and_invites'
)) as IInvitation[];
}
export async function getCarpool(id: number): Promise<ICarpool> {
return await get('/carpools/' + id);
}
export async function createCarpool({
eventId,
name,
invitedUserIds,
}: {
eventId: number;
name: string;
invitedUserIds: number[];
}): Promise<{ id: number }> {
return await post('/carpools/', { eventId, name, invitedUserIds });
}
export async function sendCarpoolInvite(carpoolId: number, userId: number) {
return await post('/carpools/' + carpoolId + '/invite', { userId });
}
export async function cancelCarpoolInvite(carpoolId: number, userId: number) {
return await delete$('/carpools/' + carpoolId + '/invite', { userId });
}
export async function leaveCarpool(carpoolId: number) {
return await post(`/carpools/${carpoolId}/leave`, {});
}
export async function sendCarpoolRequest(carpoolId: number) {
return await post('/carpools/' + carpoolId + '/request', {});
}
export async function cancelCarpoolRequest(carpoolId: number) {
return await delete$('/carpools/' + carpoolId + '/request');
}
export async function getSentRequestsAndInvites() {
return (await get('/users/@me/sent_requests_and_invites')) as IInvitation[];
}