import * as vscode from 'vscode'; import { clearGitRootCache } from '../archify/runtime'; import { ModelService } from '../model/service'; import { isArchifyFile, isArchifyHtml, isDiagramFileName, readDiagramSource } from '../sources/detect'; const JSON_LANGUAGES = new Set(['json', 'jsonc']); /** Keeps the archify.* context keys (editor title buttons, keybindings) up to date. */ export function registerContextKeys(context: vscode.ExtensionContext, models: ModelService): void { let contextTimer: NodeJS.Timeout | undefined; const updateContext = () => { const doc = vscode.window.activeTextEditor?.document; if (doc) void models.rootOf(doc.uri).then((root) => vscode.commands.executeCommand('setContext', 'archify.inModel', Boolean(root))); const diagram = Boolean( doc && (isArchifyFile(doc.fileName) || (JSON_LANGUAGES.has(doc.languageId) && (isDiagramFileName(doc.fileName) || readDiagramSource(doc.getText(), doc.fileName)))), ); const html = Boolean(doc && doc.languageId === 'html' && isArchifyHtml(doc.getText())); void vscode.commands.executeCommand('setContext', 'archify.isDiagramSource', diagram); void vscode.commands.executeCommand('setContext', 'archify.isArchifyHtml', html); }; context.subscriptions.push( vscode.window.onDidChangeActiveTextEditor(updateContext), vscode.workspace.onDidChangeTextDocument((event) => { if (event.document !== vscode.window.activeTextEditor?.document) return; clearTimeout(contextTimer); contextTimer = setTimeout(updateContext, 300); }), vscode.workspace.onDidChangeConfiguration((event) => { if (event.affectsConfiguration('archify.repoRoot')) clearGitRootCache(); }), { dispose: () => clearTimeout(contextTimer) }, ); updateContext(); }