boxwart: Start wartet nie auf die Update-Suche im Netz, Verlauf am Handy kompakter
Ampel / ampel (push) Failing after 20s

Nach einem MC2-Neustart hing /api/start, bis GitHub, apt und Hugging Face
geantwortet hatten. Jetzt kommt der letzte Stand sofort, frisch geholt wird im
Hintergrund; bis dahin steht "wird geprueft" da.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-23 22:04:50 +02:00
co-authored by Claude Opus 5.5
parent ed6948429a
commit 4b226d5d22
14 changed files with 53 additions and 27 deletions
+6 -1
View File
@@ -14,7 +14,12 @@ import type {
const takt = (ms: number) => () => (stromVerbunden() ? ms * 5 : ms)
export const useStart = () =>
useQuery({ queryKey: ["start"], queryFn: () => api<Start>("/api/start"), refetchInterval: takt(20_000) })
useQuery({
queryKey: ["start"],
queryFn: () => api<Start>("/api/start"),
// Sucht MC2 gerade noch nach Updates (nach einem Neustart), bald wieder nachsehen.
refetchInterval: (q) => (q.state.data && !q.state.data.updates.gelesen ? 4000 : takt(20_000)()),
})
export const useModelle = () =>
useQuery({
+2
View File
@@ -67,6 +67,8 @@ export interface Start {
bausteine: { id: string; name: string; neu: string }[]
modelle: { role: string; title: string; repo: string }[]
festgehalten: Festgehalten[]
/** false, solange MC2 nach einem Neustart noch im Netz nach Updates sucht. */
gelesen: boolean
}
flugplan: { gelaufen: FlugplanEintrag[]; geplant: FlugplanEintrag[] }
}
+8 -4
View File
@@ -19,9 +19,10 @@ const BAUSTEINE = [
{ id: "hermes", name: "Hermes" },
] as const
function BausteinZeile({ id, name, hatUpdate, fest, onStart, onFreigeben, laeuftGerade }: {
function BausteinZeile({ id, name, gelesen, hatUpdate, fest, onStart, onFreigeben, laeuftGerade }: {
id: string
name: string
gelesen: boolean
hatUpdate: boolean
fest: Festgehalten | undefined
onStart: () => void
@@ -31,7 +32,9 @@ function BausteinZeile({ id, name, hatUpdate, fest, onStart, onFreigeben, laeuft
const { data, isPending } = useUpdateDetails(id)
const v = versionen(id, data)
const neu = hatUpdate ? v.neu ?? "neu" : null
const was = !hatUpdate
const was = !gelesen
? "Wird gerade geprüft …"
: !hatUpdate
? "Aktuell."
: data?.summary?.trim() || (id === "os" && data?.count ? "Paketliste unten in den Details." : isPending ? "Wird gelesen …" : "")
const neuText = neu ? <span className="text-cyan">{neu}</span> : <span className="text-text-3"></span>
@@ -86,13 +89,13 @@ const PUNKT: Record<UpdateLauf["stufe"], string> = {
function LaufEintrag({ lauf }: { lauf: UpdateLauf }) {
return (
<li className="flex flex-col gap-2 border-t border-linie py-3">
<div className="grid grid-cols-[112px_minmax(0,1fr)_auto] items-center gap-3">
<div className="grid grid-cols-[auto_minmax(0,1fr)_auto] items-center gap-3 md:grid-cols-[112px_minmax(0,1fr)_auto]">
<span className="ziffern text-sm text-text-3">{flugplanZeit(lauf.start)}</span>
<span className="min-w-0 text-[15px]">{lauf.anlass}</span>
<Chip art={LAUF_ART[lauf.stufe]}>{lauf.titel}</Chip>
</div>
{lauf.stufe !== "grau" && lauf.zeilen.length > 0 && (
<ul className="m-0 flex list-none flex-col gap-1 p-0 sm:pl-[124px]">
<ul className="m-0 flex list-none flex-col gap-1 p-0 md:pl-[124px]">
{lauf.zeilen.map((z) => (
<li key={`${z.baustein}-${z.text}`} className="flex items-baseline gap-2 text-sm leading-snug text-text-2">
<span aria-hidden className={cn("size-1.5 shrink-0 -translate-y-px rounded-full", PUNKT[z.stufe])} />
@@ -182,6 +185,7 @@ export function UpdatesSeite() {
key={b.id}
id={b.id}
name={b.name}
gelesen={start.data?.updates.gelesen ?? false}
hatUpdate={mitUpdate.has(b.id)}
fest={festgehalten.get(b.id)}
laeuftGerade={laeuft}