wbu-design-system
Version:
WhereBy.Design is the nascent design system for WhereBy.Us
150 lines (128 loc) • 3.71 kB
JavaScript
import axios from 'axios';
import dayjs from 'dayjs';
import { cloneDeep, isNumber } from 'lodash';
import AuthService from './authService';
const eventModel = {
brand: '',
description: '',
endDate: '',
endTime: '',
id: null,
isCurated: false,
isSponsored: false,
isPartnerEvent: false,
neighborhood: '',
startDate: '',
startTime: '',
};
export default {
name: 'EventService',
async createEvent(event) {
try {
const properlyFormattedEvent = await this.properlyFormatEventDates(event);
const url = 'https://events.whereby.us/api/v1/events';
const token = AuthService.getWhereByPassportToken();
const { data: newEventId } = await axios({
method: 'post',
url,
data: properlyFormattedEvent,
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!isNumber(newEventId)) {
throw new Error('Could not create event');
}
return newEventId;
} catch (error) {
return error;
}
},
/**
* @param event
* @returns {Promise<*>}
*/
async curateEvent(event) {
try {
const eventClone = cloneDeep(event);
eventClone.isCurated = !eventClone.isCurated;
eventClone.isPartnerEvent = false;
eventClone.isSponsored = false;
await this.updateEvent(eventClone);
return eventClone;
} catch (error) {
throw new Error('Could not curate this event');
}
},
filterEventsByPhraseInDescription(phrase, events) {
return events.filter(event => event.description.toLowerCase().indexOf(phrase.toLowerCase()) > -1);
},
getEmptyEvent() {
return cloneDeep(eventModel);
},
async getUpcomingEvents() {
try {
const { data: events } = await axios.get('https://events.whereby.us/api/v1/events');
return events;
} catch (error) {
return [];
}
},
/**
* When we mark an event as partnered, we have to also un-curate it and -
* just for good measure - un-sponsor it.
*
* @param event
* @returns {Promise<*>}
*/
async markEventAsPartnerEvent(event) {
try {
const eventClone = cloneDeep(event);
eventClone.isCurated = false;
eventClone.isPartnerEvent = !eventClone.isPartnerEvent;
eventClone.isSponsored = false;
await this.updateEvent(eventClone);
return eventClone;
} catch (error) {
throw new Error('Could not mark the event as a partner event');
}
},
properlyFormatEventDates(event) {
return new Promise((resolve) => {
event.endDate = event.endDate ? dayjs(event.endDate).format('YYYY-MM-DD') : ''; // eslint-disable-line
event.startDate = event.startDate ? dayjs(event.startDate).format('YYYY-MM-DD') : ''; // eslint-disable-line
resolve(event);
});
},
async trashEvent(event) {
try {
const eventClone = cloneDeep(event);
eventClone.isTrashed = !eventClone.isTrashed;
await this.updateEvent(eventClone);
return true;
} catch (error) {
throw new Error('Could not delete this event');
}
},
async updateEvent(event) {
try {
const properlyFormattedEvent = await this.properlyFormatEventDates(event);
const url = `https://events.whereby.us/api/v1/events/${event.id}`;
const token = AuthService.getWhereByPassportToken();
const { data: didEventUpdate } = await axios({
method: 'post',
url,
data: properlyFormattedEvent,
headers: {
Authorization: `Bearer ${token}`,
},
});
if (!didEventUpdate) {
throw new Error('Could not update event');
}
return true;
} catch (error) {
return error;
}
},
};