Add repeater region discover

This commit is contained in:
Jack Kingsman
2026-07-10 15:00:14 -07:00
parent 789d37e240
commit 5da6e19c9b
14 changed files with 639 additions and 12 deletions
+68
View File
@@ -12,6 +12,7 @@ import type {
RadioConfigUpdate,
RadioDiscoveryResponse,
RadioDiscoveryTarget,
RadioRegionDiscoveryResponse,
StatisticsResponse,
} from '../types';
import type { SettingsSection } from '../components/settings/settingsConstants';
@@ -93,6 +94,7 @@ function renderModal(overrides?: {
meshDiscovery?: RadioDiscoveryResponse | null;
meshDiscoveryLoadingTarget?: RadioDiscoveryTarget | null;
onDiscoverMesh?: (target: RadioDiscoveryTarget) => Promise<void>;
regionDiscovery?: RadioRegionDiscoveryResponse | null;
contacts?: Contact[];
trackedTelemetryRepeaters?: string[];
open?: boolean;
@@ -113,6 +115,7 @@ function renderModal(overrides?: {
const onReconnect = overrides?.onReconnect ?? vi.fn(async () => {});
const onAdvertise = overrides?.onAdvertise ?? vi.fn(async (_mode: RadioAdvertMode) => {});
const onDiscoverMesh = overrides?.onDiscoverMesh ?? vi.fn(async () => {});
const onDiscoverRegions = vi.fn(async () => {});
const commonProps = {
open: overrides?.open ?? true,
@@ -131,6 +134,9 @@ function renderModal(overrides?: {
meshDiscovery: overrides?.meshDiscovery ?? null,
meshDiscoveryLoadingTarget: overrides?.meshDiscoveryLoadingTarget ?? null,
onDiscoverMesh,
regionDiscovery: overrides?.regionDiscovery ?? null,
regionDiscoveryLoading: false,
onDiscoverRegions,
onHealthRefresh: vi.fn(async () => {}),
onRefreshAppSettings,
contacts: overrides?.contacts,
@@ -158,6 +164,7 @@ function renderModal(overrides?: {
onReconnect,
onAdvertise,
onDiscoverMesh,
onDiscoverRegions,
view,
};
}
@@ -335,6 +342,67 @@ describe('SettingsModal', () => {
expect(screen.getByText('8s listen window')).toBeInTheDocument();
});
it('discovers regions using repeaters from the last mesh sweep', async () => {
const { onDiscoverRegions } = renderModal({
meshDiscovery: {
target: 'all',
duration_seconds: 8,
results: [
{
public_key: '11'.repeat(32),
name: 'RPT-A',
node_type: 'repeater',
heard_count: 1,
local_snr: 5,
local_rssi: -100,
remote_snr: 3,
},
{
public_key: '22'.repeat(32),
name: 'Sensor',
node_type: 'sensor',
heard_count: 1,
local_snr: 5,
local_rssi: -100,
remote_snr: 3,
},
],
},
});
openRadioSection();
fireEvent.click(screen.getByRole('button', { name: 'Discover Regions' }));
// Only the repeater's key is passed, not the sensor's.
await waitFor(() => {
expect(onDiscoverRegions).toHaveBeenCalledWith(['11'.repeat(32)]);
});
});
it('adds discovered regions to the known-regions field', () => {
renderModal({
regionDiscovery: {
repeaters_queried: 2,
repeaters_answered: 2,
regions: ['nl-gr', 'de-by'],
results: [],
},
});
openRadioSection();
expect(screen.getByText('2/2 repeaters answered — 2 regions found')).toBeInTheDocument();
const knownRegions = screen.getByLabelText(
'Known Regions (for decoding)'
) as HTMLTextAreaElement;
fireEvent.change(knownRegions, { target: { value: 'nl-gr' } });
fireEvent.click(screen.getByRole('button', { name: 'Add to Known Regions' }));
// Existing 'nl-gr' preserved, only the new 'de-by' appended.
expect(knownRegions.value).toBe('nl-gr\nde-by');
});
it('saves advert location source through radio config save', async () => {
const { onSave } = renderModal();
openRadioSection();