sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
80 lines (73 loc) • 2.85 kB
text/typescript
import {type ClientPerspective} from '@sanity/client'
import {type PerspectiveStack, type ReleaseId} from '../../perspective/types'
import {DRAFTS_FOLDER} from '../../util/draftUtils'
import {type ReleaseDocument} from '../store/types'
import {getReleaseIdFromReleaseDocumentId} from '../util/getReleaseIdFromReleaseDocumentId'
export function sortReleases(releases: ReleaseDocument[] = []): ReleaseDocument[] {
// The order should always be:
// [undecided (sortByCreatedAt), scheduled(sortBy publishAt || metadata.intendedPublishAt), asap(sortByCreatedAt)]
return [...releases].sort((a, b) => {
// undecided are always first, then by createdAt descending
if (a.metadata.releaseType === 'undecided' && b.metadata.releaseType !== 'undecided') {
return -1
}
if (a.metadata.releaseType !== 'undecided' && b.metadata.releaseType === 'undecided') {
return 1
}
if (a.metadata.releaseType === 'undecided' && b.metadata.releaseType === 'undecided') {
// Sort by createdAt
return new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime()
}
// Scheduled are always at the middle, then by publishAt descending
if (a.metadata.releaseType === 'scheduled' && b.metadata.releaseType === 'scheduled') {
const aPublishAt = a.publishAt || a.metadata.intendedPublishAt
if (!aPublishAt) {
return 1
}
const bPublishAt = b.publishAt || b.metadata.intendedPublishAt
if (!bPublishAt) {
return -1
}
return new Date(bPublishAt).getTime() - new Date(aPublishAt).getTime()
}
// ASAP are always last, then by createdAt descending
if (a.metadata.releaseType === 'asap' && b.metadata.releaseType !== 'asap') {
return 1
}
if (a.metadata.releaseType !== 'asap' && b.metadata.releaseType === 'asap') {
return -1
}
if (a.metadata.releaseType === 'asap' && b.metadata.releaseType === 'asap') {
// Sort by createdAt
return new Date(b._createdAt).getTime() - new Date(a._createdAt).getTime()
}
return 0
})
}
export function getReleasesPerspectiveStack({
selectedPerspectiveName,
releases,
excludedPerspectives,
}: {
selectedPerspectiveName: ReleaseId | undefined | 'published'
releases: ReleaseDocument[]
excludedPerspectives: string[]
}): PerspectiveStack {
if (!selectedPerspectiveName) {
return ['drafts']
}
if (selectedPerspectiveName === 'published') {
return ['published']
}
const sorted: ClientPerspective = sortReleases(releases).map((release) =>
getReleaseIdFromReleaseDocumentId(release._id),
)
const selectedIndex = sorted.indexOf(selectedPerspectiveName)
if (selectedIndex === -1) {
return []
}
return sorted
.slice(selectedIndex)
.concat(DRAFTS_FOLDER)
.filter((name) => !excludedPerspectives.includes(name))
}