UNPKG

@stackbit/types

Version:

Types for Stackbit config and Content Source Interface

292 lines (259 loc) 10 kB
import type { ConfigDelegate } from './config-delegate'; import type { DocumentWithSource } from './content-source-document'; import type { DocumentField, DocumentObjectField, DocumentModelField } from './content-source-document-fields'; import type { ModelWithSource, ObjectModel } from './models'; import type { ClientField, FieldPath } from './model-fields'; import type { User } from './content-source'; import type { DocumentHookBaseOptions } from './config'; import type { Field, FieldBoolean, FieldColor, FieldDate, FieldDatetime, FieldEnum, FieldHtml, FieldMarkdown, FieldModel, FieldNumber, FieldObject, FieldReference, FieldSlug, FieldString, FieldText, FieldUrl } from './model-fields'; import { ICONS } from './consts'; import { ContentSourceActions } from './config'; import { DistributiveOmit } from './utility-types'; export interface CustomActionCommonParams { name: string; label?: string; icon?: (typeof ICONS)[number]; hidden?: boolean; preferredStyle?: 'button-primary' | 'button-secondary'; inputFields?: CustomActionInputField[]; } export interface CustomActionGlobal extends CustomActionCommonParams { type: 'global'; state?: CustomActionStateFunction; run: CustomActionRunFunction; permissions?: CustomActionPermissionsFunction; } export interface CustomActionBulk extends CustomActionCommonParams { type: 'bulk'; state?: CustomActionStateFunction; run: CustomActionRunFunction<{ documents: DocumentWithSource[] }>; permissions?: CustomActionPermissionsFunction; } export interface CustomActionModel extends CustomActionCommonParams { type: 'model'; run: CustomActionRunFunction<CustomActionModelRunOptions>; permissions?: CustomActionPermissionsFunction; /** * Lists model names for which the action is shown in the visual editor. * Applicable only for actions defined in the stackbit config's root action array. */ models?: string[]; locations?: ('new-card' | 'preset-card')[]; } export interface CustomActionModelRunOptions { /** The selected model for the action. */ actionModel: ModelWithSource; /** The {@link ContentSourceActions} for the content source of the given `actionModel` */ contentSourceActions: ContentSourceActions; /** * The location in UI where the action was triggered. * The 'preset-card' will be set when the user triggers the action from a * preset. In this case the `inputData.presetData` will contain the data of * the selected preset. * The 'new-card' will be set when the user triggers the action not from a preset. */ location: 'new-card' | 'preset-card'; } export interface CustomActionDocument extends CustomActionCommonParams { type?: 'document'; state?: CustomActionStateFunction<CustomActionDocumentStateOptions>; run: CustomActionRunFunction<CustomActionDocumentRunOptions>; permissions?: CustomActionPermissionsFunction<CustomActionDocumentStateOptions>; } export interface CustomActionDocumentStateOptions { document: DocumentWithSource; model: ModelWithSource; } export interface CustomActionDocumentRunOptions extends CustomActionDocumentStateOptions { contentSourceActions: ContentSourceActions; } /** * Custom action that runs in the context of an "object" model, within an existing document. * This action can be used to create new nested objects within an existing document. */ export interface CustomActionModelObject extends CustomActionCommonParams { type: 'model'; run: CustomActionRunFunction<CustomActionModelObjectRunOptions>; permissions?: CustomActionPermissionsFunction; locations?: ('new-card' | 'preset-card')[]; } export interface CustomActionModelObjectRunOptions { parentDocument: DocumentWithSource; parentModel: ModelWithSource; modelField: FieldModel; fieldPath: FieldPath; objectModel: ModelWithSource<ObjectModel>; location: 'new-card' | 'preset-card'; contentSourceActions: ContentSourceActions; } /** * Custom action that runs in the context of a nested object represented by a model of type "object". * This action can be used to update an existing nested object within an existing document. */ export interface CustomActionObjectModel extends CustomActionCommonParams { type?: 'object'; state?: CustomActionStateFunction<CustomActionObjectModelStateParams>; run: CustomActionRunFunction<CustomActionObjectModelRunParams>; permissions?: CustomActionPermissionsFunction<CustomActionObjectModelStateParams>; } export interface CustomActionObjectModelStateParams { parentDocument: DocumentWithSource; parentModel: ModelWithSource; documentField: DocumentModelField; modelField: FieldModel; fieldPath: FieldPath; objectModel: ModelWithSource<ObjectModel>; } export interface CustomActionObjectModelRunParams extends CustomActionObjectModelStateParams { contentSourceActions: ContentSourceActions; } export interface CustomActionObjectField extends CustomActionCommonParams { type: 'object'; state?: CustomActionStateFunction<CustomActionObjectFieldStateParams>; run: CustomActionRunFunction<CustomActionObjectFieldRunParams>; permissions?: CustomActionPermissionsFunction<CustomActionObjectFieldStateParams>; } export interface CustomActionObjectFieldStateParams { parentDocument: DocumentWithSource; parentModel: ModelWithSource; documentField: DocumentObjectField; modelField: FieldObject; fieldPath: FieldPath; } export interface CustomActionObjectFieldRunParams extends CustomActionObjectFieldStateParams { contentSourceActions: ContentSourceActions; } export interface CustomActionField extends CustomActionCommonParams { type?: 'field'; state?: CustomActionStateFunction<CustomActionFieldStateParams>; run: CustomActionRunFunction<CustomActionFieldRunParams>; permissions?: CustomActionPermissionsFunction<CustomActionFieldStateParams>; } export interface CustomActionFieldStateParams { parentDocument: DocumentWithSource; parentModel: ModelWithSource; documentField?: DocumentField; modelField: Field; fieldPath: FieldPath; } export interface CustomActionFieldRunParams extends CustomActionFieldStateParams { contentSourceActions: ContentSourceActions; } export type CustomActionState = 'enabled' | 'running' | 'disabled'; export type CustomActionStateFunction<T = unknown> = ( options: CustomActionStateCommonOptions & T ) => Promise<CustomActionState>; export interface CustomActionStateCommonOptions extends ConfigDelegate { actionId: string; currentLocale?: string; currentUser?: User; currentPageUrl?: string; currentPageDocument?: DocumentWithSource; } /** * The `run` function runs the action that was triggered in the visual editor. * This function should return a promise. * * If this function resolves with `undefined` value, the action is considered to * have completed successfully. This function may also resolve with the * {@link CustomActionResult} object to show "success" or "fail" messages in the * visual editor. */ export type CustomActionRunFunction<T = unknown> = ( options: CustomActionRunCommonOptions & T ) => Promise<CustomActionResult | void>; export interface CustomActionRunCommonOptions extends ConfigDelegate, Pick<DocumentHookBaseOptions, 'getContentSourceActionsForSource' | 'getUserContextForContentSourceType'> { actionId: string; inputData?: Record<string, any>; progress: CustomActionProgressFunction; currentLocale?: string; currentUser?: User; currentPageUrl?: string; currentPageDocument?: DocumentWithSource; } export type CustomActionProgressFunction = (options: { message?: string; percent?: number }) => void; export interface CustomActionResult { /** @deprecated */ state?: CustomActionState; /** * If the result object contains the `success` property, the action is * considered to have completed successfully, and the value of the `success` * property will be shown in the visual editor as a success message. */ success?: string; /** * If the result object contains the `error` property, the action is * considered to have failed, and the value of the `error` property will be * shown in the visual editor as an error message. */ error?: string; /** * When the action is triggered programmatically from within a custom field, * it may return a `result` value. This value will be returned from the * {@link CustomControlWindow.stackbit.runAction} function called from the * custom field. * * @see FieldCustomControlTypeProps * @see CustomControlWindow */ result?: any; } export type CustomActionPermissionsFunction<T = unknown> = ( options: CustomActionPermissionsCommonOptions & T ) => CustomActionPermissions | undefined; export type CustomActionPermissions = { canExecute?: boolean; }; export interface CustomActionPermissionsCommonOptions extends ConfigDelegate { actionId: string; currentLocale?: string; userContext: User; currentPageUrl?: string; currentPageDocument?: DocumentWithSource; } export type CustomActionClientModel< T extends | CustomActionModel | CustomActionDocument | CustomActionModelObject | CustomActionObjectModel | CustomActionField > = Omit<T, 'permissions' | 'run' | 'state' | 'inputFields'> & { inputFields?: CustomActionInputClientField[]; }; export type CustomActionInputField = DistributiveOmit< | FieldString | FieldUrl | FieldSlug | FieldText | FieldMarkdown | FieldHtml | FieldNumber | FieldBoolean | FieldDate | FieldDatetime | FieldColor | FieldEnum | FieldReference, 'actions' >; export type CustomActionInputClientField = ClientField<CustomActionInputField>;