diff --git a/app.go b/app.go index e9b902c..fcde381 100644 --- a/app.go +++ b/app.go @@ -19947,6 +19947,12 @@ func (a *App) SaveChaseSettings(cs ChaseSettings) error { a.clusterStatusMu.Lock() a.clusterStatusIdx = nil a.clusterStatusMu.Unlock() + // The frontend caches resolved verdicts and only asks about unknown keys — + // without this it kept judging half the screen under the OLD rules until a + // restart, which read as the new mode simply not working. + if a.ctx != nil { + wruntime.EventsEmit(a.ctx, "spotstatus:invalidate") + } return nil } diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 8d08514..b721428 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -3862,6 +3862,12 @@ export default function App() { // The DX Call was cleared in WSJT-X / JTDX / MSHV → clear our entry to match. // Only when something is actually in the entry, so an idle digital app doesn't // wipe a call being typed by hand. + const unsubStatusInval = EventsOn('spotstatus:invalidate', () => { + // The chase rules changed: every resolved verdict is stale. Cleared, and + // the flushes re-ask as rows repaint. + setSpotStatus({}); + spotStatusRef.current = {}; + }); const unsubClear = EventsOn('udp:clear_call', () => { // The decoder cleared its DX Call: the next call it announces — even the // same one re-selected — is a fresh edge. @@ -3925,7 +3931,7 @@ export default function App() { const file = String(p?.file ?? '').replace(/^.*[\\/]/, ''); showToast(file ? t('adifmon.toastFrom', { n, file }) : t('adifmon.toast', { n })); }); - return () => { unsubDX?.(); unsubRC?.(); unsubClear?.(); unsubFlexSpot?.(); unsubTciSpot?.(); unsubProg?.(); unsubBulk?.(); unsubLog?.(); unsubAdifMon?.(); }; + return () => { unsubDX?.(); unsubRC?.(); unsubClear?.(); unsubStatusInval?.(); unsubFlexSpot?.(); unsubTciSpot?.(); unsubProg?.(); unsubBulk?.(); unsubLog?.(); unsubAdifMon?.(); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/frontend/src/components/DecodesPanel.tsx b/frontend/src/components/DecodesPanel.tsx index 0dfa164..b48cc03 100644 --- a/frontend/src/components/DecodesPanel.tsx +++ b/frontend/src/components/DecodesPanel.tsx @@ -1151,8 +1151,9 @@ export function DecodesPanel({ decodes, txMsgs, txState, txStates, spotStatus, o {entities.map((b) => ( - {t(b.label)} + className={cn('rounded px-1 py-px text-[10px] font-bold uppercase tracking-wide shrink-0', b.cls, + e?.unconf_status && 'opacity-60 border border-dashed border-current bg-transparent')}> + {t(b.label)}{e?.unconf_status ? '?' : ''} ))} {extras.map((b) => {