From 3b2130f286b9d2a15b73d55e48c532a43cf9fe08 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Thu, 27 Mar 2025 21:02:05 +1100 Subject: sidebar: updates module --- scss/sidebar.scss | 38 +++++++++++ src/modules/sidebar/modules/news.tsx | 2 +- src/modules/sidebar/modules/updates.tsx | 109 ++++++++++++++++++++++++++++++++ src/modules/sidebar/packages.tsx | 1 + 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 src/modules/sidebar/modules/updates.tsx diff --git a/scss/sidebar.scss b/scss/sidebar.scss index 2457bfc..e4dcf13 100644 --- a/scss/sidebar.scss +++ b/scss/sidebar.scss @@ -705,9 +705,47 @@ } } + .updates { + .list { + @include lib.spacing(10, true); + } + + .repo { + @include lib.rounded(20); + @include lib.element-decel; + + background-color: color.change(scheme.$surface1, $alpha: 0.4); + padding: lib.s(10) lib.s(15); + + @include lib.spacing(5); + + .icon { + font-size: lib.s(28); + + &:not(:last-child) { + margin-right: lib.s(12); + } + } + + .sublabel { + font-size: lib.s(14); + color: scheme.$subtext0; + } + + .body { + margin-top: lib.s(10); + font-size: lib.s(14); + } + } + } + .news { min-height: lib.s(200); + .expanded { + min-height: lib.s(400); + } + .empty { margin-top: lib.s(40); } diff --git a/src/modules/sidebar/modules/news.tsx b/src/modules/sidebar/modules/news.tsx index f3be53e..aba37c7 100644 --- a/src/modules/sidebar/modules/news.tsx +++ b/src/modules/sidebar/modules/news.tsx @@ -99,7 +99,7 @@ export default () => ( > !!n)} + className={bind(Updates.get_default(), "news").as(n => (n ? "expanded" : ""))} hscroll={Gtk.PolicyType.NEVER} name="list" > diff --git a/src/modules/sidebar/modules/updates.tsx b/src/modules/sidebar/modules/updates.tsx new file mode 100644 index 0000000..3b159c6 --- /dev/null +++ b/src/modules/sidebar/modules/updates.tsx @@ -0,0 +1,109 @@ +import Palette from "@/services/palette"; +import Updates, { Repo as IRepo, Update as IUpdate } from "@/services/updates"; +import { MenuItem, setupCustomTooltip } from "@/utils/widgets"; +import { bind, execAsync, GLib, Variable } from "astal"; +import { Astal, Gtk } from "astal/gtk3"; + +const constructItem = (label: string, exec: string, quiet = true) => + new MenuItem({ label, onActivate: () => execAsync(exec).catch(e => !quiet && console.error(e)) }); + +const Update = (update: IUpdate) => { + const menu = new Gtk.Menu(); + menu.append(constructItem("Open info in browser", `xdg-open '${update.url}'`, false)); + menu.append(constructItem("Open info in terminal", `uwsm app -- foot -H -- pacman -Qi ${update.name}`)); + menu.append(new Gtk.SeparatorMenuItem({ visible: true })); + menu.append(constructItem("Reinstall", `uwsm app -- foot -H -- yay -S ${update.name}`)); + menu.append(constructItem("Remove with dependencies", `uwsm app -- foot -H -- yay -Rns ${update.name}`)); + + return ( + + ); +}; + +const Repo = ({ repo }: { repo: IRepo }) => { + const expanded = Variable(false); + + return ( + + + + + {repo.updates.map(Update)} + + + + ); +}; + +const List = () => ( + + {bind(Updates.get_default(), "updateData").as(d => d.repos.map(r => ))} + +); + +const NoUpdates = () => ( + + + + +); + +export default () => ( + + +