chore: release v0.26.3
This commit is contained in:
@@ -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); }}
|
||||
|
||||
Reference in New Issue
Block a user