import { Component, OnInit, OnDestroy, inject, signal } from '@angular/core'; import { ElectronBridgeService } from '../../core/platform/electron/electron-bridge.service'; import { ContextMenuComponent } from '../../shared'; import type { ContextMenuParams } from '../../core/platform/electron/electron-api.models'; @Component({ selector: 'app-native-context-menu', standalone: true, imports: [ContextMenuComponent], templateUrl: './native-context-menu.component.html' }) export class NativeContextMenuComponent implements OnInit, OnDestroy { params = signal(null); private readonly electronBridge = inject(ElectronBridgeService); private cleanup: (() => void) | null = null; ngOnInit(): void { const api = this.electronBridge.getApi(); if (!api?.onContextMenu) { return; } this.cleanup = api.onContextMenu((incoming) => { const hasContent = incoming.isEditable || !!incoming.selectionText || !!incoming.linkURL || (incoming.mediaType === 'image' && !!incoming.srcURL); this.params.set(hasContent ? incoming : null); }); } ngOnDestroy(): void { this.cleanup?.(); this.cleanup = null; } close(): void { this.params.set(null); } execCommand(command: string): void { const api = this.electronBridge.getApi(); if (api?.contextMenuCommand) { api.contextMenuCommand(command); } this.close(); } copyLink(): void { const url = this.params()?.linkURL; if (url) { navigator.clipboard.writeText(url).catch(() => {}); } this.close(); } copyImage(): void { const srcURL = this.params()?.srcURL; const api = this.electronBridge.getApi(); if (srcURL && api?.copyImageToClipboard) { api.copyImageToClipboard(srcURL).catch(() => {}); } this.close(); } }