diff --git a/webapp/channels/src/components/component_library/mm_blocks.cl.tsx b/webapp/channels/src/components/component_library/mm_blocks.cl.tsx index f4b9b495fcc..50bed8d5ab9 100644 --- a/webapp/channels/src/components/component_library/mm_blocks.cl.tsx +++ b/webapp/channels/src/components/component_library/mm_blocks.cl.tsx @@ -16,6 +16,9 @@ import {translateBlockKit} from 'components/block_renderer/translation/block_kit import {translateMMBlocks} from 'components/block_renderer/translation/mm_block'; import PostContext from 'components/post_view/post_context'; +import {type BlockPath, serializeMmBlocks} from './mm_blocks_editor_utils'; +import MmBlocksHierarchyEditor from './mm_blocks_hierarchy_editor'; + import './component_library.scss'; type InputMode = 'mm_blocks' | 'attachments' | 'block_kit' | 'adaptive_cards'; @@ -164,20 +167,31 @@ const MmBlocksComponentLibrary = ({ }: Props) => { const [inputMode, setInputMode] = useState('mm_blocks'); const [drafts, setDrafts] = useState>(() => ({...INITIAL_DRAFTS})); + const [selectedBlockPath, setSelectedBlockPath] = useState(null); const jsonText = drafts[inputMode]; const parsed = useMemo(() => parsePayload(jsonText, inputMode), [jsonText, inputMode]); + const showMmBlocksEditor = inputMode === 'mm_blocks' && parsed.ok; + const onChangeMode = useCallback((e: React.ChangeEvent) => { setInputMode(e.target.value as InputMode); + setSelectedBlockPath(null); }, []); const onChangeJson = useCallback((e: React.ChangeEvent) => { const value = e.target.value; setDrafts((d) => ({...d, [inputMode]: value})); + if (inputMode === 'mm_blocks') { + setSelectedBlockPath(null); + } }, [inputMode]); + const onHierarchyBlocksChange = useCallback((blocks: MmBlock[]) => { + setDrafts((d) => ({...d, mm_blocks: serializeMmBlocks(blocks)})); + }, []); + const onAction = useCallback((actionId: string, selectedOption?: string, query?: Record, attachmentCookie?: string) => { const parts = [ `action_id: ${actionId}`, @@ -218,17 +232,27 @@ const MmBlocksComponentLibrary = ({ {modeOptions} -