import Socket from "/_/code/ws/Socket.js" import "./Home/Home.js" import "./Home/AuthPage/AuthPage.js" import "./Home/ConnectionError.js" import util from "./util.js" let Global = class { Socket = new Socket() profile = null currentNetwork = "" lastApp = "" currentApp() { const pathname = window.location.pathname; const segments = pathname.split('/').filter(Boolean); const secondSegment = segments[1] || "" const capitalized = secondSegment.charAt(0).toUpperCase() + secondSegment.slice(1); return capitalized } openApp = function(appName) { const appUrl = appName.charAt(0).toLowerCase() + appName.slice(1); let parts = window.location.pathname.split('/').filter(Boolean); let newPath = "/" + parts[0] + "/" + appUrl window.navigateTo(newPath) const event = new CustomEvent('appchange', { detail: { name: appName } }); window.dispatchEvent(event) } async fetchAppData() { let personalSpace = this.currentNetwork === this.profile if (personalSpace) { return {} } let appData = await fetch(`${util.HOST}/api/${personalSpace ? "my" : "org"}data/` + this.currentNetwork.id, {method: "GET"}) let json = await appData.json() return json } onNavigate = async () => { let selectedNetwork = this.networkFromPath() if(!selectedNetwork) { if (!this.currentNetwork || this.currentNetwork === this.profile) { let path = `/${this.getDefaultNetworkName()}/${this.getDefaultAppName()}` history.replaceState({}, '', path) } } else if(!this.currentApp()) { if(this.currentNetwork === window.profile) { history.replaceState({}, '', `${window.location.pathname}/${window.profile.apps[0]}`) } else { history.replaceState({}, '', `${window.location.pathname}/${this.getDefaultAppName()}`) } } selectedNetwork = this.networkFromPath() let networkChanged = this.currentNetwork !== selectedNetwork let appChanged = this.currentApp() !== this.lastApp if(appChanged) { this.lastApp = this.currentApp() } if(networkChanged) { this.currentNetwork = selectedNetwork const event = new CustomEvent('networkchange', { detail: { name: this.currentNetwork } }); window.dispatchEvent(event) } if(!this.currentNetwork?.data) { this.currentNetwork.data = await this.fetchAppData() } if(appChanged && !networkChanged) { const event = new CustomEvent('appchange', { detail: { name: this.currentApp() } }); window.dispatchEvent(event) } document.title = (this.currentNetwork === this.profile) ? "Forum" : `${this.currentNetwork.abbreviation} | Forum` } setCurrentNetworkAndApp() { this.currentNetwork = this.networkFromPath() } getDefaultNetworkName() { let defaultNetwork = this.profile.networks[0] if (!defaultNetwork) { return "my"; } return defaultNetwork.abbreviation } getDefaultAppName() { let defaultNetwork = this.profile.networks[0] if (!defaultNetwork) { return this.profile.apps[0].toLowerCase(); } return defaultNetwork.apps[0].toLowerCase() } networkFromPath = function () { const pathname = window.location.pathname; const firstSegment = pathname.split('/').filter(Boolean)[0] || ''; if(firstSegment === "my") { return this.profile } else { let networks = this.profile.networks for(let i = 0; i < networks.length; i++) { let network = networks[i] if(network.abbreviation === firstSegment) { return network } } } } async getProfile() { try { const res = await util.authFetch(`${util.HOST}/profile`, { method: "GET", credentials: "include", headers: { "Accept": "application/json" } }); if(res.status === 401) { return res.status } if (!res.ok) return res.status; const profile = await res.json(); console.log("getProfile: ", profile); this.profile = profile return 200; } catch (err) { // Network error / Error reaching server console.error(err); return 500; } } async renderHome() { location.reload() } async onLogout() { await util.removeAuthToken() await fetch(`${util.HOST}/signout`, { method: "GET", credentials: "include" }); this.profile = null location.reload() } constructor() { window.addEventListener("navigate", this.onNavigate) this.getProfile().then(async (status) => { if (status === 401) { AuthPage() } else if(status === 500) { ConnectionError() } else { await this.Socket.init() await this.onNavigate() Home() } }) } } window.global = new Global()