import { defineComponent, provide, shallowReactive, ref, PropType, Ref, } from 'vue'; import { model, Block, BlockDefinition, BlockLibraryDefinition, } from '/@/blocks'; import { Mode, SbMode } from '/@/mode'; import { BlockLibrary } from '/@/use-dynamic-blocks'; import { EditorDimensions, useResizeObserver } from '/@/use-resize-observer'; import { ActiveBlock } from '/@/use-activation'; import SbBlock from '/@internal/Block'; import SbLayout from '/@user/Layout/index'; import SbParagraph from '/@user/Paragraph/index'; import SbImage from '/@user/Image/index'; import SbHeading from '/@user/Heading/index'; import './Schlechtenburg.scss'; export interface SchlechtenburgProps { customBlocks: BlockDefinition[]; eventUpdate: (b: Block) => void; block: Block; mode: SbMode; } export default defineComponent({ name: 'schlechtenburg-main', model, props: { customBlocks: { type: Array as PropType, default: () => [] }, block: { type: Object as PropType>, required: true }, eventUpdate: { type: Function, default: () => {} }, mode: { type: String as PropType, validator(value: any) { return Object.values(SbMode).includes(value); }, default: SbMode.Edit, }, }, setup(props: SchlechtenburgProps) { const el: Ref = ref(null); useResizeObserver(el, EditorDimensions); const mode = ref(props.mode); provide(Mode, mode); const activeBlock = ref(null); provide(ActiveBlock, activeBlock); const blockLibrary: BlockLibraryDefinition = shallowReactive({ 'sb-layout': SbLayout, 'sb-image': SbImage, 'sb-paragraph': SbParagraph, 'sb-heading': SbHeading, ...props.customBlocks.reduce( (blocks: {[name: string]: Block}, block: Block) => ({ ...blocks, [block.name]: block }), {}, ), }); provide(BlockLibrary, blockLibrary); return () => (
); }, });