Files
CodeNomad/packages/ui/src/stores/releases.ts
2026-01-22 15:12:32 +00:00

86 lines
2.3 KiB
TypeScript

import { createEffect, createSignal } from "solid-js"
import type { SupportMeta } from "../../../server/src/api-types"
import { getServerMeta } from "../lib/server-meta"
import { showToastNotification, ToastHandle } from "../lib/notifications"
import { getLogger } from "../lib/logger"
import { hasInstances, showFolderSelection } from "./ui"
const log = getLogger("actions")
const [supportInfo, setSupportInfo] = createSignal<SupportMeta | null>(null)
let initialized = false
let visibilityEffectInitialized = false
let activeToast: ToastHandle | null = null
let activeToastKey: string | null = null
function dismissActiveToast() {
if (activeToast) {
activeToast.dismiss()
activeToast = null
activeToastKey = null
}
}
function ensureVisibilityEffect() {
if (visibilityEffectInitialized) {
return
}
visibilityEffectInitialized = true
createEffect(() => {
const support = supportInfo()
const shouldShow = Boolean(support && support.supported === false) && (!hasInstances() || showFolderSelection())
if (!shouldShow || !support || support.supported !== false) {
dismissActiveToast()
return
}
const key = `${support.minServerVersion ?? "unknown"}:${support.latestServerVersion ?? "unknown"}`
if (!activeToast || activeToastKey !== key) {
dismissActiveToast()
activeToast = showToastNotification({
title: support.message ?? "Upgrade required",
message: support.latestServerVersion
? `Update to CodeNomad ${support.latestServerVersion} to use the latest UI.`
: "Update CodeNomad to use the latest UI.",
variant: "info",
duration: Number.POSITIVE_INFINITY,
position: "bottom-right",
action: support.latestServerUrl
? {
label: "Get update",
href: support.latestServerUrl,
}
: undefined,
})
activeToastKey = key
}
})
}
export function initReleaseNotifications() {
if (initialized) {
return
}
initialized = true
ensureVisibilityEffect()
void refreshFromMeta()
}
async function refreshFromMeta() {
try {
const meta = await getServerMeta(true)
setSupportInfo(meta.support ?? null)
} catch (error) {
log.warn("Unable to load server metadata for support info", error)
}
}
export function useSupportInfo() {
return supportInfo
}