From eab11db766fcfac394c9f667b287ab1786c59938 Mon Sep 17 00:00:00 2001 From: Gregory Salaun Date: Mon, 17 Aug 2026 01:14:30 +0200 Subject: [PATCH] fix(awards): the callbook island only reached stations already in the log MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit withIOTARef was applied inside fillFromLastQso, the backfill that runs when the provider came up short. That function returns early when there is no previous contact with the callsign — so the island reference appeared for stations already worked and never for the new one calling from the island, which is the entire point of reading QRZ's . Moved to the provider result in runLookup, where the rest of the callbook fields are applied. The precedence is unchanged: a reference the operator typed or picked still wins over the callbook. Reported on F5IRH, Le Palais, Belle-Île-en-Mer — EU-048 in the QRZ record, and nothing on the IOTA award. No changelog line: the feature has not shipped yet, so the entry already in the 0.25.7 block now describes what it does. --- frontend/src/App.tsx | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b549935..808e909 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3867,18 +3867,6 @@ export default function App() { email: d.email || last.email || '', web: d.web || last.web || '', qsl_via: d.qsl_via || last.qsl_via || '', - // An island reference from the callbook becomes an IOTA award reference - // on the entry, exactly like one picked by hand. - // - // QRZ carries for an operator on an island and OpsLog read past - // it. That matters more for IOTA than it would for another award: - // unlike POTA there is no live "who is on an island right now" feed - // anywhere, so the callbook record is the practical source — and it is - // known BEFORE the contact is logged, which is when it is useful. - // - // Only when the operator has not set one already: a reference typed or - // picked by hand outranks a callbook that may be years out of date. - award_refs: withIOTARef(d.award_refs ?? '', String((r as any)?.iota ?? '')), }; }); if (adoptLastGrid || last.grid || last.lat) setMapZoomSignal((n) => n + 1); @@ -3946,6 +3934,24 @@ export default function App() { email: d.email || (r.email ?? ''), web: d.web || (r.web ?? ''), qsl_via: d.qsl_via || (r.qsl_via ?? ''), + // An island reference from the callbook becomes an IOTA award reference + // on the entry, exactly like one picked by hand. + // + // QRZ carries for an operator on an island and OpsLog read past + // it. That matters more for IOTA than it would for another award: + // unlike POTA there is no live "who is on an island right now" feed + // anywhere, so the callbook record is the practical source — and it is + // known BEFORE the contact is logged, which is when it is useful. + // + // Only when the operator has not set one already: a reference typed or + // picked by hand outranks a callbook that may be years out of date. + // + // This belongs HERE, on the provider result, and not in the backfill + // from the last QSO where it first went: that runs only when there IS a + // previous contact with the call, so the island appeared for stations + // already in the log and never for the new one on the island — which is + // the entire point of the feature. + award_refs: withIOTARef(d.award_refs ?? '', String((r as any)?.iota ?? '')), })); // Backfill anything the provider didn't supply from the last time we worked // this call (call not found on QRZ/HamQTH, or lookup off → cty.dat only).