diff --git a/src/api/connection.ts b/src/api/connection.ts index e7864f15..852ec066 100644 --- a/src/api/connection.ts +++ b/src/api/connection.ts @@ -25,9 +25,14 @@ export const requestAutoConnectPort = async () => { export const getAllBluetooth = async () => { const response = (await invoke("get_all_bluetooth", { request: {}, - })) as { candidates: string[] }; - - return response.candidates; + })) as { candidates: Array<{ 0: string }> | string[] }; + + // Handle both formats: newtype struct { 0: string } and plain strings + return Array.isArray(response.candidates) + ? response.candidates.map((candidate: any) => + typeof candidate === "string" ? candidate : candidate[0], + ) + : []; }; export const getAllSerialPorts = async () => { diff --git a/src/features/device/api.ts b/src/features/device/api.ts index 905f2824..5cbeaf21 100644 --- a/src/features/device/api.ts +++ b/src/features/device/api.ts @@ -63,11 +63,17 @@ export const useDeviceApi = () => { const TYPE = DeviceApiActions.GetAvailableBluetoothDevices; await trackRequestOperation(TYPE, dispatch, async () => { - const bluetoothDevices = await backendConnectionApi.getAllBluetooth(); + try { + const bluetoothDevices = await backendConnectionApi.getAllBluetooth(); - dispatch( - deviceSliceActions.setAvailableBluetoothDevices(bluetoothDevices), - ); + dispatch( + deviceSliceActions.setAvailableBluetoothDevices(bluetoothDevices), + ); + } catch (e) { + // Handle BLE scanning errors gracefully + console.error("Failed to scan for Bluetooth devices:", e); + dispatch(deviceSliceActions.setAvailableBluetoothDevices([])); + } }); }; diff --git a/src/features/device/slice.ts b/src/features/device/slice.ts index f2409a93..dfb0a214 100644 --- a/src/features/device/slice.ts +++ b/src/features/device/slice.ts @@ -63,6 +63,10 @@ export const deviceSlice = createSlice({ setAutoConnectPort: (state, action: PayloadAction) => { state.autoConnectPort = action.payload; }, + + setAutoConnectBluetooth: (state, action: PayloadAction) => { + state.autoConnectBluetooth = action.payload; + }, }, });