import { AppClosedEvent, AppOpenedEvent, Plugin } from '../types'
import { getTime } from '../utils'
class StatusBar {
element: HTMLElement
/**
* Creates the status bar.
*/
constructor () {
this.element = document.createElement('toolbar')
this.element.innerHTML = `
space_dashboard
${/* widgets
*/ ''}
expand_less
battery_2_bar
signal_cellular_4_bar
${/*
notifications
*/ ''}
`
setInterval((): any => {
getTime().then((time) => {
(this.element.querySelector('div[data-toolbar-id="calendar"]') as HTMLElement).innerText = time
}).catch(e => console.error)
}, 1000)
this.element.querySelector('div[data-toolbar-id="start"]')?.addEventListener('click', () => {
window.wm.toggleLauncher()
})
function updateBatteryIcon (battery: any): void {
let iconHTML = ''
if (battery.charging === true) {
if (battery.level === 1) {
iconHTML = 'battery_charging_full'
} else if (battery.level >= 0.9) {
iconHTML = 'battery_charging_90'
} else if (battery.level >= 0.8) {
iconHTML = 'battery_charging_80'
} else if (battery.level >= 0.6) {
iconHTML = 'battery_charging_60'
} else if (battery.level >= 0.5) {
iconHTML = 'battery_charging_50'
} else if (battery.level >= 0.3) {
iconHTML = 'battery_charging_30'
} else if (battery.level >= 0) {
iconHTML = 'battery_charging_20'
}
} else {
if (battery.level === 1) {
iconHTML = 'battery_full'
} else if (battery.level >= 0.6) {
iconHTML = 'battery_6_bar'
} else if (battery.level >= 0.5) {
iconHTML = 'battery_5_bar'
} else if (battery.level >= 0.4) {
iconHTML = 'battery_4_bar'
} else if (battery.level >= 0.3) {
iconHTML = 'battery_3_bar'
} else if (battery.level >= 0.2) {
iconHTML = 'battery_2_bar'
} else if (battery.level >= 0.1) {
iconHTML = 'battery_1_bar'
} else if (battery.level >= 0) {
iconHTML = 'battery_0_bar'
}
}
const batteryDiv = document.querySelector('div[data-toolbar-id="controls"] > .battery')
if (batteryDiv != null) {
batteryDiv.innerHTML = iconHTML
}
}
if ('getBattery' in navigator) {
(navigator as any).getBattery().then(function (battery: any) {
updateBatteryIcon(battery)
battery.addEventListener('levelchange', function () {
updateBatteryIcon(battery)
})
battery.addEventListener('chargingchange', function () {
updateBatteryIcon(battery)
})
})
} else {
const batteryDiv = document.querySelector('div[data-toolbar-id="controls"] > .battery')
if (batteryDiv != null) {
batteryDiv.innerHTML = 'battery_unknown'
}
}
function updateIcon (ms: number): void {
let icon = ''
if (ms >= 200 && ms < 400) {
icon = 'signal_cellular_1_bar'
} else if (ms >= 400 && ms < 600) {
icon = 'signal_cellular_2_bar'
} else if (ms >= 600 && ms < 800) {
icon = 'signal_cellular_3_bar'
} else if (ms >= 800) {
icon = 'signal_cellular_4_bar'
} else {
icon = 'signal_cellular_0_bar'
}
(document.querySelector('div[data-toolbar-id="controls"] > .signal') as HTMLElement).innerHTML = icon
}
async function ping (startTime: number): Promise {
fetch((await window.config()).SERVER_URL + '/bare/')
.then(() => {
const endTime = performance.now()
const pingTime = endTime - startTime
updateIcon(pingTime)
})
.catch(() => {
(document.querySelector('div[data-toolbar-id="controls"] > .signal') as HTMLElement).innerHTML = 'signal_cellular_connected_no_internet_4_bar'
})
}
setInterval((): any => ping(performance.now()), 10000)
window.addEventListener('app_opened', (e: AppOpenedEvent): void => {
const appIcon = document.createElement('app')
const app = e.detail.app
const win = e.detail.win
appIcon.innerHTML = `
`
appIcon.onclick = async () => {
const win = await e.detail.win
win.focus()
win.toggleMin()
}
this.element.querySelector('div[data-toolbar-id="apps"]')?.appendChild(appIcon)
})
window.addEventListener('app_closed', (e: AppClosedEvent): void => {
const win = e.detail.win
this.element.querySelector('div[data-toolbar-id="apps"]')?.querySelector(`img[data-id="${win.id}"]`)?.parentElement?.remove()
})
document.body.style.flexDirection = 'column-reverse'
document.body.appendChild(this.element)
}
/**
* Adds a plugin to the status bar.
*
* @param item The plugin to be added to the status bar.
*/
async add (item: Plugin): Promise {
const element = document.createElement('div')
element.setAttribute('data-toolbar-id', item.meta.pkg)
this.element.appendChild(element)
await item.run(element, await window.config())
}
/**
* Initiates the status bar.
*/
async init (): Promise {
window.preloader.setStatus('adding plugins to statusbar...')
for (const plugin of window.flow.plugins) {
window.preloader.setStatus(`adding plugins to statusbar\n${plugin.meta.pkg}`)
await this.add(plugin)
}
await window.preloader.setDone('plugins')
}
}
export default StatusBar