/ src / services / dreamnode-service.ts
dreamnode-service.ts
 1  import { useInterBrainStore } from '../store/interbrain-store';
 2  import { DreamNode } from '../types/dreamnode';
 3  
 4  export class DreamNodeService {
 5    private selectedNodes: Set<string> = new Set();
 6    private currentNode: DreamNode | null = null;
 7  
 8    getCurrentNode(): DreamNode | null {
 9      return this.currentNode;
10    }
11  
12    setCurrentNode(node: DreamNode | null): void {
13      this.currentNode = node;
14      // Sync with Zustand store
15      useInterBrainStore.getState().setSelectedNode(node);
16    }
17  
18    getSelectedNodes(): DreamNode[] {
19      // TODO: Implement fetching actual nodes by IDs
20      console.log('Selected node IDs:', Array.from(this.selectedNodes));
21      return [];
22    }
23  
24    toggleNodeSelection(nodeId: string): void {
25      if (this.selectedNodes.has(nodeId)) {
26        this.selectedNodes.delete(nodeId);
27      } else {
28        this.selectedNodes.add(nodeId);
29      }
30    }
31  
32    clearSelection(): void {
33      this.selectedNodes.clear();
34    }
35  
36    isSelected(nodeId: string): boolean {
37      return this.selectedNodes.has(nodeId);
38    }
39  
40    // Layout management methods
41    setLayout(layout: 'constellation' | 'search' | 'liminal-web' | 'edit' | 'edit-search' | 'copilot'): void {
42      const store = useInterBrainStore.getState();
43      store.setSpatialLayout(layout);
44    }
45  
46    getCurrentLayout(): 'constellation' | 'creation' | 'search' | 'liminal-web' | 'edit' | 'edit-search' | 'copilot' {
47      return useInterBrainStore.getState().spatialLayout;
48    }
49  
50    // Camera management methods
51    resetCamera(): void {
52      const store = useInterBrainStore.getState();
53      // Reset to origin for proper Dynamic View Scaling geometry
54      store.setCameraPosition([0, 0, 0]);
55      store.setCameraTarget([0, 0, 0]);
56      store.setCameraTransition(false);
57    }
58  
59    setCameraPosition(position: [number, number, number]): void {
60      const store = useInterBrainStore.getState();
61      store.setCameraPosition(position);
62    }
63  
64    setCameraTarget(target: [number, number, number]): void {
65      const store = useInterBrainStore.getState();
66      store.setCameraTarget(target);
67    }
68  
69    startCameraTransition(duration: number = 1000): void {
70      const store = useInterBrainStore.getState();
71      store.setCameraTransition(true, duration);
72    }
73  
74    endCameraTransition(): void {
75      const store = useInterBrainStore.getState();
76      store.setCameraTransition(false);
77    }
78  
79    // Relationship management methods
80    async updateRelationships(_nodeId: string, _relationshipIds: string[]): Promise<void> {
81      // This will be implemented by concrete service classes
82      throw new Error('updateRelationships must be implemented by concrete service classes');
83    }
84  
85    async getRelationships(_nodeId: string): Promise<string[]> {
86      // This will be implemented by concrete service classes
87      throw new Error('getRelationships must be implemented by concrete service classes');
88    }
89  
90    async addRelationship(_nodeId: string, _relatedNodeId: string): Promise<void> {
91      // This will be implemented by concrete service classes
92      throw new Error('addRelationship must be implemented by concrete service classes');
93    }
94  
95    async removeRelationship(_nodeId: string, _relatedNodeId: string): Promise<void> {
96      // This will be implemented by concrete service classes
97      throw new Error('removeRelationship must be implemented by concrete service classes');
98    }
99  }