mirror of
https://github.com/MarekWo/mc-webui.git
synced 2026-03-28 17:42:45 +01:00
feat: Add unknown delivery status indicator + update docs
Add clickable "?" icon on DMs without ACK, showing a popup explaining that delivery is unknown (mobile-friendly). Update README, user guide with new features (Analyzer links, DM delivery tracking). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,8 @@ A lightweight web interface for meshcore-cli, providing browser-based access to
|
||||
- **Interactive Console** - Direct meshcli command execution via WebSocket
|
||||
- **@Mentions autocomplete** - Type @ to see contact suggestions with fuzzy search
|
||||
- **Echo tracking** - "Heard X repeats" with repeater IDs for sent messages, route path for incoming messages (persisted across restarts)
|
||||
- **MeshCore Analyzer** - View packet details on analyzer.letsmesh.net directly from channel messages
|
||||
- **DM delivery tracking** - ACK-based delivery confirmation with SNR and route info
|
||||
- **PWA support** - Browser notifications and installable app (experimental)
|
||||
- **Full offline support** - Works without internet (local Bootstrap, icons, emoji picker)
|
||||
|
||||
@@ -308,6 +310,8 @@ sudo ~/mc-webui/scripts/updater/install.sh --uninstall
|
||||
- [x] Interactive Console - Direct meshcli access via WebSocket with command history
|
||||
- [x] Contact Map - View contacts with GPS coordinates on OpenStreetMap (Leaflet)
|
||||
- [x] Echo Tracking - "Heard X repeats" badge for sent channel messages
|
||||
- [x] MeshCore Analyzer - Packet analysis links on channel messages (analyzer.letsmesh.net)
|
||||
- [x] DM Delivery Tracking - ACK-based delivery checkmarks with SNR/route details
|
||||
|
||||
### Next Steps
|
||||
|
||||
|
||||
@@ -536,6 +536,30 @@ main {
|
||||
color: #dc3545;
|
||||
}
|
||||
|
||||
.dm-status.unknown {
|
||||
color: #adb5bd;
|
||||
}
|
||||
|
||||
.dm-status-unknown {
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.dm-delivery-popup {
|
||||
position: absolute;
|
||||
bottom: 100%;
|
||||
right: 0;
|
||||
background-color: #333;
|
||||
color: #fff;
|
||||
padding: 0.35rem 0.6rem;
|
||||
border-radius: 0.375rem;
|
||||
font-size: 0.7rem;
|
||||
white-space: nowrap;
|
||||
z-index: 1000;
|
||||
pointer-events: none;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
/* DM Action Buttons */
|
||||
.dm-actions {
|
||||
display: flex;
|
||||
|
||||
@@ -424,7 +424,7 @@ function displayMessages(messages) {
|
||||
|
||||
// Status icon for own messages
|
||||
let statusIcon = '';
|
||||
if (msg.is_own && msg.status) {
|
||||
if (msg.is_own) {
|
||||
if (msg.status === 'delivered') {
|
||||
let title = 'Delivered';
|
||||
if (msg.delivery_snr !== null && msg.delivery_snr !== undefined) {
|
||||
@@ -432,12 +432,11 @@ function displayMessages(messages) {
|
||||
}
|
||||
if (msg.delivery_route) title += ` (${msg.delivery_route})`;
|
||||
statusIcon = `<i class="bi bi-check2 dm-status delivered" title="${title}"></i>`;
|
||||
} else if (msg.status === 'pending') {
|
||||
statusIcon = '<i class="bi bi-clock dm-status pending" title="Sending..."></i>';
|
||||
} else {
|
||||
const icons = {
|
||||
'pending': '<i class="bi bi-clock dm-status pending" title="Sending..."></i>',
|
||||
'timeout': '<i class="bi bi-x-circle dm-status timeout" title="Not delivered"></i>'
|
||||
};
|
||||
statusIcon = icons[msg.status] || '';
|
||||
// No ACK received — show clickable "?" with explanation
|
||||
statusIcon = `<span class="dm-status-unknown" onclick="showDeliveryInfo(this)"><i class="bi bi-question-circle dm-status unknown"></i></span>`;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -630,6 +629,29 @@ function resendMessage(content) {
|
||||
input.focus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show delivery info popup (mobile-friendly, same pattern as showPathPopup)
|
||||
*/
|
||||
function showDeliveryInfo(element) {
|
||||
const existing = document.querySelector('.dm-delivery-popup');
|
||||
if (existing) existing.remove();
|
||||
|
||||
const popup = document.createElement('div');
|
||||
popup.className = 'dm-delivery-popup';
|
||||
popup.textContent = 'Delivery unknown \u2014 no ACK received. Message may still have been delivered.';
|
||||
element.style.position = 'relative';
|
||||
element.appendChild(popup);
|
||||
|
||||
const dismiss = () => popup.remove();
|
||||
setTimeout(dismiss, 5000);
|
||||
document.addEventListener('click', function handler(e) {
|
||||
if (!element.contains(e.target)) {
|
||||
dismiss();
|
||||
document.removeEventListener('click', handler);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup emoji picker
|
||||
*/
|
||||
|
||||
@@ -166,8 +166,9 @@ Access the Direct Messages feature:
|
||||
|
||||
### Message Status Indicators
|
||||
|
||||
- ✓ **Delivered** (green checkmark) - Recipient confirmed receipt (ACK). Tap/hover for SNR and route details
|
||||
- ? **Unknown** (gray question mark) - No ACK received. Message may still have been delivered — ACK packets are often lost over multi-hop routes. Tap the icon for details
|
||||
- ⏳ **Pending** (clock icon, yellow) - Message sent, awaiting delivery confirmation
|
||||
- Note: Due to meshcore-cli limitations, we cannot track actual delivery status
|
||||
|
||||
### DM Notifications
|
||||
|
||||
|
||||
Reference in New Issue
Block a user