Architecture: How to implement DRY pattern for embeddable tool components?
Documentation for Sessions
🏗️ Architecture: How to implement DRY pattern for embeddable tool components?
📋 Decision Context
Question:
How to implement DRY pattern for embeddable tool components?
Task: Fix tool switching in Unified Builder - embeddables not implementing EmbeddableTool interface
🎯 Decision Made
Chosen:
Create BaseEmbeddableComponent abstract class with shared logic
Options Considered:
- Copy-paste EmbeddableTool interface implementation to each component
- Create BaseEmbeddableComponent abstract class with shared logic
- Use composition with a wrapper service
💭 Reasoning
Following the project's existing patterns (BaseWidgetService, FlashPersistenceRouteComponent), created an abstract base class that: (1) Implements EmbeddableTool interface with default behaviors, (2) Handles cross-tool sync subscription/cleanup automatically, (3) Provides abstract methods for tool-specific logic (selectItemsInternal, getSelectedItemIdsInternal, clearSelectionInternal), (4) Provides virtual methods for optional overrides (focusOnItemInternal, fitToViewInternal, getViewStateInternal, etc.). This reduced ~100 lines of boilerplate per embeddable to ~30 lines of tool-specific code.
📁 Files Involved
libs/libs-foundational/core-angular/src/lib/components/base-embeddable.component.tslibs/libs-space/universe-architect/src/lib/components/architect-embeddable/architect-embeddable.component.tslibs/libs-structural/page-builder/src/lib/components/page-builder-embeddable/page-builder-embeddable.component.tslibs/libs-structural/singularity-lib/src/lib/components/singularity-embeddable/singularity-embeddable.component.tslibs/libs-space/universe-canvas/src/lib/components/universe-canvas-embeddable/universe-canvas-embeddable.component.tslibs/libs-structural/vibe-universe/src/lib/components/vibe-universe-embeddable/vibe-universe-embeddable.component.tslibs/libs-structural/modular-universe/src/lib/components/modular-universe-embeddable/modular-universe-embeddable.component.tslibs/libs-structural/universe-map/src/lib/components/universe-map-embeddable/universe-map-embeddable.component.ts
🔗 Related
- Decision ID:
dev_1768006448413_c0ah8uj - Session: 35
- Workspace: editor2
Auto-generated by MCP Smart Consolidation