limit release toast to folder view

This commit is contained in:
Shantur Rathore
2025-12-07 00:58:15 +00:00
parent 3e72b83393
commit 6f04d23b09

View File

@@ -1,30 +1,68 @@
import { createSignal } from "solid-js" import { createEffect, createSignal } from "solid-js"
import type { LatestReleaseInfo, WorkspaceEventPayload } from "../../../server/src/api-types" import type { LatestReleaseInfo, WorkspaceEventPayload } from "../../../server/src/api-types"
import { getServerMeta } from "../lib/server-meta" import { getServerMeta } from "../lib/server-meta"
import { serverEvents } from "../lib/server-events" import { serverEvents } from "../lib/server-events"
import { showToastNotification, ToastHandle } from "../lib/notifications" import { showToastNotification, ToastHandle } from "../lib/notifications"
import { getLogger } from "../lib/logger" import { getLogger } from "../lib/logger"
import { hasInstances, showFolderSelection } from "./ui"
const log = getLogger("actions") const log = getLogger("actions")
const [availableRelease, setAvailableRelease] = createSignal<LatestReleaseInfo | null>(null) const [availableRelease, setAvailableRelease] = createSignal<LatestReleaseInfo | null>(null)
let initialized = false let initialized = false
let visibilityEffectInitialized = false
let activeToast: ToastHandle | null = null let activeToast: ToastHandle | null = null
let activeToastVersion: string | null = null
function dismissActiveToast() { function dismissActiveToast() {
if (activeToast) { if (activeToast) {
activeToast.dismiss() activeToast.dismiss()
activeToast = null activeToast = null
activeToastVersion = null
} }
} }
function ensureVisibilityEffect() {
if (visibilityEffectInitialized) {
return
}
visibilityEffectInitialized = true
createEffect(() => {
const release = availableRelease()
const shouldShow = Boolean(release) && (!hasInstances() || showFolderSelection())
if (!shouldShow || !release) {
dismissActiveToast()
return
}
if (!activeToast || activeToastVersion !== release.version) {
dismissActiveToast()
activeToast = showToastNotification({
title: `CodeNomad ${release.version}`,
message: release.channel === "dev" ? "Dev release build available." : "New stable build on GitHub.",
variant: "info",
duration: Number.POSITIVE_INFINITY,
position: "bottom-right",
action: {
label: "View release",
href: release.url,
},
})
activeToastVersion = release.version
}
})
}
export function initReleaseNotifications() { export function initReleaseNotifications() {
if (initialized) { if (initialized) {
return return
} }
initialized = true initialized = true
ensureVisibilityEffect()
void refreshFromMeta() void refreshFromMeta()
serverEvents.on("app.releaseAvailable", (event) => { serverEvents.on("app.releaseAvailable", (event) => {
@@ -47,22 +85,9 @@ async function refreshFromMeta() {
function applyRelease(release: LatestReleaseInfo | null | undefined) { function applyRelease(release: LatestReleaseInfo | null | undefined) {
if (!release) { if (!release) {
setAvailableRelease(null) setAvailableRelease(null)
dismissActiveToast()
return return
} }
setAvailableRelease(release) setAvailableRelease(release)
dismissActiveToast()
activeToast = showToastNotification({
title: `CodeNomad ${release.version}`,
message: release.channel === "dev" ? "Dev release build available." : "New stable build on GitHub.",
variant: "info",
duration: Number.POSITIVE_INFINITY,
position: "bottom-right",
action: {
label: "View release",
href: release.url,
},
})
} }
export function useAvailableRelease() { export function useAvailableRelease() {