Add ability to pause radio connection (closes #51)

This commit is contained in:
Jack Kingsman
2026-03-11 17:17:03 -07:00
parent e993009782
commit 4e0b6a49b0
18 changed files with 371 additions and 34 deletions
+21
View File
@@ -68,6 +68,8 @@ function renderModal(overrides?: {
onClose?: () => void;
onSetPrivateKey?: (key: string) => Promise<void>;
onReboot?: () => Promise<void>;
onDisconnect?: () => Promise<void>;
onReconnect?: () => Promise<void>;
open?: boolean;
pageMode?: boolean;
externalSidebarNav?: boolean;
@@ -82,6 +84,8 @@ function renderModal(overrides?: {
const onClose = overrides?.onClose ?? vi.fn();
const onSetPrivateKey = overrides?.onSetPrivateKey ?? vi.fn(async () => {});
const onReboot = overrides?.onReboot ?? vi.fn(async () => {});
const onDisconnect = overrides?.onDisconnect ?? vi.fn(async () => {});
const onReconnect = overrides?.onReconnect ?? vi.fn(async () => {});
const commonProps = {
open: overrides?.open ?? true,
@@ -94,6 +98,8 @@ function renderModal(overrides?: {
onSaveAppSettings,
onSetPrivateKey,
onReboot,
onDisconnect,
onReconnect,
onAdvertise: vi.fn(async () => {}),
onHealthRefresh: vi.fn(async () => {}),
onRefreshAppSettings,
@@ -116,6 +122,8 @@ function renderModal(overrides?: {
onClose,
onSetPrivateKey,
onReboot,
onDisconnect,
onReconnect,
view,
};
}
@@ -186,6 +194,15 @@ describe('SettingsModal', () => {
expect(screen.getByText(/Configured radio contact capacity/i)).toBeInTheDocument();
});
it('shows reconnect action when radio connection is paused', () => {
renderModal({
health: { ...baseHealth, radio_state: 'paused' },
});
openRadioSection();
expect(screen.getByRole('button', { name: 'Reconnect' })).toBeInTheDocument();
});
it('saves changed max contacts value through onSaveAppSettings', async () => {
const { onSaveAppSettings } = renderModal();
openRadioSection();
@@ -309,6 +326,8 @@ describe('SettingsModal', () => {
onSaveAppSettings={onSaveAppSettings}
onSetPrivateKey={vi.fn(async () => {})}
onReboot={vi.fn(async () => {})}
onDisconnect={vi.fn(async () => {})}
onReconnect={vi.fn(async () => {})}
onAdvertise={vi.fn(async () => {})}
onHealthRefresh={vi.fn(async () => {})}
onRefreshAppSettings={vi.fn(async () => {})}
@@ -330,6 +349,8 @@ describe('SettingsModal', () => {
onSave,
onSetPrivateKey,
onReboot,
onDisconnect: vi.fn(async () => {}),
onReconnect: vi.fn(async () => {}),
});
openRadioSection();
+13
View File
@@ -48,6 +48,19 @@ describe('StatusBar', () => {
expect(screen.getByRole('button', { name: 'Reconnect' })).toBeInTheDocument();
});
it('shows Radio Paused and a Connect action when reconnect attempts are paused', () => {
render(
<StatusBar
health={{ ...baseHealth, radio_state: 'paused' }}
config={null}
onSettingsClick={vi.fn()}
/>
);
expect(screen.getByRole('status', { name: 'Radio Paused' })).toBeInTheDocument();
expect(screen.getByRole('button', { name: 'Connect' })).toBeInTheDocument();
});
it('toggles between classic and light themes from the shortcut button', () => {
localStorage.setItem('remoteterm-theme', 'cyberpunk');