/ packages / ui / src / services / AppbarButtonService.ts
AppbarButtonService.ts
 1  import { computed, Signal } from '@preact/signals-react';
 2  
 3  export interface IAppbarButtonOptions {
 4  	position: 'start' | 'end';
 5  	component: any;
 6  	sortIndex?: number;
 7  }
 8  
 9  export const AppbarButtonServiceSymbol = Symbol.for('AppbarButtonService');
10  
11  export class AppbarButtonService {
12  	public registerAppbarButton(options: IAppbarButtonOptions): Symbol {
13  		const id = Symbol();
14  		this.buttons.value = [...this.buttons.value, { ...options, id }];
15  		return id;
16  	}
17  
18  	public unRegisterAppbarButton(id: Symbol): void {
19  		this.buttons.value = this.buttons.value.filter((b) => b.id !== id);
20  	}
21  
22  	public startButtons = computed(() => this.transform(this.buttons.value, 'start'));
23  	public endButtons = computed(() => this.transform(this.buttons.value, 'end'));
24  
25  	private transform(items: IAppbarButtonOptions[], position: 'start' | 'end') {
26  		return items.filter(b => b.position === position).sort((a, b) => (a.sortIndex ?? 1) - (b.sortIndex ?? 1)).map(b => b.component);
27  	}
28  
29  	private buttons = new Signal<(IAppbarButtonOptions & { id: Symbol; })[]>([]);
30  }