Files
Toju/toju-app/src/app/features/shell/native-context-menu.component.ts
Myx b10004e154
Some checks failed
Queue Release Build / prepare (push) Successful in 17s
Deploy Web Apps / deploy (push) Has started running
Queue Release Build / build-windows (push) Has been cancelled
Queue Release Build / finalize (push) Has been cancelled
Queue Release Build / build-linux (push) Has been cancelled
test: Add playwright main usage test
2026-04-11 16:48:26 +02:00

81 lines
1.8 KiB
TypeScript

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<ContextMenuParams | null>(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();
}
}