44 lines
1.4 KiB
TypeScript
44 lines
1.4 KiB
TypeScript
/**
|
||
* documentService – Prozessweiter Zugriffspunkt auf das aktive CADDocument.
|
||
*
|
||
* Warum: CanvasArea besitzt die V2-Dokumentinstanz (Task A4.1), aber App-Level
|
||
* UI (HistoryPanel, Tastenkürzel Strg+Z/Y) benötigt Zugriff OHNE prop-
|
||
* threading durch die God-Component. Dieser Service ist die bewusste,
|
||
* dokumentierte Ausnahme von der Reinheitsregel — nur EINE Instanz aktiv.
|
||
*
|
||
* Setzen/Entfernen übernimmt CanvasArea im Mount-/Cleanup-Zyklus.
|
||
*/
|
||
import type { CADDocument } from './CADDocument';
|
||
|
||
type Listener = () => void;
|
||
|
||
let activeDoc: CADDocument | null = null;
|
||
const listeners = new Set<Listener>();
|
||
|
||
/** Registriert das aktive Dokument (CanvasArea-Mount). */
|
||
export function setActiveDocument(doc: CADDocument | null): void {
|
||
activeDoc = doc;
|
||
listeners.forEach((l) => l());
|
||
}
|
||
|
||
/** Aktives Dokument oder null (z.B. wenn Flag aus / Canvas unmounted). */
|
||
export function getActiveDocument(): CADDocument | null {
|
||
return activeDoc;
|
||
}
|
||
|
||
/** Änderungsabonnement (für React-Hooks). Liefert Unsubscribe. */
|
||
export function onActiveDocumentChanged(cb: Listener): () => void {
|
||
listeners.add(cb);
|
||
return () => listeners.delete(cb);
|
||
}
|
||
|
||
/** Bequemlichkeit: globaler Undo am aktiven Dokument. false wenn kein Doc/Stack leer. */
|
||
export function undoActive(): boolean {
|
||
return activeDoc?.undo() ?? false;
|
||
}
|
||
|
||
/** Bequemlichkeit: globales Redo am aktiven Dokument. */
|
||
export function redoActive(): boolean {
|
||
return activeDoc?.redo() ?? false;
|
||
}
|