import * as React from "bloatless-react"; class Tracker { state: React.State | undefined; } class TrackerMap { trackers = new Map>(); private register = (key: string): Tracker => { if (this.trackers.has(key)) { return this.trackers.get(key); } const tracker = new Tracker(); this.trackers.set(key, tracker); return tracker; }; setState = ( key: string, stateBuilder: () => React.State, ): React.State | undefined => { const tracker: Tracker = this.register(key); if (tracker.state != undefined) { return tracker.state; } else { tracker.state = stateBuilder(); return tracker.state; } }; } export class ViewController { static readonly chatPages = new Tracker(); static readonly taskPages = new TrackerMap(); static readonly boardPages = new TrackerMap(); static readonly inlineReplies = new TrackerMap(); static readonly scrollToView = (id: string) => { const element = document.getElementById(id); if (!element) return; element.scrollIntoView(); element.setAttribute("scrolled", ""); setTimeout(() => element.removeAttribute("scrolled"), 1000); }; static readonly allowDrop = (event: DragEvent) => { event.preventDefault(); }; static readonly allowDrag = (event: DragEvent) => { event.dataTransfer?.setData("text", ""); }; static readonly reload = () => { window.location.reload(); }; static readonly setFocus = () => { const focusedInModal = document.querySelector( ".modal[open] #focused", ) as HTMLElement; if (focusedInModal) return focusedInModal.focus(); document.getElementById("focused")?.focus(); }; static readonly setFocusWithDelay = () => { setTimeout(this.setFocus, 100); }; }