From 46c34e169dc21be0ba91356080dd2575506fbd8b Mon Sep 17 00:00:00 2001 From: Jas Singh Date: Sun, 23 Jun 2024 12:06:53 -0700 Subject: [PATCH] Finish network module for now... replace nmcli with something better later (it sucks at auth) --- modules/bar/menu/index.js | 3 + modules/menus/network/index.js | 529 ++++++++++++++++++++++++++------- modules/notifications/index.js | 2 +- scss/menus/network.scss | 59 ++++ scss/notifications/popups.scss | 5 +- style.css | 55 +++- style.css.map | 2 +- 7 files changed, 546 insertions(+), 109 deletions(-) diff --git a/modules/bar/menu/index.js b/modules/bar/menu/index.js index 529fb88..4c8abcc 100644 --- a/modules/bar/menu/index.js +++ b/modules/bar/menu/index.js @@ -1,6 +1,9 @@ +import { exec } from "resource:///com/github/Aylur/ags/utils.js"; + export const Menu = () => { return Widget.Box({ child: Widget.Button({ + on_primary_click: () => exec('/home/jaskir/.config/hypr/scripts/rofi.sh'), child: Widget.Label({ class_name: "bar-menu_label", label: "󰣇", diff --git a/modules/menus/network/index.js b/modules/menus/network/index.js index 5845b19..b64dd09 100644 --- a/modules/menus/network/index.js +++ b/modules/menus/network/index.js @@ -3,9 +3,11 @@ import DropdownMenu from "../DropdownMenu.js"; export default () => { network.connect("changed", (value) => { - console.log(JSON.stringify(value, null, 2)); + // console.log(JSON.stringify(value, null, 2)); }); + const pendingAuth = Variable(""); + return DropdownMenu({ name: "networkmenu", transition: "crossfade", @@ -42,55 +44,203 @@ export default () => { vertical: true, setup: (self) => { self.hook(network, () => { - let sortedNetworks = []; + // console.log(JSON.stringify(network, null, 2)); + self.hook(pendingAuth, () => { + let sortedNetworks = []; - if (network.wifi.access_points.length > 0) { - sortedNetworks = network.wifi.access_points - .filter((ap) => ap.ssid !== "Unknown") - .sort((a, b) => { - if (a.ssid === network.wifi.ssid) { - return -1; - } else if (b.ssid === network.wifi.ssid) { - return 1; - } else { + if (network.wifi.access_points.length > 0) { + sortedNetworks = network.wifi.access_points + .filter((ap) => ap.ssid !== "Unknown") + .sort((a, b) => { return b.strength - a.strength; - } - }); - } + }); + } - const localIfConnected = () => { - if (network.primary === "wired") { - return Widget.Box({ - class_name: `network-element-item-ethernet ${sortedNetworks.length > 0 ? "multi" : ""}`, - child: Widget.Box({ - hpack: "start", - vertical: true, - children: [ - Widget.Box({ - class_name: "network-element-items-container", + const localIfConnected = () => { + if (network.primary === "wired") { + return [ + Widget.Box({ + class_name: `network-element-item-ethernet ${sortedNetworks.length > 0 ? "multi" : ""}`, + child: Widget.Box({ + hpack: "start", + vertical: true, children: [ - Widget.Button({ - class_name: "menu-button-icon network", - child: Widget.Icon({ - tooltip_text: network.wired.internet, - icon: `${network.wired["icon_name"]}`, - }), + Widget.Box({ + children: [ + Widget.Box({ + class_name: + "network-element-items-container", + children: [ + Widget.Button({ + class_name: "menu-button-icon network", + child: Widget.Icon({ + tooltip_text: network.wired.internet, + icon: `${network.wired["icon_name"]}`, + }), + }), + Widget.Label({ + class_name: "menu-button-name network", + truncate: "end", + wrap: true, + label: `Ethernet (${network.wired.speed / 1000} Gbps)`, + }), + ], + }), + ], }), - Widget.Label({ - class_name: "menu-button-name network", - truncate: "end", - wrap: true, - label: `Ethernet (${network.wired.speed / 1000} Gbps)`, + Widget.Box({ + class_name: + "menu-button-name-container status dim", + children: [ + Widget.Label({ + class_name: + "menu-button-name status network dim", + label: + network.wired.internet + .charAt(0) + .toUpperCase() + + network.wired.internet.slice(1), + }), + ], }), ], }), - ], - }), - }); - } - return Widget.Box({}); - }; - return (self.child = localIfConnected()); + }), + ]; + } + return []; + }; + + const wifiIfConnected = () => { + const getIdBySsid = (ssid, nmcliOutput) => { + const lines = nmcliOutput.trim().split("\n"); + for (const line of lines) { + const columns = line.trim().split(/\s{2,}/); + if (columns[0].includes(ssid)) { + return columns[1]; + } + } + return null; + }; + + if (network.wifi.ssid !== "") { + return [ + Widget.Box({ + class_name: `network-element-item-ethernet`, + children: [ + Widget.Box({ + hpack: "start", + vertical: true, + children: [ + Widget.Box({ + children: [ + Widget.Box({ + class_name: + "network-element-items-container", + children: [ + Widget.Button({ + class_name: + "menu-button-icon network", + child: Widget.Icon({ + tooltip_text: network.wifi.state, + icon: `${network.wifi["icon_name"]}`, + }), + }), + Widget.Label({ + class_name: + "menu-button-name network", + truncate: "end", + wrap: true, + label: network.wifi.ssid, + }), + ], + }), + ], + }), + Widget.Box({ + class_name: + "menu-button-name-container status dim", + children: [ + Widget.Label({ + class_name: + "menu-button-name status network dim", + label: + network.wifi.internet + .charAt(0) + .toUpperCase() + + network.wifi.internet.slice(1), + }), + ], + }), + ], + }), + Widget.Box({ + hexpand: true, + hpack: "end", + children: [ + Widget.Button({ + class_name: + "menu-icon-button network disconnect", + on_primary_click: () => { + Utils.execAsync( + "nmcli connection show --active", + ).then((res) => { + const connectionId = getIdBySsid( + network.wifi.ssid, + res, + ); + + Utils.execAsync( + `nmcli connection down ${connectionId} "${network.wifi.ssid}"`, + ).catch((err) => + console.error( + `Error while disconnecting from wifi "${network.wifi.ssid}": ${err}`, + ), + ); + }); + }, + child: Widget.Label(""), + }), + Widget.Box({ + hexpand: true, + child: Widget.Button({ + class_name: + "menu-icon-button network forget", + on_primary_click: () => { + Utils.execAsync( + "nmcli connection show --active", + ).then((res) => { + const connectionId = getIdBySsid( + network.wifi.ssid, + res, + ); + + Utils.execAsync( + `nmcli connection delete ${connectionId} "${network.wifi.ssid}"`, + ).catch((err) => + console.error( + `Error while forgetting "${network.wifi.ssid}": ${err}`, + ), + ); + }); + }, + child: Widget.Label("󰆴"), + }), + }), + ], + }), + ], + }), + ]; + } + return []; + }; + + return (self.children = [ + ...localIfConnected(), + ...wifiIfConnected(), + ]); + }); }); }, }), @@ -98,76 +248,249 @@ export default () => { class_name: "menu-separator", }), Widget.Box({ - class_name: "menu-label-container network", - child: Widget.Label({ - class_name: "menu-label network", - hpack: "start", - label: "Available Networks", - }), + children: [ + Widget.Box({ + hpack: "start", + class_name: "menu-label-container network", + child: Widget.Label({ + class_name: "menu-label network", + hpack: "start", + label: "Available Networks", + }), + }), + Widget.Box({ + hexpand: true, + hpack: "end", + child: Widget.Button({ + class_name: "menu-icon-button refresh network", + on_primary_click: () => { + network.wifi.scan(); + }, + child: Widget.Icon("view-refresh-symbolic"), + }), + }), + ], }), Widget.Box({ class_name: "menu-item-box network", vertical: true, - setup: (self) => { - self.hook(network, () => { - // TODO: Finish dis - - let sortedNetworks = []; - - if (network.wifi.access_points.length > 0) { - sortedNetworks = network.wifi.access_points - .filter((ap) => ap.ssid !== "Unknown") - .sort((a, b) => { - if (a.ssid === network.wifi.ssid) { - return -1; - } else if (b.ssid === network.wifi.ssid) { - return 1; - } else { - return b.strength - a.strength; - } - }); - } - - console.log(sortedNetworks.length); - - return (self.children = sortedNetworks.map((curNetwork) => { - return Widget.Button({ - class_name: "network-element-item", - child: Widget.Box({ - children: [ - Widget.Box({ - hpack: "start", - vertical: true, - children: [ - Widget.Box({ - class_name: "network-element-items-container", + children: [ + Widget.Box({ + vertical: true, + setup: (self) => { + self.hook(pendingAuth, () => { + const accPoint = network.wifi.access_points.find( + (ap) => ap.bssid === pendingAuth.value, + ); + if ( + pendingAuth.value !== "" && + accPoint !== undefined && + network.wifi.ssid !== pendingAuth.value + ) { + return (self.child = Widget.Box({ + vertical: true, + children: [ + Widget.Button({ + class_name: "network-element-item", + child: Widget.Box({ children: [ - Widget.Button({ - class_name: "menu-button-icon network", - child: Widget.Icon({ - tooltip_text: - curNetwork.ssid === network.wifi.ssid - ? network.wifi.state - : null, - icon: `${curNetwork["iconName"]}`, - }), - }), - Widget.Label({ - class_name: "menu-button-name network", - truncate: "end", - wrap: true, - label: curNetwork.ssid, + Widget.Box({ + hpack: "start", + vertical: true, + children: [ + Widget.Box({ + class_name: + "network-element-items-container", + children: [ + Widget.Button({ + class_name: + "menu-button-icon network", + child: Widget.Icon({ + tooltip_text: + accPoint.ssid === + network.wifi.ssid + ? network.wifi.state + : null, + icon: `${accPoint["iconName"]}`, + }), + }), + Widget.Label({ + class_name: + "menu-button-name network", + truncate: "end", + wrap: true, + label: accPoint.ssid, + }), + ], + }), + ], }), ], }), - ], - }), - ], - }), + }), + + Widget.Revealer({ + transition: "slide_down", + reveal_child: pendingAuth + .bind("value") + .as((v) => (v === accPoint.bssid ? true : false)), + class_name: "network-password-input-container", + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Box({ + child: Widget.Entry({ + hpack: "start", + class_name: "network-password-input", + placeholder_text: "enter password", + visibility: false, + onAccept: (selfInp) => { + Utils.execAsync( + `nmcli dev wifi connect ${accPoint.bssid} password ${selfInp.text}`, + ) + .catch((err) => { + pendingAuth.value = ""; + console.error( + `Failed to connect to wifi: ${accPoint.ssid}... ${err}`, + ); + }) + .then(() => (pendingAuth.value = "")); + selfInp.text = ""; + }, + }), + }), + Widget.Box({ + class_name: + "network-password-input-close-container", + hexpand: true, + child: Widget.Button({ + class_name: "network-password-input-close", + on_primary_click: () => + (pendingAuth.value = ""), + child: Widget.Label("󰅜 "), + }), + }), + ], + }), + }), + ], + })); + } else { + self.children = []; + } }); - })); - }); - }, + }, + }), + Widget.Box({ + vertical: true, + setup: (self) => { + self.hook(network, () => { + let sortedNetworks = []; + + self.hook(pendingAuth, () => { + if (network.wifi.access_points.length > 0) { + sortedNetworks = network.wifi.access_points + .filter((ap) => { + return ( + ap.ssid !== "Unknown" && + ap.bssid !== pendingAuth.value && + !ap.active && + network.wifi.ssid !== ap.ssid + ); + }) + .sort((a, b) => { + return b.strength - a.strength; + }); + } + + return (self.children = sortedNetworks.map((accPoint) => { + return Widget.Box({ + vertical: true, + children: [ + Widget.Button({ + on_primary_click: () => { + Utils.execAsync( + `nmcli device wifi connect ${accPoint.bssid}`, + ).catch((err) => { + if ( + err + .toLowerCase() + .includes( + "secrets were required, but not provided", + ) + ) { + pendingAuth.value = accPoint.bssid; + } + }); + }, + class_name: "network-element-item", + child: Widget.Box({ + children: [ + Widget.Box({ + hpack: "start", + vertical: true, + children: [ + Widget.Box({ + class_name: + "network-element-items-container", + children: [ + Widget.Button({ + class_name: + "menu-button-icon network", + child: Widget.Icon({ + tooltip_text: + accPoint.ssid === + network.wifi.ssid + ? network.wifi.state + : null, + icon: `${accPoint["iconName"]}`, + }), + }), + Widget.Label({ + class_name: + "menu-button-name network", + truncate: "end", + wrap: true, + label: accPoint.ssid, + }), + ], + }), + ], + }), + ], + }), + }), + Widget.Revealer({ + transition: "slide_down", + reveal_child: pendingAuth + .bind("value") + .as((v) => + v === accPoint.bssid ? true : false, + ), + class_name: "network-password-input-container", + child: Widget.Box({ + hexpand: true, + children: [ + Widget.Entry({ + hexpand: true, + class_name: "network-password-input", + placeholder_text: "enter password", + visibility: false, + onAccept: (selfInp) => { + selfInp.text = ""; + }, + }), + ], + }), + }), + ], + }); + })); + }); + }); + }, + }), + ], }), ], }), diff --git a/modules/notifications/index.js b/modules/notifications/index.js index 7a4cec3..2c85537 100644 --- a/modules/notifications/index.js +++ b/modules/notifications/index.js @@ -134,7 +134,7 @@ export default () => { hexpand: true, vexpand: true, max_width_chars: - notif.image === undefined ? 29 : 21, + notif.image === undefined ? 27 : 20, truncate: "end", wrap: true, label: notif["summary"], diff --git a/scss/menus/network.scss b/scss/menus/network.scss index a8b1d84..3ee8cd6 100644 --- a/scss/menus/network.scss +++ b/scss/menus/network.scss @@ -8,6 +8,10 @@ margin-bottom: 0.5rem; } +.menu-button-name.status.network { + margin-left: 2.5rem; +} + .menu-label.network { color: $mauve; } @@ -30,3 +34,58 @@ color: $overlay2; } +.network-password-input { + border-radius: 0.4rem; + background: $crust; + padding: 0.4rem; + margin-left: 2.5rem; + margin-bottom: 0.5rem; + font-size: 1rem; +} + +.menu-icon-button.refresh.network { + margin-bottom: 1rem; + + &:hover { + color: $mauve; + } +} + +.network-password-input-close { + margin-left: 0.75rem; + margin-bottom: 0.6rem; + + &:hover { + color: $sky; + } + + label { + font-size: 1.35rem; + } +} + +.menu-icon-button.network.disconnect { + margin-bottom: 1.4rem; + margin-right: 0.5rem; + + &:hover { + color: $mauve; + } + + label { + font-size: 1.2rem; + } +} + +.menu-icon-button.network.forget { + margin-bottom: 1.4rem; + margin-right: 0.5rem; + + &:hover { + color: $mauve; + } + + label { + font-size: 1.5rem; + } +} diff --git a/scss/notifications/popups.scss b/scss/notifications/popups.scss index f3ed0be..ec1cf76 100644 --- a/scss/notifications/popups.scss +++ b/scss/notifications/popups.scss @@ -7,8 +7,7 @@ color: $text; background: $mantle; margin-right: 0.4rem; - border: 0.15rem solid $surface0; - min-width: 28rem; + border: 0.15rem solid $surface0; min-width: 28rem; min-height: 6rem; border-radius: 0.4rem; @@ -81,7 +80,7 @@ } &:hover { - background: $pink; + background: $surface1; } } diff --git a/style.css b/style.css index a2f89a6..9541e05 100644 --- a/style.css +++ b/style.css @@ -776,6 +776,10 @@ window#powermenu .powermenu.box { margin-bottom: 0.5rem; } +.menu-button-name.status.network { + margin-left: 2.5rem; +} + .menu-label.network { color: #cba6f7; } @@ -795,6 +799,55 @@ window#powermenu .powermenu.box { color: #9399b2; } +.network-password-input { + border-radius: 0.4rem; + background: #11111b; + padding: 0.4rem; + margin-left: 2.5rem; + margin-bottom: 0.5rem; + font-size: 1rem; +} + +.menu-icon-button.refresh.network { + margin-bottom: 1rem; +} +.menu-icon-button.refresh.network:hover { + color: #cba6f7; +} + +.network-password-input-close { + margin-left: 0.75rem; + margin-bottom: 0.6rem; +} +.network-password-input-close:hover { + color: #89dceb; +} +.network-password-input-close label { + font-size: 1.35rem; +} + +.menu-icon-button.network.disconnect { + margin-bottom: 1.4rem; + margin-right: 0.5rem; +} +.menu-icon-button.network.disconnect:hover { + color: #cba6f7; +} +.menu-icon-button.network.disconnect label { + font-size: 1.2rem; +} + +.menu-icon-button.network.forget { + margin-bottom: 1.4rem; + margin-right: 0.5rem; +} +.menu-icon-button.network.forget:hover { + color: #cba6f7; +} +.menu-icon-button.network.forget label { + font-size: 1.5rem; +} + .menu-dropdown-label.bluetooth { color: #89dceb; } @@ -919,7 +972,7 @@ window#powermenu .powermenu.box { margin-right: 2rem; } .notification-action-buttons:hover { - background: #f5c2e7; + background: #45475a; } .notification-icon { diff --git a/style.css.map b/style.css.map index 735235a..fba04ca 100644 --- a/style.css.map +++ b/style.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/notifications/popups.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACJF;EACE;EACA;EACA,kBCFgB;EDGhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBChBW;;ADkBf;EACE,OCnBa;;ADqBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBC/Be;;;ADmCnB;EACE;EACA;EACA;EACA,OCvCiB;;;AD0CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBC9DiB;ED+DjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBC9EgB;;;ADiFlB;AAAA;EAEE;EACA,kBCpFgB;;;ADuFlB;AAAA;AAAA;EAGE,OC1FgB;ED2FhB,kBC7CW;;;ADgDb;AAAA;AAAA;EAGE;EACA,kBCpDW;;;ADuDb;AAAA;AAAA;EAGE;EACA,kBC3DW;;;AD8Db;EACE;EACA;EACA;EACA;EACA,kBChHiB;EDiHjB;EACA;EACA;;;AAGF;EACE,kBC1EW;;;AD6Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCvIc;EDwId;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBChKiB;;;ADmKnB;EACE;EACA,kBCxHW;;;AD2Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OC1IW;ED2IX,kBCzLgB;ED0LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBC1MgB;ED2MhB,OC5Mc;ED6Md;;;AAGF;EACE;EACA;EACA,kBCjNiB;;;ADoNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AE/NF;EACE,YDmCM;EClCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD2BM;EC1BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;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","file":"style.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["scss/main.scss","scss/common/common.scss","scss/colors.scss","scss/common/widget-button.scss","scss/bar/menu.scss","scss/bar/audio.scss","scss/bar/media.scss","scss/bar/network.scss","scss/bar/bluetooth.scss","scss/bar/clock.scss","scss/bar/workspace.scss","scss/bar/window_title.scss","scss/bar/systray.scss","scss/bar/power.scss","scss/bar/bar.scss","scss/menus/menu.scss","scss/menus/power.scss","scss/common/floating-widget.scss","scss/menus/audiomenu.scss","scss/menus/network.scss","scss/menus/bluetooth.scss","scss/notifications/popups.scss"],"names":[],"mappings":"AAAA;EACE;EACA;EACA;EACA;;;ACJF;EACE;EACA;EACA,kBCFgB;EDGhB;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,kBChBW;;ADkBf;EACE,OCnBa;;ADqBf;EACE;EACA;EACA;EACA;;AAGJ;EACE;EACA;EACA,kBC/Be;;;ADmCnB;EACE;EACA;EACA;EACA,OCvCiB;;;AD0CnB;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA,kBC9DiB;ED+DjB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;EACA,kBC9EgB;;;ADiFlB;AAAA;EAEE;EACA,kBCpFgB;;;ADuFlB;AAAA;AAAA;EAGE,OC1FgB;ED2FhB,kBC7CW;;;ADgDb;AAAA;AAAA;EAGE;EACA,kBCpDW;;;ADuDb;AAAA;AAAA;EAGE;EACA,kBC3DW;;;AD8Db;EACE;EACA;EACA;EACA;EACA,kBChHiB;EDiHjB;EACA;EACA;;;AAGF;EACE,kBC1EW;;;AD6Eb;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBCvIc;EDwId;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;EACA,kBChKiB;;;ADmKnB;EACE;EACA,kBCxHW;;;AD2Hb;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;EACA,OC1IW;ED2IX,kBCzLgB;ED0LhB;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,kBC1MgB;ED2MhB,OC5Mc;ED6Md;;;AAGF;EACE;EACA;EACA,kBCjNiB;;;ADoNnB;EACE;IACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AE/NF;EACE,YDmCM;EClCN;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cD2BM;EC1BN;EACA;;AAEA;EACE;EACA,cDSO;ECRP;;AAGF;EAEE;EACA,cDEO;;ACCT;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","file":"style.css"} \ No newline at end of file