From a58997701510890722365b624d2a4bcaaee6aa4b Mon Sep 17 00:00:00 2001 From: metacryst Date: Thu, 26 Mar 2026 07:44:51 -0500 Subject: [PATCH] notifications setting --- src/components/Sidebar.js | 27 +++++++++++++-------- src/components/Toggle.js | 50 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 src/components/Toggle.js diff --git a/src/components/Sidebar.js b/src/components/Sidebar.js index 789bcdb..95f0713 100644 --- a/src/components/Sidebar.js +++ b/src/components/Sidebar.js @@ -1,4 +1,5 @@ import util from "../util" +import "./Toggle.js" class Sidebar extends Shadow { SIDEBAR_WIDTH @@ -66,17 +67,23 @@ class Sidebar extends Shadow { this.SidebarItem("Logout") - button("Delete Account") - .fontSize(0.9, em) - .marginTop("auto") - .marginBottom(2, em) - .background("var(--darkred)") - .paddingVertical(1, em) - .border("none") - .outline("1px solid var(--divider)") - .color("var(--text)") - .onTap((done) => this.deleteAccount()) + VStack(() => { + Toggle("Enable Push Notifications") + .marginLeft(1, em) + + button("Delete Account") + .fontSize(0.9, em) + .marginBottom(2, em) + .background("var(--darkred)") + .paddingVertical(1, em) + .border("none") + .outline("1px solid var(--divider)") + .color("var(--text)") + .onTap((done) => this.deleteAccount()) }) + .marginTop("auto") + .gap(2, em) + }) .gap(1, em) .paddingTop(15, vh) .paddingHorizontal(1, em) diff --git a/src/components/Toggle.js b/src/components/Toggle.js new file mode 100644 index 0000000..511b0a3 --- /dev/null +++ b/src/components/Toggle.js @@ -0,0 +1,50 @@ +css(` + .toggle-input { + appearance: none; + width: 44px; + height: 24px; + background: #ccc; + border-radius: 12px; + position: relative; + cursor: pointer; + transition: background 0.2s; + } + + .toggle-input::after { + content: ''; + position: absolute; + width: 20px; + height: 20px; + background: white; + border-radius: 50%; + top: 2px; + left: 2px; + transition: left 0.2s; + } + + .toggle-input:checked { + background: var(--darkred); + } + + .toggle-input:checked::after { + left: 22px; + } +`) + +class Toggle extends Shadow { + render() { + HStack(() => { + input("", "44px", "24px") + .attr({ type: "checkbox", checked: global.profile.preferences.notifications ? "" : null, class: "toggle-input"}) + .onChange(async (e) => { + await server.updateNotificationPreferences(global.profile.id, e.target.checked) + }) + p("Enable Push Notifications") + .color("var(--text)") + }) + .verticalAlign("center") + .gap(10, px) + } +} + +register(Toggle) \ No newline at end of file