import React from 'react' import PropTypes from 'prop-types' import { Link, graphql } from 'gatsby' import Img from 'gatsby-image' import _ from 'lodash' import moment from 'moment' import 'moment/locale/nb' import { connectableObservableDescriptor } from 'rxjs/internal/observable/ConnectableObservable' moment.locale('nb') export default class EventList extends React.Component { render() { const { events, title, onlyUpcoming, numDays, groupBy } = this.props const filteredEvents = events.filter(({ node: event }) => { const startTime = moment(event.start_time) if (onlyUpcoming && !startTime.isSameOrAfter(new Date(), 'day')) { return false } if (numDays) { const lastDay = moment().add(numDays - 1, 'days') if (!startTime.isSameOrBefore(lastDay, 'day')) { return false } } return true }) return (
{title &&

{title}

}
{groupBy && this.renderEventsByDate(filteredEvents, groupBy)} {!groupBy && filteredEvents.map(({ node: event }) => this.renderEvent(event))}
) } renderEventsByDate(filteredEvents, groupBy) { let groupByFormat = null if (groupBy === 'day') { groupByFormat = 'YYYY-MM-DD' } if (groupBy === 'month') { groupByFormat = 'YYYY-MM' } const grouper = ({ node: event }) => { return moment(event.start_time).format(groupByFormat) } const groupedEvents = _.groupBy(filteredEvents, grouper) return _.map(groupedEvents, (theseEvents, date) => { return (
{groupBy === 'day' && moment(date).format('dddd D. MMMM')} {groupBy === 'month' && moment(date).format('MMMM')}
{theseEvents.map(({ node: event }) => { return
{this.renderEvent(event)}
})}
) }) } renderEvent(event) { return (
{event.featured_media && event.featured_media.localFile && ( )}

{event.title}

{moment(event.start_time).format('HH:mm')} {moment(event.start_time).format('dddd')}{' '} {moment(event.start_time).format('D.')}{' '} {moment(event.start_time).format('MMMM')}{' '} {/* Only specify year if different. */} {!moment(event.start_time).isSame(new Date(), 'year') && ( {moment(event.start_time).format('YYYY')}{' '} )} {event.event_types && event.event_types.length && (
    {event.event_types.map(type => (
  • {type.name}
  • ))}
)}
) } } EventList.propTypes = { events: PropTypes.arrayOf(PropTypes.object), title: PropTypes.string, onlyUpcoming: PropTypes.bool, numDays: PropTypes.number, groupBy: PropTypes.string, } EventList.defaultProps = { onlyUpcoming: true, numDays: 0, groupBy: null, } export const pageQuery = graphql` fragment EventTypeFields on wordpress__wp_events { event_types { name slug fields { link } } } fragment EventListFields on wordpress__wp_events { id title start_time end_time featured_media { localFile { ...FluidImage } } fields { link } ...EventTypeFields } `