mirror of
https://github.imc.re/void-land/hyprland-void-dots
synced 2025-10-03 13:55:02 +02:00
114 lines
3.2 KiB
TypeScript
114 lines
3.2 KiB
TypeScript
import GLib from "gi://GLib?version=2.0"
|
|
import icons from "lib/icons"
|
|
import { bash } from "lib/utils"
|
|
|
|
const userName = await bash("find /home -maxdepth 1 -printf '%f\n' | tail -n 1")
|
|
const iconFile = `/var/lib/AccountsService/icons/${userName}`
|
|
|
|
// FIXME: AccountsService crashes?
|
|
// import AccountsService from "gi://AccountsService?version=1.0"
|
|
// const { iconFile, realName, userName } = AccountsService.UserManager
|
|
// .get_default().list_users()[0]
|
|
|
|
const loggingin = Variable(false)
|
|
|
|
const CMD = GLib.getenv("ASZTAL_DM_CMD")
|
|
|| "Hyprland"
|
|
|
|
const ENV = GLib.getenv("ASZTAL_DM_ENV")
|
|
|| "WLR_NO_HARDWARE_CURSORS=1 _JAVA_AWT_WM_NONREPARENTING=1"
|
|
|
|
async function login(pw: string) {
|
|
loggingin.value = true
|
|
const greetd = await Service.import("greetd")
|
|
return greetd.login(userName, pw, CMD, ENV.split(/\s+/))
|
|
.catch(res => {
|
|
loggingin.value = false
|
|
response.label = res?.description || JSON.stringify(res)
|
|
password.text = ""
|
|
revealer.reveal_child = true
|
|
})
|
|
}
|
|
|
|
const avatar = Widget.Box({
|
|
class_name: "avatar",
|
|
hpack: "center",
|
|
css: `background-image: url('${iconFile}')`,
|
|
})
|
|
|
|
const password = Widget.Entry({
|
|
placeholder_text: "Password",
|
|
hexpand: true,
|
|
visibility: false,
|
|
on_accept: ({ text }) => { login(text || "") },
|
|
})
|
|
|
|
const response = Widget.Label({
|
|
class_name: "response",
|
|
wrap: true,
|
|
max_width_chars: 35,
|
|
hpack: "center",
|
|
hexpand: true,
|
|
xalign: .5,
|
|
})
|
|
|
|
const revealer = Widget.Revealer({
|
|
transition: "slide_down",
|
|
child: response,
|
|
})
|
|
|
|
export default Widget.Box({
|
|
class_name: "auth",
|
|
attribute: { password },
|
|
vertical: true,
|
|
children: [
|
|
Widget.Overlay({
|
|
child: Widget.Box(
|
|
{
|
|
css: "min-width: 200px; min-height: 200px;",
|
|
vertical: true,
|
|
},
|
|
Widget.Box({
|
|
class_name: "wallpaper",
|
|
css: `background-image: url('${WALLPAPER}')`,
|
|
}),
|
|
Widget.Box({
|
|
class_name: "wallpaper-contrast",
|
|
vexpand: true,
|
|
}),
|
|
),
|
|
overlay: Widget.Box(
|
|
{
|
|
vpack: "end",
|
|
vertical: true,
|
|
},
|
|
avatar,
|
|
Widget.Box({
|
|
hpack: "center",
|
|
children: [
|
|
Widget.Icon(icons.ui.avatar),
|
|
Widget.Label(userName),
|
|
],
|
|
}),
|
|
Widget.Box(
|
|
{
|
|
class_name: "password",
|
|
},
|
|
Widget.Spinner({
|
|
visible: loggingin.bind(),
|
|
active: true,
|
|
}),
|
|
Widget.Icon({
|
|
visible: loggingin.bind().as(b => !b),
|
|
icon: icons.ui.lock,
|
|
}),
|
|
password,
|
|
),
|
|
),
|
|
}),
|
|
Widget.Box(
|
|
{ class_name: "response-box" },
|
|
revealer,
|
|
),
|
|
],
|
|
})
|