feat(ui): mesh header "Flash LoRa" button opens the in-app flash flow
Demo images / Build & push demo images (push) Failing after 2m9s

Replaces the external flasher.meshcore.co.uk link with a button that
opens the global device-setup modal directly at its flash step, via a
new manual entry point in the mesh store (flashFlowPath). Manual opens
target the connected radio (else the first detected stick), skip the
read-only probe — the port is held by the live session and a second tty
opener corrupts it; the backend flash job stops the listener itself —
and close the modal instead of stepping back to the detection screen.
Button is disabled with a hint when no radio is present.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
archipelago
2026-07-29 04:43:38 -04:00
co-authored by Claude Fable 5
parent c99f1c7b77
commit 6ba39041d0
4 changed files with 59 additions and 7 deletions
+13
View File
@@ -377,6 +377,16 @@ export const useMeshStore = defineStore('mesh', () => {
}
localStorage.setItem(DETECT_DISMISS_KEY, JSON.stringify(dismissedDetected.value))
}
// Manual "Flash LoRa" entry (Mesh header button): forces the global setup
// modal open at the flash step for this port — including the live session's
// port, which detection-driven opening deliberately excludes.
const flashFlowPath = ref<string | null>(null)
function openFlashFlow(path: string) {
flashFlowPath.value = path
}
function closeFlashFlow() {
flashFlowPath.value = null
}
/** Read-only firmware/config probe of a detected port (hot-swap modal). */
async function probeDevice(path: string): Promise<MeshDeviceProbe> {
return rpcClient.call<MeshDeviceProbe>({
@@ -1066,6 +1076,9 @@ export const useMeshStore = defineStore('mesh', () => {
fetchStatus,
undismissedDetectedDevices,
dismissDetectedDevice,
flashFlowPath,
openFlashFlow,
closeFlashFlow,
probeDevice,
flashListFirmware,
flashDevice,