feat(watchlist): header counters, mode filter — and the alert checks worked FIRST
DXHunter's header row, ported: Watchlist / Active / Needed counts up front and the All-Modes select beside the other filters (DIGI matches the digital class, SSB folds USB/LSB). Counters, card lists and the Active/Needed-only filters all read the same mode-filtered view, so the numbers add up to what is on screen. And the notify alert now asks the SAME worked-slot question the tab asks — before making a sound. It used to fire on the raw spot while the tab's verdict arrived on a debounce, so the bell rang for a slot that showed Worked a moment later. Judged in the backend at emit time: exact slot for named modes, digital class for generic DATA, today-only for contest entries.
This commit is contained in:
@@ -200,6 +200,17 @@ func (a *App) watchSpot(dxCall, band, mode, country, comment string, freqHz int6
|
||||
if !ok || !notify || a.ctx == nil {
|
||||
return
|
||||
}
|
||||
// Already worked? Then nothing to announce. Judged HERE, before the sound —
|
||||
// the report was an alert ringing for a slot the tab showed as Worked a
|
||||
// moment later, because the frontend's verdict arrives on a debounce while
|
||||
// the alert used to fire on the raw spot. Same verdict as the tab: exact
|
||||
// slot for named modes, digital class for a generic DATA spot, today-only
|
||||
// for a contest entry.
|
||||
if e, found := a.watchlist.Get(entry); found {
|
||||
if a.WatchlistWorkedSlots([]WatchlistSlotQuery{{Call: dxCall, Band: band, Mode: mode, Contest: e.IsContest}})[0] {
|
||||
return
|
||||
}
|
||||
}
|
||||
// Throttled per entry: a DXpedition lights up every skimmer on the planet,
|
||||
// and forty alerts a minute for one station is a alarm nobody keeps on.
|
||||
a.watchAlertMu.Lock()
|
||||
|
||||
Reference in New Issue
Block a user