chore: release v0.26.3

This commit is contained in:
2026-08-21 23:28:55 +02:00
parent 0cd243fe00
commit d48420485f
31 changed files with 1908 additions and 164 deletions
+39 -2
View File
@@ -1,6 +1,6 @@
import { useEffect, useMemo, useState } from 'react';
import { X, Plus, Loader2 } from 'lucide-react';
import { SearchAwardReferences, GetAwardDefs, GetAwardReferenceMeta } from '../../wailsjs/go/main/App';
import { SearchAwardReferences, GetAwardDefs, GetAwardReferenceMeta, AwardRefsNew } from '../../wailsjs/go/main/App';
import {
Select, SelectTrigger, SelectValue, SelectContent, SelectItem,
} from '@/components/ui/select';
@@ -54,6 +54,34 @@ export function AwardRefSelector({ dxcc, value, onChange, fieldValues, heightCla
const entries = value ? value.split(';').filter(Boolean) : [];
// Which of the picked references have never been worked. Asked of the backend
// only when the list of references actually changes — a handful of times per
// QSO — and it answers from an in-memory set (see awardnew.go).
//
// The first question about an award may arrive before its set is built, in
// which case the answer is "pending" and carries no verdict for it: we ask
// again rather than badge on a guess. Attempts are capped so a logbook that
// never finishes building cannot leave a timer running for the session.
const [isNew, setIsNew] = useState<Record<string, boolean>>({});
const entriesKey = entries.join(';');
useEffect(() => {
if (!entriesKey) { setIsNew({}); return; }
let alive = true;
let timer: number | undefined;
let tries = 0;
const ask = () => {
AwardRefsNew(entriesKey.split(';'))
.then((r: any) => {
if (!alive) return;
setIsNew(r?.new ?? {});
if (r?.pending && ++tries < 10) timer = window.setTimeout(ask, 700);
})
.catch(() => { if (alive) setIsNew({}); }); // no badge beats a wrong one
};
ask();
return () => { alive = false; if (timer) window.clearTimeout(timer); };
}, [entriesKey]);
// When the reference set is cleared (a QSO was logged or the call was reset),
// also blank the picker's own state — the search box and the highlighted /
// selected reference — so the Awards tab starts fresh for the next contact.
@@ -256,7 +284,16 @@ export function AwardRefSelector({ dxcc, value, onChange, fieldValues, heightCla
}`}
onClick={() => setSelectedEntry(selectedEntry === entry ? null : entry)}
>
<span className="font-mono font-semibold flex-1 truncate">{entry}</span>
<span className="font-mono font-semibold truncate">{entry}</span>
{isNew[entry] && (
<span
title={t('awrs.newRefHint')}
className="shrink-0 px-1 rounded-sm text-[9px] leading-[14px] font-semibold tracking-wide bg-success-muted text-success border border-success-border"
>
{t('awrs.new')}
</span>
)}
<span className="flex-1" />
<button
className="shrink-0 hover:text-destructive"
onClick={(e) => { e.stopPropagation(); removeEntry(entry); }}