import { IEventBus } from '../types/CalendarTypes'; import { EventManager } from '../managers/EventManager'; import { EventRenderingService } from '../renderers/EventRendererManager'; import { GridManager } from '../managers/GridManager'; import { ScrollManager } from '../managers/ScrollManager'; import { NavigationManager } from '../managers/NavigationManager'; import { ViewManager } from '../managers/ViewManager'; import { CalendarManager } from '../managers/CalendarManager'; import { DragDropManager } from '../managers/DragDropManager'; import { AllDayManager } from '../managers/AllDayManager'; /** * Factory for creating and managing calendar managers with proper dependency injection */ export class ManagerFactory { private static instance: ManagerFactory; private constructor() {} public static getInstance(): ManagerFactory { if (!ManagerFactory.instance) { ManagerFactory.instance = new ManagerFactory(); } return ManagerFactory.instance; } /** * Create all managers with proper dependency injection */ public createManagers(eventBus: IEventBus): { eventManager: EventManager; eventRenderer: EventRenderingService; gridManager: GridManager; scrollManager: ScrollManager; navigationManager: NavigationManager; viewManager: ViewManager; calendarManager: CalendarManager; dragDropManager: DragDropManager; allDayManager: AllDayManager; } { // Create managers in dependency order const eventManager = new EventManager(eventBus); const eventRenderer = new EventRenderingService(eventBus, eventManager); const gridManager = new GridManager(); const scrollManager = new ScrollManager(); const navigationManager = new NavigationManager(eventBus, eventRenderer); const viewManager = new ViewManager(eventBus); const dragDropManager = new DragDropManager(eventBus); const allDayManager = new AllDayManager(); // CalendarManager depends on all other managers const calendarManager = new CalendarManager( eventBus, eventManager, gridManager, eventRenderer, scrollManager ); return { eventManager, eventRenderer, gridManager, scrollManager, navigationManager, viewManager, calendarManager, dragDropManager, allDayManager }; } /** * Initialize all managers in the correct order */ public async initializeManagers(managers: { calendarManager: CalendarManager; [key: string]: any; }): Promise { try { await managers.calendarManager.initialize(); } catch (error) { throw error; } } }