|
|
- 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,
- );
- }
- }
|