43 lines
1.6 KiB
JavaScript
43 lines
1.6 KiB
JavaScript
![]() |
import create from 'zustand'
|
||
|
import striptags from 'striptags'
|
||
|
import { isFuture, isPast } from 'date-fns'
|
||
|
import { slugify } from '../helpers/string'
|
||
|
import { getMetadataByKey, getPostByKey, getResourcesByKey, getPeertubeIDfromUrl } from './helpers'
|
||
|
|
||
|
export const [useSeriesStore] = create(set => ({
|
||
|
series: [],
|
||
|
|
||
|
setSeries: seriesArray => {
|
||
|
const allSeries = seriesArray.map(({ name, organizedEvents, posts, resources, banner, summary }) => {
|
||
|
|
||
|
const allEpisodes = organizedEvents.elements.length ? organizedEvents.elements.map(ep => ({
|
||
|
title: ep.title,
|
||
|
beginsOn: ep.beginsOn,
|
||
|
endsOn: ep.endsOn,
|
||
|
description: ep.description,
|
||
|
media: ep.media,
|
||
|
image: ep.picture ? ep.picture.url : null,
|
||
|
peertubeId: getPeertubeIDfromUrl(getMetadataByKey(ep, 'mz:live:peertube:url')),
|
||
|
})) : []
|
||
|
|
||
|
const series = {
|
||
|
title: name,
|
||
|
subtitle: striptags(summary),
|
||
|
description: getPostByKey(posts, 'SERIES_INFO'),
|
||
|
posts: posts.elements,
|
||
|
resources: resources.elements,
|
||
|
image: banner ? banner.url : '',
|
||
|
episodes: {
|
||
|
future: allEpisodes.filter(ep => isFuture(new Date(ep.endsOn))).sort((a, b) => new Date(a.beginsOn) - new Date(b.beginsOn)),
|
||
|
past: allEpisodes.filter(ep => isPast(new Date(ep.endsOn))).sort((a, b) => new Date(a.beginsOn) - new Date(b.beginsOn))
|
||
|
},
|
||
|
slug: slugify(name),
|
||
|
credits: getPostByKey(posts, 'SERIES_CREDITS'),
|
||
|
trailerId: getPeertubeIDfromUrl(getResourcesByKey(resources, 'SERIES_TRAILER'))
|
||
|
}
|
||
|
return series
|
||
|
})
|
||
|
|
||
|
set({ series: allSeries })
|
||
|
}
|
||
|
}))
|