import { defineComponent, provide, shallowReactive, ref, watch, 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 { SbMainMenu } from './MainMenu'; import { SbBlock } from './Block'; import './Schlechtenburg.scss'; export interface SchlechtenburgProps { customBlocks: BlockDefinition[]; onUpdate: (b: Block) => void; block: Block; mode: SbMode; } export const Schlechtenburg = defineComponent({ name: 'schlechtenburg-main', model, props: { customBlocks: { type: Array as PropType, default: () => [] }, block: { type: Object as PropType>, required: true }, onUpdate: { 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({ ...props.customBlocks.reduce( (blocks: {[name: string]: Block}, block: Block) => ({ ...blocks, [block.name]: block }), {}, ), }); provide(BlockLibrary, blockLibrary); watch(props.block, () => { console.log('Update', props.block); }); return () => (
); }, });