import { HTMLElement } from 'server-dom-shim'
import type { ReactiveController, ReactiveControllerHost } from './reactive-controller.ts'
export class HostElement extends HTMLElement implements ReactiveControllerHost {
private _controllers: Set | undefined
private _connected = false
addController(controller: ReactiveController): void {
const controllers = (this._controllers ??= new Set())
if (controllers.has(controller)) {
throw new Error('Controller is already added to the host')
}
controllers.add(controller)
if (this._connected) {
controller.hostConnected?.()
}
}
removeController(controller: ReactiveController): void {
this._controllers?.delete(controller)
}
connectedCallback(): void {
this._connected = true
const controllers = Array.from(this._controllers ?? [])
controllers.forEach((c) => c.hostConnected?.())
}
disconnectedCallback(): void {
this._connected = false
const controllers = Array.from(this._controllers ?? [])
controllers.forEach((c) => c.hostDisconnected?.())
}
}