aboutsummaryrefslogtreecommitdiff
path: root/linux/home/.config/ags/greeter/auth.ts
blob: 23477ebc05211a9f1ec7a93d3c9cb0fdebc6ee6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import AccountsService from "gi://AccountsService?version=1.0"
import GLib from "gi://GLib?version=2.0"
import icons from "lib/icons"

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(realName || 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,
        ),
    ],
})