You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

91 lines
2.5 KiB

import type { Disposable, Uri } from 'vscode';
import { EventEmitter } from 'vscode';
import type { ViewsConfigKeys } from './config';
import type { GitCaches } from './git/gitProvider';
import type { GitCommit } from './git/models/commit';
import type { GitRevisionReference } from './git/models/reference';
import type { WebviewIds } from './webviews/webviewBase';
import type { WebviewViewIds } from './webviews/webviewViewBase';
export type CommitSelectedEvent = EventBusEvent<'commit:selected'>;
interface CommitSelectedEventArgs {
readonly commit: GitRevisionReference | GitCommit;
readonly pin?: boolean;
readonly preserveFocus?: boolean;
readonly preserveVisibility?: boolean;
}
export type FileSelectedEvent = EventBusEvent<'file:selected'>;
interface FileSelectedEventArgs {
readonly uri: Uri;
readonly preserveFocus?: boolean;
readonly preserveVisibility?: boolean;
}
export type GitCacheResetEvent = EventBusEvent<'git:cache:reset'>;
interface GitCacheResetEventArgs {
readonly repoPath?: string;
readonly caches?: GitCaches[];
}
type EventBusEventMap = {
'commit:selected': CommitSelectedEventArgs;
'file:selected': FileSelectedEventArgs;
'git:cache:reset': GitCacheResetEventArgs;
};
interface EventBusEvent<T extends keyof EventBusEventMap = keyof EventBusEventMap> {
name: T;
data: EventBusEventMap[T];
source?: EventBusSource | undefined;
}
export type EventBusSource =
| 'gitlens.rebase'
| `gitlens.${WebviewIds}`
| `gitlens.views.${WebviewViewIds}`
| `gitlens.views.${ViewsConfigKeys}`;
export type EventBusOptions = {
source?: EventBusSource;
};
export class EventBus implements Disposable {
private readonly _emitter = new EventEmitter<EventBusEvent>();
private get event() {
return this._emitter.event;
}
dispose() {
this._emitter.dispose();
}
fire<T extends keyof EventBusEventMap>(name: T, data: EventBusEventMap[T], options?: EventBusOptions) {
this._emitter.fire({
name: name,
data: data,
source: options?.source,
});
}
fireAsync<T extends keyof EventBusEventMap>(name: T, data: EventBusEventMap[T], options?: EventBusOptions) {
queueMicrotask(() => this.fire(name, data, options));
}
on<T extends keyof EventBusEventMap>(
eventName: T,
handler: (e: EventBusEvent<T>) => void,
thisArgs?: unknown,
disposables?: Disposable[],
) {
return this.event(
// eslint-disable-next-line prefer-arrow-callback
function (e) {
if (eventName !== e.name) return;
handler.call(thisArgs, e as EventBusEvent<T>);
},
thisArgs,
disposables,
);
}
}