Skip to content

Commit 09f996c

Browse files
Merge pull request #391 from pollen-robotics/fix-and-improve-update-settings
Fix and improve update settings
2 parents fdf15d8 + 1b98ded commit 09f996c

File tree

5 files changed

+117
-82
lines changed

5 files changed

+117
-82
lines changed

src/reachy_mini/daemon/app/dashboard/static/js/update.js

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ const updateManager = {
22
busy: false,
33
preRelease: false,
44

5-
isUpdateAvailable: async () => {
5+
checkForUpdate: async () => {
6+
await updateManager.updateUI(); // Clear previous state
7+
68
await fetch('/update/available?pre_release=' + updateManager.preRelease)
79
.then(async response => {
810
if (!response.ok) {
911
return false;
1012
}
1113
const data = await response.json();
12-
return data.update.reachy_mini;
14+
await updateManager.updateUI(data);
1315
}).catch(error => {
1416
console.error('Error checking for updates:', error);
1517
});
@@ -44,66 +46,87 @@ const updateManager = {
4446

4547
connectLogsWebSocket: (jobId) => {
4648
const updateModal = document.getElementById('update-modal');
47-
const updateModalTitle = updateModal.queryElementById('update-modal-title');
49+
const updateModalTitle = document.getElementById('update-modal-title');
4850
const logsDiv = document.getElementById('update-logs');
4951
const closeButton = document.getElementById('update-modal-close-button');
5052

5153
updateModalTitle.textContent = 'Updating...';
5254

5355
closeButton.onclick = () => {
54-
installModal.classList.add('hidden');
56+
updateModal.classList.add('hidden');
5557
};
56-
closeButton.classList = "hidden";
57-
closeButton.textContent = '';
5858

59-
updateModal.classList.removeAttribute('hidden');
59+
updateModal.classList.remove('hidden');
6060

61-
const ws = new WebSocket(`ws://${location.host}/api/update/ws/logs?job_id=${jobId}`);
61+
const ws = new WebSocket(`ws://${location.host}/update/ws/logs?job_id=${jobId}`);
6262

6363
ws.onmessage = (event) => {
64+
// console.log('Update log:', event);
65+
logsDiv.innerHTML += event.data + '<br>';
66+
logsDiv.scrollTop = logsDiv.scrollHeight;
6467
};
6568
ws.onclose = async () => {
69+
console.log('Update logs WebSocket closed');
70+
closeButton.classList.remove('hidden');
71+
closeButton.textContent = 'Close';
72+
updateModalTitle.textContent = 'Update Completed ✅';
73+
6674
updateManager.busy = false;
67-
updateManager.updateUI();
75+
await updateManager.checkForUpdate();
6876
};
6977
},
7078

71-
updateUI: async () => {
72-
const isUpdateAvailable = await updateManager.isUpdateAvailable();
73-
74-
updateManager.updateMainPage(isUpdateAvailable);
75-
updateManager.updateUpdatePage(isUpdateAvailable);
79+
updateUI: async (update) => {
80+
// updateManager.updateMainPage(isUpdateAvailable);
81+
updateManager.updateUpdatePage(update);
7682
},
7783

78-
updateMainPage: async (isUpdateAvailable) => {
79-
const daemonUpdateBtn = document.getElementById('daemon-update-btn');
80-
if (!daemonUpdateBtn) return;
81-
82-
if (isUpdateAvailable) {
83-
daemonUpdateBtn.innerHTML = 'Update <span class="rounded-full bg-blue-700 text-white text-xs font-semibold px-2 py-1 ml-2">1</span>';
84-
} else {
85-
daemonUpdateBtn.innerHTML = 'Update';
86-
}
87-
},
88-
updateUpdatePage: async (isUpdateAvailable) => {
84+
// updateMainPage: async (update) => {
85+
// const daemonUpdateBtn = document.getElementById('daemon-update-btn');
86+
// if (!daemonUpdateBtn) return;
87+
88+
// if (isUpdateAvailable) {
89+
// daemonUpdateBtn.innerHTML = 'Update <span class="rounded-full bg-blue-700 text-white text-xs font-semibold px-2 py-1 ml-2">1</span>';
90+
// } else {
91+
// daemonUpdateBtn.innerHTML = 'Update';
92+
// }
93+
// },
94+
updateUpdatePage: async (data) => {
8995
const statusElem = document.getElementById('update-status');
9096
if (!statusElem) return;
9197

92-
const checkAgainBtn = document.getElementById('check-again-btn');
98+
const currentVersionElem = document.getElementById('current-version');
99+
const availableVersionElem = document.getElementById('available-version');
100+
const availableVersionContainer = document.getElementById('available-version-container');
93101
const startUpdateBtn = document.getElementById('start-update-btn');
94102

103+
if (!data || !data.update || !data.update.reachy_mini) {
104+
statusElem.innerHTML = 'Checking for updates...';
105+
if (currentVersionElem) currentVersionElem.textContent = '';
106+
if (availableVersionElem) availableVersionElem.textContent = '';
107+
return;
108+
}
109+
110+
const updateInfo = data.update.reachy_mini;
111+
const isUpdateAvailable = updateInfo.is_available;
112+
const currentVersion = updateInfo.current_version || '-';
113+
const availableVersion = updateInfo.available_version || '-';
114+
115+
if (currentVersionElem) currentVersionElem.textContent = `Current version: ${currentVersion}`;
116+
if (availableVersionElem) availableVersionElem.textContent = `Available version: ${availableVersion}`;
117+
95118
if (isUpdateAvailable) {
96119
statusElem.innerHTML = 'An update is available!';
97-
checkAgainBtn.classList.add('hidden');
120+
if (availableVersionContainer) availableVersionContainer.classList.remove('hidden');
98121
startUpdateBtn.classList.remove('hidden');
99122
} else {
100123
statusElem.innerHTML = 'Your system is up to date.';
101-
checkAgainBtn.classList.remove('hidden');
124+
if (availableVersionContainer) availableVersionContainer.classList.add('hidden');
102125
startUpdateBtn.classList.add('hidden');
103126
}
104127
}
105128
};
106129

107130
window.addEventListener('load', async () => {
108-
updateManager.updateUI();
131+
await updateManager.checkForUpdate();
109132
});
Lines changed: 43 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,54 @@
11
<div class="app-section">
22
<div class="app-section-title">Reachy Mini Update</div>
33

4-
<div id="update-status" class="pt-4"></div>
4+
<div class="mt-2">
5+
<button id="check-again-btn" class="px-4 py-2 bg-gray-200 hover:bg-gray-300 rounded-lg shadow"
6+
onclick="updateManager.checkForUpdate()">Check for Updates</button>
7+
<label style="margin-left:1em;">
8+
<input type="checkbox" id="pre-release-checkbox"
9+
onchange="updateManager.preRelease = this.checked; updateManager.checkForUpdate();">
10+
pre-release
11+
</label>
12+
</div>
513

6-
<button id="check-again-btn" class="mt-4 px-4 py-2 bg-gray-200 hover:bg-gray-300 rounded-lg shadow hidden"
7-
onclick="updateManager.updateUI()">Check
8-
Again</button>
14+
<div class="flex flex-col gap-2 pt-4">
15+
<div id="update-status"></div>
16+
<div class="flex flex-row gap-4">
17+
<div class="flex flex-col gap-2 w-full px-4">
18+
<div><span id="current-version" class="font-mono text-blue-700"></span></div>
19+
<div><span id="available-version" class="font-mono text-green-700"></span></div>
20+
</div>
21+
</div>
22+
23+
<div class="mt-4">
24+
<button id="start-update-btn"
25+
class="px-4 py-2 bg-gray-200 hover:bg-gray-300 rounded-lg shadow hidden bg-green-400 hover:bg-green-500 text-white"
26+
onclick="updateManager.startUpdate()">Start Update</button>
27+
</div>
28+
</div>
29+
</div>
930

10-
<button id="start-update-btn"
11-
class="mt-4 px-4 py-2 bg-gray-200 hover:bg-gray-300 rounded-lg shadow hidden bg-green-400 hover:bg-green-500 text-white"
12-
onclick="updateManager.startUpdate()">Start Update</button>
1331

14-
<div id="update-modal" tabindex="-1" aria-hidden="true"
15-
class="hidden fixed inset-0 z-50 flex items-center justify-center w-full h-full">
16-
<div class="relative p-4 w-full max-w-2xl max-h-full">
17-
<div class="relative bg-white rounded-lg shadow-sm dark:bg-gray-700">
18-
<div
19-
class="flex items-center justify-between p-4 md:p-5 border-b rounded-t dark:border-gray-600 border-gray-200">
20-
<h3 id="update-modal-title" class="text-xl font-semibold text-gray-900 dark:text-white"></h3>
21-
</div>
22-
<div class="p-4 md:p-5 space-y-4">
23-
<div id="update-logs" class="overflow-y-auto max-h-48 text-gray-500 dark:text-gray-400">
24-
</div>
25-
</div>
26-
<div
27-
class="flex items-center justify-center p-4 md:p-5 border-t border-gray-200 rounded-b dark:border-gray-600">
28-
<button id="update-modal-close-button" data-modal-hide="default-modal" type="button"
29-
class="hidden"></button>
32+
<div id="update-modal" tabindex="-1" aria-hidden="true"
33+
class="hidden fixed inset-0 z-50 flex items-center justify-center w-full h-full">
34+
<div class="relative p-4 w-full max-w-2xl max-h-full">
35+
<div class="relative bg-white rounded-lg shadow-sm dark:bg-gray-700">
36+
<div
37+
class="flex items-center justify-between p-4 md:p-5 border-b rounded-t dark:border-gray-600 border-gray-200">
38+
<h3 id="update-modal-title" class="text-xl font-semibold text-gray-900 dark:text-white"></h3>
39+
</div>
40+
<div class="p-4 md:p-5 space-y-4">
41+
<div id="update-logs" class="overflow-y-auto max-h-48 text-gray-500 dark:text-gray-400">
3042
</div>
3143
</div>
44+
<div
45+
class="flex items-center justify-center p-4 md:p-5 border-t border-gray-200 rounded-b dark:border-gray-600">
46+
<button id="update-modal-close-button" data-modal-hide="default-modal" type="button"
47+
class="px-4 py-2 bg-blue-600 dark:bg-blue-600 hover:bg-blue-700 text-white rounded-lg shadow hidden">
48+
Close
49+
</button>
50+
</div>
3251
</div>
3352
</div>
53+
</div>
3454
</div>

src/reachy_mini/daemon/app/dashboard/update.html

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/reachy_mini/daemon/app/routers/update.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,40 @@
1212
from reachy_mini.daemon.app import bg_job_register
1313
from reachy_mini.daemon.app.bg_job_register import JobInfo
1414
from reachy_mini.utils.wireless_version.update import update_reachy_mini
15-
from reachy_mini.utils.wireless_version.update_available import is_update_available
15+
from reachy_mini.utils.wireless_version.update_available import (
16+
get_local_version,
17+
get_pypi_version,
18+
is_update_available,
19+
)
1620

1721
router = APIRouter(prefix="/update")
1822
busy_lock = threading.Lock()
1923

2024

2125
@router.get("/available")
22-
def available(pre_release: bool = False) -> dict[str, dict[str, bool]]:
26+
def available(pre_release: bool = False) -> dict[str, dict[str, dict[str, bool | str]]]:
2327
"""Check if an update is available for Reachy Mini Wireless."""
2428
if busy_lock.locked():
2529
raise HTTPException(status_code=400, detail="Update is in progress")
2630

31+
current_version = str(get_local_version("reachy_mini"))
32+
2733
try:
28-
return {
29-
"update": {
30-
"reachy_mini": is_update_available("reachy_mini", pre_release),
34+
is_available = is_update_available("reachy_mini", pre_release)
35+
available = str(get_pypi_version("reachy_mini", pre_release))
36+
except (ConnectionError, requests.exceptions.ConnectionError):
37+
is_available = False
38+
available = "unknown"
39+
40+
return {
41+
"update": {
42+
"reachy_mini": {
43+
"is_available": is_available,
44+
"current_version": current_version,
45+
"available_version": available,
3146
}
3247
}
33-
except (ConnectionError, requests.exceptions.ConnectionError):
34-
raise HTTPException(status_code=503, detail="Unable to check for updates")
48+
}
3549

3650

3751
@router.post("/start")

src/reachy_mini/utils/wireless_version/update_available.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def get_pypi_version(package_name: str, pre_release: bool) -> semver.Version:
3333
releases = list(data["releases"].keys())
3434
pre_version = _semver_version(releases[-1])
3535
if pre_version > version:
36-
version = pre_version
36+
return pre_version
3737

3838
return _semver_version(version)
3939

0 commit comments

Comments
 (0)