import type { Block, CollectionBeforeChangeHook, CollectionConfig, Field, TypeWithID } from 'payload';
export interface BlockConfig {
    block: Block;
    validate?: (value: unknown) => boolean | string;
}
export declare function isValidBlockConfig(blockConfig: BlockConfig | string): blockConfig is BlockConfig;
export interface FieldValues {
    [key: string]: boolean | null | number | string | undefined;
}
export type PaymentFieldConfig = {
    paymentProcessor: Partial<SelectField>;
} & Partial<Field>;
export type FieldConfig = Partial<Field> | PaymentFieldConfig;
export interface FieldsConfig {
    [key: string]: boolean | FieldConfig | undefined;
    checkbox?: boolean | FieldConfig;
    country?: boolean | FieldConfig;
    date?: boolean | FieldConfig;
    email?: boolean | FieldConfig;
    message?: boolean | FieldConfig;
    number?: boolean | FieldConfig;
    payment?: boolean | FieldConfig;
    select?: boolean | FieldConfig;
    state?: boolean | FieldConfig;
    text?: boolean | FieldConfig;
    textarea?: boolean | FieldConfig;
}
type BeforeChangeParams<T extends TypeWithID = any> = Parameters<CollectionBeforeChangeHook<T>>[0];
export type BeforeEmail<T extends TypeWithID = any> = (emails: FormattedEmail[], beforeChangeParams: BeforeChangeParams<T>) => FormattedEmail[] | Promise<FormattedEmail[]>;
export type HandlePayment = (data: any) => void;
export type FieldsOverride = (args: {
    defaultFields: Field[];
}) => Field[];
export type FormBuilderPluginConfig = {
    beforeEmail?: BeforeEmail;
    /**
     * Set a default email address to send form submissions to if no email is provided in the form configuration
     * Falls back to the defaultFromAddress in the email configuration
     */
    defaultToEmail?: string;
    fields?: FieldsConfig;
    formOverrides?: {
        fields?: FieldsOverride;
    } & Partial<Omit<CollectionConfig, 'fields'>>;
    formSubmissionOverrides?: {
        fields?: FieldsOverride;
    } & Partial<Omit<CollectionConfig, 'fields'>>;
    handlePayment?: HandlePayment;
    redirectRelationships?: string[];
};
export interface TextField {
    blockName?: string;
    blockType: 'text';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface TextAreaField {
    blockName?: string;
    blockType: 'textarea';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface SelectFieldOption {
    label: string;
    value: string;
}
export interface SelectField {
    blockName?: string;
    blockType: 'select';
    defaultValue?: string;
    label?: string;
    name: string;
    options: SelectFieldOption[];
    placeholder?: string;
    required?: boolean;
    width?: number;
}
export interface RadioField {
    blockName?: string;
    blockType: 'radio';
    defaultValue?: string;
    label?: string;
    name: string;
    options: SelectFieldOption[];
    placeholder?: string;
    required?: boolean;
    width?: number;
}
export interface PriceCondition {
    condition: 'equals' | 'hasValue' | 'notEquals';
    fieldToUse: string;
    operator: 'add' | 'divide' | 'multiply' | 'subtract';
    valueForCondition: string;
    valueForOperator: number | string;
    valueType: 'static' | 'valueOfField';
}
export interface PaymentField {
    basePrice: number;
    blockName?: string;
    blockType: 'payment';
    defaultValue?: string;
    label?: string;
    name: string;
    paymentProcessor: string;
    priceConditions: PriceCondition[];
    required?: boolean;
    width?: number;
}
export interface EmailField {
    blockName?: string;
    blockType: 'email';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface DateField {
    blockName?: string;
    blockType: 'date';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface StateField {
    blockName?: string;
    blockType: 'state';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface CountryField {
    blockName?: string;
    blockType: 'country';
    defaultValue?: string;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface CheckboxField {
    blockName?: string;
    blockType: 'checkbox';
    defaultValue?: boolean;
    label?: string;
    name: string;
    required?: boolean;
    width?: number;
}
export interface MessageField {
    blockName?: string;
    blockType: 'message';
    message: object;
}
export type FormFieldBlock = CheckboxField | CountryField | DateField | EmailField | MessageField | PaymentField | RadioField | SelectField | StateField | TextAreaField | TextField;
export interface Email {
    bcc?: string;
    cc?: string;
    emailFrom: string;
    emailTo: string;
    message?: any;
    replyTo?: string;
    subject: string;
}
export interface FormattedEmail {
    bcc?: string;
    cc?: string;
    from: string;
    html: string;
    replyTo: string;
    subject: string;
    to: string;
}
export interface Redirect {
    reference?: {
        relationTo: string;
        value: string | unknown;
    };
    type: 'custom' | 'reference';
    url: string;
}
export interface Form {
    confirmationMessage?: any;
    confirmationType: 'message' | 'redirect';
    emails: Email[];
    fields: FormFieldBlock[];
    id: string;
    redirect?: Redirect;
    submitButtonLabel?: string;
    title: string;
}
export interface SubmissionValue {
    field: string;
    value: unknown;
}
export interface FormSubmission {
    form: Form | string;
    submissionData: SubmissionValue[];
}
export {};
//# sourceMappingURL=types.d.ts.map