fix: event pagination

- Added secondary sort by id DESC for consistent ordering
- Fixed hasMore calculation to use actual events returned
- Only append events in frontend if we got new ones
- Made SQL query more readable
This commit is contained in:
Josh Finlay 2025-01-08 09:47:01 +10:00
parent 3ad694f34b
commit c8a48e8e7a
3 changed files with 16 additions and 5 deletions

View File

@ -206,7 +206,12 @@ async def get_events(limit: int = 10, offset: int = 0):
# Get paginated events # Get paginated events
async with db.execute( async with db.execute(
"SELECT timestamp, action, source, success FROM events ORDER BY timestamp DESC LIMIT ? OFFSET ?", """
SELECT timestamp, action, source, success
FROM events
ORDER BY timestamp DESC, id DESC
LIMIT ? OFFSET ?
""",
(limit, offset) (limit, offset)
) as cursor: ) as cursor:
events = [ events = [
@ -222,7 +227,7 @@ async def get_events(limit: int = 10, offset: int = 0):
return { return {
"events": events, "events": events,
"total": total, "total": total,
"hasMore": total > (offset + limit) "hasMore": offset + len(events) < total
} }
except Exception as e: except Exception as e:
logger.error(f"Failed to get events: {e}", exc_info=True) logger.error(f"Failed to get events: {e}", exc_info=True)

View File

@ -198,6 +198,10 @@ class HomeAssistantMQTT:
"""Set callback for handling commands""" """Set callback for handling commands"""
self.command_callback = callback self.command_callback = callback
def is_connected(self) -> bool:
"""Return current connection status"""
return self._connected
def update_settings(self, settings): def update_settings(self, settings):
"""Update MQTT settings""" """Update MQTT settings"""
logger.info(f"Updating MQTT settings - Broker: {settings.broker}:{settings.port}") logger.info(f"Updating MQTT settings - Broker: {settings.broker}:{settings.port}")

View File

@ -117,9 +117,11 @@ function App() {
const handleLoadMore = async () => { const handleLoadMore = async () => {
try { try {
const moreEvents = await api.getEvents(10, events.length); const moreEvents = await api.getEvents(10, events.length);
setEvents(prev => [...prev, ...moreEvents.events]); if (moreEvents.events.length > 0) {
setHasMoreEvents(moreEvents.hasMore); setEvents(prev => [...prev, ...moreEvents.events]);
setTotalEvents(moreEvents.total); setHasMoreEvents(moreEvents.hasMore);
setTotalEvents(moreEvents.total);
}
} catch (err) { } catch (err) {
setError('Failed to load more events'); setError('Failed to load more events');
console.error(err); console.error(err);