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 }