refactor(block-h): message block types resolve via plugin-contributable registry
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Message block type registry.
|
||||
*
|
||||
* Core owns the base block types; plugins can contribute additional block
|
||||
* renderers via ``registerBlockType`` / ``unregisterBlockTypes`` during their
|
||||
* frontend activation lifecycle (Block H / HC-F).
|
||||
*/
|
||||
import type { ComponentType } from 'react';
|
||||
import type { MessageBlock } from '@/store/commStore';
|
||||
|
||||
export type BlockComponent = ComponentType<{ block: MessageBlock }>;
|
||||
|
||||
const _registry = new Map<string, BlockComponent>();
|
||||
|
||||
export function registerBlockType(blockType: string, component: BlockComponent, owner = ''): void {
|
||||
if (_registry.has(blockType)) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.warn(`[blockRegistry] block type '${blockType}' re-registered by '${owner || 'unknown'}' — overwriting`);
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
(component as any).__block_owner__ = owner;
|
||||
_registry.set(blockType, component);
|
||||
}
|
||||
|
||||
export function unregisterBlockTypes(owner: string): void {
|
||||
for (const [key, component] of _registry.entries()) {
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
if ((component as any).__block_owner__ === owner) {
|
||||
_registry.delete(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function getBlockComponent(blockType: string): BlockComponent | undefined {
|
||||
return _registry.get(blockType);
|
||||
}
|
||||
Reference in New Issue
Block a user