From 1e7524ef16b53050b9e9c81bda1f87cff853b05a Mon Sep 17 00:00:00 2001 From: Adib Hanna Date: Mon, 14 Sep 2026 17:11:24 -0500 Subject: [PATCH] fix(updater): make update notifications dismissible (v2.50.2) --- apps/desktop/package.json | 2 +- apps/server/package.json | 2 +- apps/web/package.json | 2 +- docs/releases/v2.50.2/RELEASE_NOTES.md | 19 +++++++++++++++++++ package-lock.json | 18 +++++++++--------- package.json | 2 +- packages/app-core/package.json | 2 +- packages/app-core/src/App.tsx | 18 +++++++++++++++--- packages/bridge-contract/package.json | 2 +- packages/shared-domain/package.json | 2 +- packages/shared-ui/package.json | 2 +- 11 files changed, 51 insertions(+), 20 deletions(-) create mode 100644 docs/releases/v2.50.2/RELEASE_NOTES.md diff --git a/apps/desktop/package.json b/apps/desktop/package.json index ba78af96..9d189a94 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/desktop", "productName": "ZenNotes", - "version": "2.50.1", + "version": "2.50.2", "description": "ZenNotes desktop shell", "private": true, "main": "./out/main/index.js", diff --git a/apps/server/package.json b/apps/server/package.json index b3803d6b..16c0cba4 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/server", "private": true, - "version": "2.50.1", + "version": "2.50.2", "scripts": { "dev": "node ../../tooling/scripts/run-go-server-dev.mjs", "prepare-web": "node ../../tooling/scripts/prepare-server-web-dist.mjs", diff --git a/apps/web/package.json b/apps/web/package.json index acf33710..550a8e06 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/web", "private": true, - "version": "2.50.1", + "version": "2.50.2", "type": "module", "description": "ZenNotes web client for self-hosted and hosted deployments", "homepage": "https://zennotes.org", diff --git a/docs/releases/v2.50.2/RELEASE_NOTES.md b/docs/releases/v2.50.2/RELEASE_NOTES.md new file mode 100644 index 00000000..28391a65 --- /dev/null +++ b/docs/releases/v2.50.2/RELEASE_NOTES.md @@ -0,0 +1,19 @@ +ZenNotes 2.50.2: dismiss update notifications + +> Update notifications now have a close button, so you can clear the toast and keep writing. + +## 🐛 Fixes + +- **Dismiss the update toast.** Use the × button to close an available-update, download-progress, or ready-to-relaunch notification. The button is keyboard accessible and follows your theme. +- **Dismissed notices stay quiet.** Repeated notifications and download progress updates do not bring the same notice back. A new version or a different update phase can show a fresh notice. Restarting the app can show the notice again. +- **Update when you are ready.** Dismissing the toast leaves the update controls in Settings available and does not cancel a download. + +## 🧰 For contributors + +- Reuses the shared icon button and close icon. Dismissal tracks the update version and phase in local UI state. +- All eight package versions and lockfile metadata are aligned at 2.50.2; dependencies are unchanged. +- Local validation: the full production build and all seven typecheck tasks passed; 4,391 JavaScript tests passed with five skipped, and the Go tests passed. The production dependency audit reported no vulnerabilities. The dismiss button was previewed in the macOS desktop app. + +--- + +Local-first and keyboard-first, as always. diff --git a/package-lock.json b/package-lock.json index 23e67575..937c46a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "zennotes-monorepo", - "version": "2.50.1", + "version": "2.50.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "zennotes-monorepo", - "version": "2.50.1", + "version": "2.50.2", "hasInstallScript": true, "workspaces": [ "apps/*", @@ -23,7 +23,7 @@ }, "apps/desktop": { "name": "@zennotes/desktop", - "version": "2.50.1", + "version": "2.50.2", "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.18.3", @@ -874,11 +874,11 @@ }, "apps/server": { "name": "@zennotes/server", - "version": "2.50.1" + "version": "2.50.2" }, "apps/web": { "name": "@zennotes/web", - "version": "2.50.1", + "version": "2.50.2", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -16286,7 +16286,7 @@ }, "packages/app-core": { "name": "@zennotes/app-core", - "version": "2.50.1", + "version": "2.50.2", "dependencies": { "@codemirror/autocomplete": "^6.18.3", "@codemirror/commands": "^6.7.1", @@ -16363,11 +16363,11 @@ }, "packages/bridge-contract": { "name": "@zennotes/bridge-contract", - "version": "2.50.1" + "version": "2.50.2" }, "packages/shared-domain": { "name": "@zennotes/shared-domain", - "version": "2.50.1", + "version": "2.50.2", "dependencies": { "@zennotes/bridge-contract": "*", "lz-string": "^1.5.0" @@ -16378,7 +16378,7 @@ }, "packages/shared-ui": { "name": "@zennotes/shared-ui", - "version": "2.50.1" + "version": "2.50.2" } } } diff --git a/package.json b/package.json index e2d86e65..c92f206f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "zennotes-monorepo", "private": true, - "version": "2.50.1", + "version": "2.50.2", "description": "ZenNotes monorepo for desktop, web, and self-hosted server builds", "packageManager": "npm@10.9.2", "engines": { diff --git a/packages/app-core/package.json b/packages/app-core/package.json index 840e4256..545216e4 100644 --- a/packages/app-core/package.json +++ b/packages/app-core/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/app-core", "private": true, - "version": "2.50.1", + "version": "2.50.2", "type": "module", "exports": { "./main": "./src/main.tsx" diff --git a/packages/app-core/src/App.tsx b/packages/app-core/src/App.tsx index 3864e36d..18da506e 100644 --- a/packages/app-core/src/App.tsx +++ b/packages/app-core/src/App.tsx @@ -1,4 +1,4 @@ -import { lazy, Suspense, useEffect, useMemo, useRef } from 'react' +import { lazy, Suspense, useEffect, useMemo, useRef, useState } from 'react' import { useStore, initConfigSync, @@ -24,7 +24,8 @@ import { DatePickerHost } from './components/DatePickerHost' import { PublishNoteHost } from './components/PublishNoteHost' import { CloudConflictReviewHost } from './components/CloudConflictReviewHost' import { ServerDirectoryPickerHost } from './components/ServerDirectoryPickerHost' -import { ToastHost } from './components/ui' +import { IconButton, ToastHost } from './components/ui' +import { CloseIcon } from './components/icons' import { ExcalidrawEmbedMenuHost } from './components/ExcalidrawEmbedMenuHost' import { resolveQuickNoteTitle } from './lib/quick-note-title' import { escapeEmbedFrame } from './lib/embed-renderers' @@ -239,10 +240,14 @@ function AppUpdateNotice({ hidden: boolean }): JSX.Element | null { const updateState = useAppUpdateState() + const [dismissedNotice, setDismissedNotice] = useState(null) + const noticeKey = updateState + ? `${updateState.availableVersion ?? ''}:${updateState.phase}` + : null const label = appUpdateNoticeLabel(updateState) const actionLabel = appUpdatePrimaryActionLabel(updateState) - if (hidden || !label) return null + if (hidden || !label || dismissedNotice === noticeKey) return null const runPrimaryAction = (): void => { if (updateState?.phase === 'available') { @@ -276,6 +281,13 @@ function AppUpdateNotice({ {actionLabel} )} + setDismissedNotice(noticeKey)} + > + + ) } diff --git a/packages/bridge-contract/package.json b/packages/bridge-contract/package.json index 9a38cbc7..49b3491f 100644 --- a/packages/bridge-contract/package.json +++ b/packages/bridge-contract/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/bridge-contract", "private": true, - "version": "2.50.1", + "version": "2.50.2", "type": "module", "exports": { "./bridge": "./src/bridge.ts", diff --git a/packages/shared-domain/package.json b/packages/shared-domain/package.json index 4041f7db..00e97ade 100644 --- a/packages/shared-domain/package.json +++ b/packages/shared-domain/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/shared-domain", "private": true, - "version": "2.50.1", + "version": "2.50.2", "type": "module", "exports": { "./*": "./src/*.ts" diff --git a/packages/shared-ui/package.json b/packages/shared-ui/package.json index 81187875..814c0759 100644 --- a/packages/shared-ui/package.json +++ b/packages/shared-ui/package.json @@ -1,7 +1,7 @@ { "name": "@zennotes/shared-ui", "private": true, - "version": "2.50.1", + "version": "2.50.2", "type": "module", "exports": { ".": "./src/index.ts"