37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
/**
|
|
* 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);
|
|
}
|