import { createSignal, mergeProps, createResource, createEffect, onMount, onCleanup, } from "solid-js"; import { computePosition, shift, autoUpdate, offset } from "@floating-ui/dom"; import UserService from "../services/user-service.js"; import ModalRegistry from "../modals/modal-registry.jsx"; import UrlUtils from "../tools/url-utils.js"; import SettingsView from "./settings-view.jsx"; import DevicesView from "./devices-view.jsx"; import { DEVICES_VIEW, REMOTES_VIEW, RECORDINGS_VIEW, SETTINGS_VIEW, } from "../data/constants.js"; let [activeView, setActiveView] = createSignal(DEVICES_VIEW); const MainView = function (props) { props = mergeProps({ onLogout: () => {} }, props); const [userInfo] = createResource(() => UserService.getUserInfo()); const [username, setUsername] = createSignal(""); createEffect(() => { if (userInfo.loading) return; setUsername(userInfo().username); }); let Modals = ModalRegistry.getModals(); let userButtonRef; let userMenuRef; let userMenuBackRef; let cleanUserMenu; onMount(() => { setViewFromUrl(); window.addEventListener("popstate", setViewFromUrl); }); onCleanup(() => { window.removeEventListener("popstate", setViewFromUrl); }); function setViewFromUrl() { let view = UrlUtils.getQueryParameter("view"); if (view) { setActiveView(view); } } function handleLogout() { UserService.logout(); props.onLogout(); } function toggleUserMenu() { if (userMenuRef.style.display === "none") { showUserMenu(); } else { hideUserMenu(); } } function showUserMenu() { cleanUserMenu = autoUpdate(userButtonRef, userMenuRef, () => computePosition(userButtonRef, userMenuRef, { placement: "bottom-end", middleware: [offset(6), shift()], }).then(({ x, y }) => { Object.assign(userMenuRef.style, { left: `${x}px`, top: `${y}px`, }); }) ); userMenuRef.style.display = "block"; userMenuBackRef.style.display = "block"; } function hideUserMenu() { userMenuRef.style.display = "none"; userMenuBackRef.style.display = "none"; cleanUserMenu(); } function handleViewChange(view) { if (activeView() === view) return; setActiveView(view); let url = UrlUtils.getUrl(); url = UrlUtils.addQueryParameter(url, "view", view); UrlUtils.setUrl(url); } function render() { return (