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'; import { CalendarManagers } from '../types/ManagerTypes'; /** * 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): CalendarManagers { // 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: CalendarManagers): Promise { try { await managers.calendarManager.initialize?.(); } catch (error) { throw error; } } }