Skip to content

Commit

Permalink
feat(core): update events api routes and config flags, fix events sor…
Browse files Browse the repository at this point in the history
…ting (#8369)
  • Loading branch information
pedrobonamin authored Jan 28, 2025
1 parent 23628a1 commit f62873e
Showing 14 changed files with 467 additions and 29 deletions.
7 changes: 5 additions & 2 deletions dev/test-studio/sanity.config.ts
Original file line number Diff line number Diff line change
@@ -225,7 +225,11 @@ export default defineConfig([
dataset: 'playground',
plugins: [sharedSettings()],
basePath: '/playground',
beta: {eventsAPI: {enabled: true}},
beta: {
eventsAPI: {
releases: true,
},
},
},
{
name: 'listener-events',
@@ -254,7 +258,6 @@ export default defineConfig([
plugins: [sharedSettings()],
basePath: '/staging',
apiHost: 'https://api.sanity.work',
beta: {eventsAPI: {enabled: true}},
auth: {
loginMethod: 'token',
},
17 changes: 14 additions & 3 deletions packages/sanity/src/core/config/configPropertyReducers.ts
Original file line number Diff line number Diff line change
@@ -364,18 +364,29 @@ export const internalTasksReducer = (opts: {
return result
}

export const eventsAPIReducer = (opts: {config: PluginOptions; initialValue: boolean}): boolean => {
export const eventsAPIReducer = (opts: {
config: PluginOptions
initialValue: boolean
key: 'releases' | 'documents'
}): boolean => {
const {config, initialValue} = opts
const flattenedConfig = flattenConfig(config, [])

const result = flattenedConfig.reduce((acc: boolean, {config: innerConfig}) => {
const enabled = innerConfig.beta?.eventsAPI?.enabled
// @ts-expect-error enabled is a legacy option we want to warn beta testers in case they have enabled it.
if (innerConfig.beta?.eventsAPI?.enabled) {
throw new Error(
`The \`beta.eventsAPI.enabled\` option has been removed. Use \`beta.eventsAPI.${opts.key}\` instead.`,
)
}

const enabled = innerConfig.beta?.eventsAPI?.[opts.key]

if (typeof enabled === 'undefined') return acc
if (typeof enabled === 'boolean') return enabled

throw new Error(
`Expected \`beta.eventsAPI.enabled\` to be a boolean, but received ${getPrintableType(
`Expected \`beta.eventsAPI.${opts.key}\` to be a boolean, but received ${getPrintableType(
enabled,
)}`,
)
3 changes: 2 additions & 1 deletion packages/sanity/src/core/config/prepareConfig.tsx
Original file line number Diff line number Diff line change
@@ -647,7 +647,8 @@ function resolveSource({

beta: {
eventsAPI: {
enabled: eventsAPIReducer({config, initialValue: false}),
documents: eventsAPIReducer({config, initialValue: true, key: 'documents'}),
releases: eventsAPIReducer({config, initialValue: false, key: 'releases'}),
},
treeArrayEditing: {
// This beta feature is no longer available.
3 changes: 2 additions & 1 deletion packages/sanity/src/core/config/types.ts
Original file line number Diff line number Diff line change
@@ -1020,6 +1020,7 @@ export interface BetaFeatures {
* If it is not enabled, it will continue using the legacy Timeline.
*/
eventsAPI?: {
enabled: boolean
documents?: boolean
releases?: boolean
}
}
Original file line number Diff line number Diff line change
@@ -59,7 +59,7 @@ export function getReleaseActivityEvents({client, releaseId}: InitialFetchEvents
events: Omit<ReleaseEvent, 'id' | 'origin'>[]
nextCursor: string
}>({
url: `/data/events/${client.config().dataset}/releases/${getReleaseIdFromReleaseDocumentId(releaseId)}?${params.toString()}`,
url: `/data/history/${client.config().dataset}/events/releases/${getReleaseIdFromReleaseDocumentId(releaseId)}?${params.toString()}`,
tag: 'get-release-events',
})
.pipe(
Original file line number Diff line number Diff line change
@@ -4,7 +4,6 @@ import {useObservable} from 'react-rx'
import {useClient} from '../../../../hooks/useClient'
import {useDocumentPreviewStore} from '../../../../store/_legacy/datastores'
import {useSource} from '../../../../studio/source'
import {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../../../studioClient'
import {useReleasesStore} from '../../../store/useReleasesStore'
import {getReleaseDocumentIdFromReleaseId} from '../../../util/getReleaseDocumentIdFromReleaseId'
import {EVENTS_INITIAL_VALUE, getReleaseEvents} from './getReleaseEvents'
@@ -19,11 +18,12 @@ export interface ReleaseEvents {
}

export function useReleaseEvents(releaseId: string): ReleaseEvents {
const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)
// Needs vX version of the API
const client = useClient({apiVersion: 'X'})
const documentPreviewStore = useDocumentPreviewStore()
const {state$: releasesState$} = useReleasesStore()
const source = useSource()
const eventsAPIEnabled = Boolean(source.beta?.eventsAPI?.enabled)
const eventsAPIEnabled = Boolean(source.beta?.eventsAPI?.releases)

const releaseEvents = useMemo(
() =>
2 changes: 1 addition & 1 deletion packages/sanity/src/core/store/events/README.md
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@ The **Events API** introduces a new mechanism for accessing `DocumentGroupEvent`
This events are accessible through:

```
/data/events/<dataset/documents/<documentId>
/data/history/<datasetName>/events/documents/<documentsIds>
```

This API is designed to be lightweight, providing only the essential data required to render the UI. Additionally, it offers insights into the document variants impacted by each event.
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@ import {type EventsObservableValue} from './getInitialFetchEvents'
import {type EditDocumentVersionEvent, type UpdateLiveDocumentEvent} from './types'
import {
addParentToEvents,
sortEvents,
squashLiveEditEvents,
updatePublishedEvents,
updateVersionEvents,
@@ -29,10 +30,7 @@ export function createEventsObservable({
const documentVariantType = getDocumentVariantType(documentId)
return combineLatest([releases$, events$, remoteEdits$, expandedEvents$]).pipe(
map(([releases, {events, nextCursor, loading, error}, remoteEdits, expandedEvents]) => {
const eventsWithRemoteEdits = [...remoteEdits, ...events, ...expandedEvents].sort(
// Sort by timestamp, newest first
(a, b) => Date.parse(b.timestamp) - Date.parse(a.timestamp),
)
const eventsWithRemoteEdits = sortEvents({remoteEdits, events, expandedEvents})

if (documentVariantType === 'published') {
return {
Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ export function getInitialFetchEvents({client, documentId}: InitialFetchEventsOp
events: Record<string, Omit<DocumentGroupEvent, 'id'>[]>
nextCursor: string
}>({
url: `/data/events/${client.config().dataset}/documents/${documentId}?${params.toString()}`,
url: `/data/history/${client.config().dataset}/events/documents/${documentId}?${params.toString()}`,
tag: 'get-document-events',
})
.pipe(
4 changes: 2 additions & 2 deletions packages/sanity/src/core/store/events/useEventsStore.ts
Original file line number Diff line number Diff line change
@@ -6,7 +6,6 @@ import {of} from 'rxjs'
import {useClient, useSchema} from '../../hooks'
import {useReleasesStore} from '../../releases/store/useReleasesStore'
import {useWorkspace} from '../../studio/workspace'
import {DEFAULT_STUDIO_CLIENT_OPTIONS} from '../../studioClient'
import {getDocumentVariantType} from '../../util/getDocumentVariantType'
import {fetchFeatureToggle} from '../_legacy/document/document-pair/utils/fetchFeatureToggle'
import {createEventsStore} from './createEventsStore'
@@ -45,7 +44,8 @@ export function useEventsStore({
rev?: string | '@lastEdited'
since?: string | '@lastPublished'
}): EventsStore {
const client = useClient(DEFAULT_STUDIO_CLIENT_OPTIONS)
// Needs vX version of the API to get the events
const client = useClient({apiVersion: 'X'})
const {state$: releases$} = useReleasesStore()
const workspace = useWorkspace()

Loading

0 comments on commit f62873e

Please # to comment.