Skip to content

Commit

Permalink
refactor(sanity): move document actions/badges to core
Browse files Browse the repository at this point in the history
  • Loading branch information
mariuslundgard committed Oct 4, 2022
1 parent 0cdd0fd commit 7b27a15
Show file tree
Hide file tree
Showing 35 changed files with 137 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {HookStateContainer} from './HookStateContainer'
import {cancelIdleCallback, requestIdleCallback} from './requestIdleCallback'
import {ActionHook} from './types'

interface GetHookCollectionStateProps<T, K> {
/** @internal */
export interface GetHookCollectionStateProps<T, K> {
args: T
children: (props: {states: K[]}) => React.ReactNode
hooks: ActionHook<T, K>[]
Expand All @@ -15,6 +16,7 @@ interface GetHookCollectionStateProps<T, K> {

const throttleOptions: ThrottleSettings = {trailing: true}

/** @internal */
export function GetHookCollectionState<T, K>(props: GetHookCollectionStateProps<T, K>) {
const {hooks, args, children, onReset} = props

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ function useShallowCompareEffect(callback: React.EffectCallback, dependencies: a
useEffect(callback, useShallowCompareMemoize(dependencies))
}

/** @internal */
export const HookStateContainer = memo(
function HookStateContainer(props: any) {
const {hook, args, id, onNext, onReset, onRequestUpdate} = props
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const actionIds = new WeakMap<ActionHook<any, any>, string>()

let counter = 0

/** @internal */
export function getHookId<T, K>(actionHook: ActionHook<T, K>): string {
const cachedId = actionIds.get(actionHook)

Expand Down
22 changes: 4 additions & 18 deletions packages/sanity/src/core/config/configPropertyReducers.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
import type {AssetSource, SchemaTypeDefinition} from '@sanity/types'
import type {Template, TemplateResponse} from '../templates'
import {
DeleteAction,
DiscardChangesAction,
DocumentActionComponent,
DuplicateAction,
PublishAction,
UnpublishAction,
DocumentBadgeComponent,
LiveEditBadge,
} from '../../desk'
import {DocumentActionComponent} from './document/actions'
import {DocumentBadgeComponent} from './document/badges'
import type {
DocumentLanguageFilterComponent,
DocumentLanguageFilterContext,
Expand All @@ -23,15 +15,9 @@ import type {
Tool,
} from './types'

export const initialDocumentBadges = [LiveEditBadge]
export const initialDocumentBadges: DocumentBadgeComponent[] = []

export const initialDocumentActions = [
PublishAction,
DiscardChangesAction,
UnpublishAction,
DuplicateAction,
DeleteAction,
]
export const initialDocumentActions: DocumentActionComponent[] = []

export const initialLanguageFilter: DocumentLanguageFilterComponent[] = []

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {type ButtonTone} from '@sanity/ui'
import type React from 'react'
import {type EditStateFor} from '../../core'
import {type EditStateFor} from '../../datastores'

export interface ActionComponent<ActionProps> {
(props: ActionProps): DocumentActionDescription | null
Expand Down Expand Up @@ -33,10 +33,7 @@ export interface DocumentActionComponent extends ActionComponent<DocumentActionP
action?: 'delete' | 'discardChanges' | 'duplicate' | 'restore' | 'publish' | 'unpublish'
}

export interface DocumentActionResolver {
(props: EditStateFor): DocumentActionComponent[]
}

/** @beta */
export interface DocumentActionConfirmModalProps {
type: 'confirm'
tone?: ButtonTone
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
import type {EditStateFor} from '../../core'
import {EditStateFor} from '../../datastores'

/** @beta */
export interface DocumentBadgeDescription {
title?: string
label?: string | undefined
color?: 'primary' | 'success' | 'warning' | 'danger'
icon?: React.ReactNode | React.ComponentType
}

/** @beta */
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface DocumentBadgeProps extends EditStateFor {}

/** @beta */
export interface DocumentBadgeComponent {
(props: DocumentBadgeProps): DocumentBadgeDescription | null
}
2 changes: 2 additions & 0 deletions packages/sanity/src/core/config/document/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './actions'
export * from './badges'
1 change: 1 addition & 0 deletions packages/sanity/src/core/config/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './createConfig'
export * from './createPlugin'
export * from './document'
export * from './types'
export * from './prepareConfig'
export * from './resolveConfig'
Expand Down
10 changes: 5 additions & 5 deletions packages/sanity/src/core/config/types.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type {BifurClient} from '@sanity/bifur-client'
import type {ClientConfig as SanityClientConfig, SanityClient} from '@sanity/client'
import type {
AssetSource,
Expand All @@ -11,7 +12,6 @@ import type {
import type React from 'react'
import type {ComponentType, ReactNode} from 'react'
import type {Observable} from 'rxjs'
import type {BifurClient} from '@sanity/bifur-client'
import type {
FieldProps,
FormBuilderArrayFunctionComponent,
Expand All @@ -24,12 +24,12 @@ import type {
RenderItemCallback,
RenderPreviewCallback,
} from '../../form'
import type {StudioTheme} from '../theme'
import type {InitialValueTemplateItem, Template, TemplateResponse} from '../templates'
import type {Router, RouterState} from '../../router'
import type {DocumentActionComponent, DocumentBadgeComponent} from '../../desk'
import {PreviewProps} from '../components/previews'
import type {InitialValueTemplateItem, Template, TemplateResponse} from '../templates'
import type {StudioTheme} from '../theme'
import {PreviewProps} from '../components'
import {AuthStore} from '../datastores'
import {DocumentActionComponent, DocumentBadgeComponent} from './document'
import {StudioComponents, StudioComponentsPluginOptions} from './components'

/**
Expand Down
8 changes: 5 additions & 3 deletions packages/sanity/src/desk/__workshop__/DocumentStateStory.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import {Box, Code, Stack, Button, Dialog} from '@sanity/ui'
import React, {useMemo, useState, useCallback, useEffect} from 'react'
import {
useInitialValue,
DocumentActionComponent,
DocumentActionDescription,
DocumentActionProps,
EditStateFor,
useEditState,
useConnectionState,
useEditState,
useInitialValue,
useSource,
useUnique,
useValidationStatus,
} from '../../core'
import {DocumentActionDescription, DocumentActionComponent, DocumentActionProps} from '../actions'
import {DeskToolProvider} from '../DeskToolProvider'
import {DocumentPaneProvider} from '../panes'
import {DocumentPaneNode} from '../types'
Expand Down
3 changes: 0 additions & 3 deletions packages/sanity/src/desk/actions/index.ts

This file was deleted.

3 changes: 0 additions & 3 deletions packages/sanity/src/desk/badges/index.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import React from 'react'
import {GetHookCollectionState} from '../../core'
import {DocumentActionDescription, DocumentActionProps} from './types'
import {
type DocumentActionDescription,
type DocumentActionProps,
GetHookCollectionState,
} from '../../core'

interface Action<Args, Description> {
/** @internal */
export interface Action<Args, Description> {
(args: Args): Description | null
}

interface RenderActionCollectionProps {
/** @internal */
export interface RenderActionCollectionProps {
actions: Action<DocumentActionProps, DocumentActionDescription>[]
actionProps: DocumentActionProps
children: (props: {states: DocumentActionDescription[]}) => React.ReactNode
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
import React from 'react'
import {GetHookCollectionState, type EditStateFor} from '../../core'
import type {DocumentBadgeDescription, DocumentBadgeProps} from './types'
import {
type DocumentBadgeDescription,
type DocumentBadgeProps,
type EditStateFor,
GetHookCollectionState,
} from '../../core'

interface Badge<Args, Description> {
/** @internal */
export interface Badge<Args, Description> {
(args: Args): Description | null
}

interface RenderBadgeCollectionProps {
/** @internal */
export interface RenderBadgeCollectionProps {
badges: Badge<DocumentBadgeProps, DocumentBadgeDescription>[]
badgeProps: EditStateFor
children: (props: {states: DocumentBadgeDescription[]}) => React.ReactNode
Expand Down
12 changes: 7 additions & 5 deletions packages/sanity/src/desk/components/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
export * from './Delay'
export * from './DocTitle'
export * from './RenderActionCollectionState'
export * from './RenderBadgeCollectionState'
export * from './TimeAgo'
export * from './confirmDeleteDialog'
export * from './pane'
export * from './paneHeaderActions'
export * from './confirmDeleteDialog'
export * from './TimeAgo'
export * from './paneRouter'
export * from './paneItem'
export * from './Delay'
export * from './DocTitle'
export * from './paneRouter'
40 changes: 40 additions & 0 deletions packages/sanity/src/desk/deskTool.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,52 @@
import {MasterDetailIcon} from '@sanity/icons'
import {lazy} from 'react'
import {createPlugin} from '../core'
import {
DeleteAction,
DiscardChangesAction,
DuplicateAction,
HistoryRestoreAction,
PublishAction,
UnpublishAction,
} from './documentActions'
import {LiveEditBadge} from './documentBadges'
import {getIntentState} from './getIntentState'
import {router} from './router'
import {DeskToolOptions} from './types'

const documentActions = [
PublishAction,
UnpublishAction,
DiscardChangesAction,
DuplicateAction,
DeleteAction,
HistoryRestoreAction,
]

const documentBadges = [LiveEditBadge]

export const deskTool = createPlugin<DeskToolOptions | void>((options) => ({
name: '@sanity/desk-tool',
document: {
actions: (prevActions) => {
// NOTE: since it's possible to have several desk tools in one Studio,
// we need to check whether the document actions already exist in the Studio config
const actions = prevActions.slice(0)
for (const action of documentActions) {
if (!actions.includes(action)) actions.push(action)
}
return actions
},
badges: (prevBadges) => {
// NOTE: since it's possible to have several desk tools in one Studio,
// we need to check whether the document badges already exist in the Studio config
const badges = prevBadges.slice(0)
for (const badge of documentBadges) {
if (!badges.includes(badge)) badges.push(badge)
}
return badges
},
},
tools: [
{
name: options?.name || 'desk',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import {TrashIcon} from '@sanity/icons'
import React, {useCallback, useState} from 'react'
import {
DocumentActionComponent,
InsufficientPermissionsMessage,
useDocumentPairPermissions,
useDocumentOperation,
useCurrentUser,
} from '../../../core'
import {ConfirmDeleteDialog} from '../../components'
import {DocumentActionComponent} from '../types'
useDocumentOperation,
useDocumentPairPermissions,
} from '../../core'
import {ConfirmDeleteDialog} from '../components'

const DISABLED_REASON_TITLE = {
NOTHING_TO_DELETE: 'This document doesn’t yet exist or is already deleted',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,13 @@
import {ResetIcon} from '@sanity/icons'
import React, {useCallback, useMemo, useState} from 'react'
import {
DocumentActionComponent,
DocumentActionModalProps,
InsufficientPermissionsMessage,
useDocumentPairPermissions,
useCurrentUser,
useDocumentOperation,
} from '../../../core'
import {DocumentActionComponent, DocumentActionModalProps} from '../types'
useDocumentPairPermissions,
} from '../../core'

const DISABLED_REASON_TITLE = {
NO_CHANGES: 'This document has no unpublished changes',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import {CopyIcon} from '@sanity/icons'
import {uuid} from '@sanity/uuid'
import React, {useCallback, useState} from 'react'
import {
DocumentActionComponent,
InsufficientPermissionsMessage,
useDocumentPairPermissions,
useDocumentOperation,
useCurrentUser,
} from '../../../core'
import {useRouter} from '../../../router'
import {DocumentActionComponent} from '../types'
} from '../../core'
import {useRouter} from '../../router'

const DISABLED_REASON_TITLE = {
NOTHING_TO_DUPLICATE: 'This document doesn’t yet exist so there‘s nothing to duplicate',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import {RestoreIcon} from '@sanity/icons'
import React, {useCallback, useMemo, useState} from 'react'
import {useDocumentOperation} from '../../../core'
import {useRouter} from '../../../router'
import {DocumentActionComponent, DocumentActionModalProps} from '../types'
import {DocumentActionComponent, DocumentActionModalProps, useDocumentOperation} from '../../core'
import {useRouter} from '../../router'

export const HistoryRestoreAction: DocumentActionComponent = ({id, type, revision, onComplete}) => {
const {restore}: any = useDocumentOperation(id, type)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import {CheckmarkIcon, PublishIcon} from '@sanity/icons'
import {isValidationErrorMarker} from '@sanity/types'
import React, {useCallback, useEffect, useState} from 'react'
import {
DocumentActionComponent,
InsufficientPermissionsMessage,
useCurrentUser,
useDocumentOperation,
useDocumentPairPermissions,
useEditState,
useSyncState,
useValidationStatus,
} from '../../../core'
import {TimeAgo} from '../../components'
import {useDocumentPane} from '../../panes/document/useDocumentPane'
import {DocumentActionComponent} from '../types'
} from '../../core'
import {TimeAgo} from '../components'
import {useDocumentPane} from '../panes/document/useDocumentPane'

const DISABLED_REASON_TITLE = {
LIVE_EDIT_ENABLED: 'Cannot publish since liveEdit is enabled for this document type',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import {UnpublishIcon} from '@sanity/icons'
import React, {useCallback, useMemo, useState} from 'react'
import {
DocumentActionComponent,
DocumentActionModalProps,
InsufficientPermissionsMessage,
useDocumentPairPermissions,
useCurrentUser,
useDocumentOperation,
} from '../../../core'
import {ConfirmDeleteDialog} from '../../components'
import {DocumentActionComponent, DocumentActionModalProps} from '../types'
} from '../../core'
import {ConfirmDeleteDialog} from '../components'

const DISABLED_REASON_TITLE = {
NOT_PUBLISHED: 'This document is not published',
Expand Down

0 comments on commit 7b27a15

Please sign in to comment.