Skip to content

Commit

Permalink
fix(desk): correct prop typings for pane view components
Browse files Browse the repository at this point in the history
  • Loading branch information
rexxars committed Aug 9, 2022
1 parent cc2b3c8 commit b0ccfc3
Show file tree
Hide file tree
Showing 10 changed files with 78 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export function DocumentHeaderTabs() {
}

function DocumentHeaderTab(props: {
icon?: React.ComponentType
icon?: React.ComponentType | React.ReactNode
id: string
isActive: boolean
label: React.ReactNode
Expand Down
4 changes: 2 additions & 2 deletions packages/sanity/src/desk/structureBuilder/Document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import {ChildResolver} from './ChildResolver'
import {SerializeOptions, Serializable, Child, DocumentNode, EditorNode} from './StructureNodes'
import {SerializeError, HELP_URL} from './SerializeError'
import {validateId} from './util/validateId'
import {View, ViewBuilder, maybeSerializeView} from './views/View'
import {ViewBuilder, maybeSerializeView} from './views/View'
import {form} from './views'
import {StructureContext} from './types'
import type {StructureContext, View} from './types'

const createDocumentChildResolver =
({resolveDocumentNode}: StructureContext): ChildResolver =>
Expand Down
24 changes: 12 additions & 12 deletions packages/sanity/src/desk/structureBuilder/StructureNodes.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import {DocumentListBuilder, DocumentList} from './DocumentList'
import {ListItemBuilder} from './ListItem'
import {ListBuilder, List} from './List'
import {MenuItemBuilder} from './MenuItem'
import {MenuItemGroupBuilder} from './MenuItemGroup'
import {Component, ComponentBuilder} from './Component'
import {DocumentListItemBuilder} from './DocumentListItem'
import {ChildResolver} from './ChildResolver'
import {DocumentTypeListBuilder} from './DocumentTypeList'
import {InitialValueTemplateItemBuilder} from './InitialValueTemplateItem'
import {DocumentBuilder} from './Document'
import {View} from './views/View'
import type {DocumentListBuilder, DocumentList} from './DocumentList'
import type {ListItemBuilder} from './ListItem'
import type {ListBuilder, List} from './List'
import type {MenuItemBuilder} from './MenuItem'
import type {MenuItemGroupBuilder} from './MenuItemGroup'
import type {Component, ComponentBuilder} from './Component'
import type {DocumentListItemBuilder} from './DocumentListItem'
import type {ChildResolver} from './ChildResolver'
import type {DocumentTypeListBuilder} from './DocumentTypeList'
import type {InitialValueTemplateItemBuilder} from './InitialValueTemplateItem'
import type {DocumentBuilder} from './Document'
import type {View} from './types'

export interface StructureNode {
id: string
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {uniqueId} from 'lodash'
import {SchemaType} from '@sanity/types'
import type {SchemaType} from '@sanity/types'
import {isValidElementType} from 'react-is'
import {Source, getConfigContextFromSource} from '../../config'
import {getPublishedId} from '../../util'
Expand All @@ -13,7 +13,7 @@ import {MenuItemBuilder, getOrderingMenuItemsForSchemaType, getOrderingMenuItem}
import {ListItemBuilder} from './ListItem'
import {MenuItemGroupBuilder} from './MenuItemGroup'
import {DocumentListBuilder} from './DocumentList'
import {Divider} from './StructureNodes'
import type {Divider} from './StructureNodes'
import {DocumentBuilder, documentFromEditor, documentFromEditorWithInitialValue} from './Document'
import {ComponentInput, ComponentBuilder} from './Component'
import {DocumentListItemBuilder} from './DocumentListItem'
Expand All @@ -23,7 +23,7 @@ import {
defaultInitialValueTemplateItems,
menuItemsFromInitialValueTemplateItems,
} from './InitialValueTemplateItem'
import {
import type {
StructureBuilder,
UserComponent,
StructureContext,
Expand Down
49 changes: 31 additions & 18 deletions packages/sanity/src/desk/structureBuilder/types.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,33 @@
import {SortOrdering} from '@sanity/types'
import {ConfigContext, Source} from '../../config'
import {InitialValueTemplateItem} from '../../templates'
import {ComponentBuilder, ComponentInput} from './Component'
import {DocumentBuilder, PartialDocumentNode} from './Document'
import {DocumentListInput, DocumentListBuilder} from './DocumentList'
import {DocumentListItemInput, DocumentListItemBuilder} from './DocumentListItem'
import {DocumentTypeListInput} from './DocumentTypeList'
import {InitialValueTemplateItemBuilder} from './InitialValueTemplateItem'
import {ListBuilder, ListInput} from './List'
import {ListItemBuilder, ListItemInput} from './ListItem'
import {MenuItem, MenuItemBuilder} from './MenuItem'
import {MenuItemGroup, MenuItemGroupBuilder} from './MenuItemGroup'
import {Divider, EditorNode} from './StructureNodes'
import {ComponentView, ComponentViewBuilder} from './views/ComponentView'
import {FormViewBuilder} from './views/FormView'
import {View} from './views/View'
import type {SanityDocument, SchemaType, SortOrdering} from '@sanity/types'
import type {ConfigContext, Source} from '../../config'
import type {InitialValueTemplateItem} from '../../templates'
import type {ComponentBuilder, ComponentInput} from './Component'
import type {DocumentBuilder, PartialDocumentNode} from './Document'
import type {DocumentListInput, DocumentListBuilder} from './DocumentList'
import type {DocumentListItemInput, DocumentListItemBuilder} from './DocumentListItem'
import type {DocumentTypeListInput} from './DocumentTypeList'
import type {InitialValueTemplateItemBuilder} from './InitialValueTemplateItem'
import type {ListBuilder, ListInput} from './List'
import type {ListItemBuilder, ListItemInput} from './ListItem'
import type {MenuItem, MenuItemBuilder} from './MenuItem'
import type {MenuItemGroup, MenuItemGroupBuilder} from './MenuItemGroup'
import type {Divider, EditorNode} from './StructureNodes'
import type {ComponentView, ComponentViewBuilder} from './views/ComponentView'
import type {FormView, FormViewBuilder} from './views/FormView'

export type View = FormView | ComponentView

export type UserViewComponent<TOptions = Record<string, any>> = React.ComponentType<{
document: {
draft: SanityDocument | null
displayed: Partial<SanityDocument>
historical: Partial<SanityDocument> | null
published: SanityDocument | null
}
documentId: string
options: TOptions
schemaType: SchemaType
}>

export type UserComponent = React.ComponentType<{
child?: ComponentBuilder
Expand Down Expand Up @@ -78,7 +91,7 @@ export interface StructureBuilder {
orderingMenuItem: (ordering: SortOrdering) => MenuItemBuilder
orderingMenuItemsForType: (type: string) => MenuItemBuilder[]
view: {
form: (spec?: Partial<View>) => FormViewBuilder
form: (spec?: Partial<FormView>) => FormViewBuilder
component: (
componentOrSpec?: Partial<ComponentView> | React.ComponentType<any>
) => ComponentViewBuilder
Expand Down
15 changes: 8 additions & 7 deletions packages/sanity/src/desk/structureBuilder/views/ComponentView.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import {SerializeOptions} from '../StructureNodes'
import {SerializeError, HELP_URL} from '../SerializeError'
import {UserComponent} from '../types'
import {isRecord} from '../../../util'
import {View, GenericViewBuilder} from './View'
import type {UserViewComponent} from '../types'
import {BaseView, GenericViewBuilder} from './View'

export interface ComponentView extends View {
component: UserComponent
options: Record<string, unknown>
export interface ComponentView<TOptions = Record<string, any>> extends BaseView {
type: 'component'
component: UserViewComponent
options: TOptions
}

const isComponentSpec = (spec: unknown): spec is ComponentView =>
Expand All @@ -18,7 +19,7 @@ export class ComponentViewBuilder extends GenericViewBuilder<
> {
protected spec: Partial<ComponentView>

constructor(componentOrSpec?: UserComponent | Partial<ComponentView>) {
constructor(componentOrSpec?: UserViewComponent | Partial<ComponentView>) {
const spec = isComponentSpec(componentOrSpec) ? {...componentOrSpec} : {options: {}}

super()
Expand All @@ -33,7 +34,7 @@ export class ComponentViewBuilder extends GenericViewBuilder<
}
}

component(component: UserComponent): ComponentViewBuilder {
component(component: UserViewComponent): ComponentViewBuilder {
return this.clone({component})
}

Expand Down
14 changes: 7 additions & 7 deletions packages/sanity/src/desk/structureBuilder/views/FormView.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import {SerializeOptions} from '../StructureNodes'
import {View, GenericViewBuilder} from './View'
import {BaseView, GenericViewBuilder} from './View'

export type FormView = View
export interface FormView extends BaseView {
type: 'form'
}

export class FormViewBuilder extends GenericViewBuilder<Partial<View>, FormViewBuilder> {
export class FormViewBuilder extends GenericViewBuilder<Partial<BaseView>, FormViewBuilder> {
protected spec: Partial<FormView>

constructor(spec?: Partial<FormView>) {
Expand All @@ -12,12 +14,10 @@ export class FormViewBuilder extends GenericViewBuilder<Partial<View>, FormViewB
}

serialize(options: SerializeOptions = {path: []}): FormView {
const base = super.serialize(options)
const formView: FormView = {
...base,
return {
...super.serialize(options),
type: 'form',
}
return formView
}

clone(withSpec?: Partial<FormView>): FormViewBuilder {
Expand Down
17 changes: 8 additions & 9 deletions packages/sanity/src/desk/structureBuilder/views/View.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ import {HELP_URL, SerializeError} from '../SerializeError'
import {validateId} from '../util/validateId'
import {ComponentViewBuilder} from './ComponentView'
import {FormViewBuilder} from './FormView'
import {View} from '../types'

export interface View {
type: string
export interface BaseView {
id: string
title: string
icon?: React.ComponentType | React.ReactNode
}

export abstract class GenericViewBuilder<TView extends Partial<View>, ConcreteImpl>
implements Serializable<View>
export abstract class GenericViewBuilder<TView extends Partial<BaseView>, ConcreteImpl>
implements Serializable<BaseView>
{
protected spec: TView = {} as TView

Expand Down Expand Up @@ -41,7 +41,7 @@ export abstract class GenericViewBuilder<TView extends Partial<View>, ConcreteIm
return this.spec.icon
}

serialize(options: SerializeOptions = {path: []}): View {
serialize(options: SerializeOptions = {path: []}): BaseView {
const {id, title, icon} = this.spec
if (!id) {
throw new SerializeError(
Expand All @@ -63,15 +63,14 @@ export abstract class GenericViewBuilder<TView extends Partial<View>, ConcreteIm
id: validateId(id, options.path, options.index),
title,
icon,
type: 'view',
}
}

abstract clone(withSpec?: Partial<View>): ConcreteImpl
abstract clone(withSpec?: Partial<BaseView>): ConcreteImpl
}

function isSerializable(view: View | Serializable<View>): view is Serializable<View> {
return typeof (view as Serializable<View>).serialize === 'function'
function isSerializable(view: BaseView | Serializable<BaseView>): view is Serializable<BaseView> {
return typeof (view as Serializable<BaseView>).serialize === 'function'
}

export function maybeSerializeView(
Expand Down
4 changes: 2 additions & 2 deletions packages/sanity/src/desk/structureBuilder/views/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import {UserComponent} from '../types'
import type {UserViewComponent} from '../types'
import {ComponentView, ComponentViewBuilder} from './ComponentView'
import {FormView, FormViewBuilder} from './FormView'

Expand All @@ -8,5 +8,5 @@ export * from './View'

export const form = (spec?: Partial<FormView>): FormViewBuilder => new FormViewBuilder(spec)
export const component = (
componentOrSpec?: UserComponent | Partial<ComponentView>
componentOrSpec?: UserViewComponent | Partial<ComponentView>
): ComponentViewBuilder => new ComponentViewBuilder(componentOrSpec)
30 changes: 4 additions & 26 deletions packages/sanity/src/desk/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import {SchemaType, SanityDocument} from '@sanity/types'
import {SchemaType} from '@sanity/types'
import {Subscribable} from 'rxjs'
import {GeneralPreviewLayoutKey} from '../components/previews'
import {ConfigContext} from '../config'
import {InitialValueTemplateItem} from '../templates'
import {
ComponentView,
DefaultDocumentNodeResolver,
FormView,
StructureBuilder,
StructureContext,
UserComponent,
Expand Down Expand Up @@ -171,31 +173,7 @@ export interface CustomComponentPaneNode extends BaseResolvedPaneNode<'component
__preserveInstance?: boolean
}

export type PaneView<TOptions = unknown> =
| {
id: string
type: 'form'
title: string
icon?: React.ComponentType
}
| {
id: string
type: 'component'
title: string
icon?: React.ComponentType
options?: TOptions
component?: React.ComponentType<{
documentId: string
options?: TOptions
schemaType: SchemaType
document: {
draft: SanityDocument | null
displayed: Partial<SanityDocument>
historical: Partial<SanityDocument> | null
published: SanityDocument | null
}
}>
}
export type PaneView = FormView | ComponentView

export interface DocumentPaneNode extends BaseResolvedPaneNode<'document'> {
options: {
Expand Down

0 comments on commit b0ccfc3

Please sign in to comment.