import { ExtensionInfoByLanguageResponse, ExtensionLinkReadResponse } from '@stack-spot/portal-network/api/account' import { uniqBy } from 'lodash' export interface Extension { slug: string, url: string, displayName: ExtensionInfoByLanguageResponse, links?: ExtensionLinkReadResponse[], } export class ExtensionRegister { protected extensions: Record = {} protected listeners: (() => void)[] = [] getExtensions(): Record | undefined { return this.extensions } getExtension(slug: string): Extension | undefined { return this.extensions[slug] } getWorkspaceDashboard(workspaceId: string) { return Object.values(this.extensions).filter( e => e.links?.some(l => l.type === 'dashboard' && (!l.workspaceId || l.workspaceId === workspaceId)), ) } hasExtension() { return Object.keys(this.extensions).length > 0 } register(extension: Extension) { if (!extension) return const ext = this.extensions[extension?.slug] if (ext) { ext.links = uniqBy([...(extension.links ?? []), ...(ext.links ?? [])], l => l.type) } else { this.extensions[extension?.slug] = extension } this.listeners.forEach(l => l()) } unregister(slug: string) { delete this.extensions[slug] this.listeners.forEach(l => l()) } onChange(listener: () => void) { this.listeners.push(listener) return () => { this.listeners = this.listeners.filter(l => l !== listener) } } } export const extensionRegister = new ExtensionRegister()