diff --git a/app/migrations.py b/app/migrations.py index dc99ce7..d3cb5b5 100644 --- a/app/migrations.py +++ b/app/migrations.py @@ -993,4 +993,3 @@ async def _migrate_015_fix_null_sender_timestamp(conn: aiosqlite.Connection) -> ) await conn.commit() - diff --git a/app/radio.py b/app/radio.py index c4b4f9e..67c0ac2 100644 --- a/app/radio.py +++ b/app/radio.py @@ -329,10 +329,9 @@ class RadioManager: if not current_connected: # Attempt reconnection on every loop while disconnected - if not self.is_reconnecting: - if await self.reconnect(): - await self.post_connect_setup() - self._last_connected = True + if not self.is_reconnecting and await self.reconnect(): + await self.post_connect_setup() + self._last_connected = True elif not self._last_connected and current_connected: # Connection restored (might have reconnected automatically) diff --git a/app/radio_sync.py b/app/radio_sync.py index d8969fc..b6a2ebb 100644 --- a/app/radio_sync.py +++ b/app/radio_sync.py @@ -18,7 +18,12 @@ from meshcore import EventType from app.models import Contact from app.radio import radio_manager -from app.repository import AppSettingsRepository, ChannelRepository, ContactRepository, MessageRepository +from app.repository import ( + AppSettingsRepository, + ChannelRepository, + ContactRepository, + MessageRepository, +) logger = logging.getLogger(__name__) diff --git a/app/routers/packets.py b/app/routers/packets.py index b8ad3ff..395c492 100644 --- a/app/routers/packets.py +++ b/app/routers/packets.py @@ -1,7 +1,7 @@ import logging -import aiosqlite from hashlib import sha256 +import aiosqlite from fastapi import APIRouter, BackgroundTasks from pydantic import BaseModel, Field diff --git a/frontend/src/hooks/useConversationMessages.ts b/frontend/src/hooks/useConversationMessages.ts index aac3fbe..2280f2b 100644 --- a/frontend/src/hooks/useConversationMessages.ts +++ b/frontend/src/hooks/useConversationMessages.ts @@ -128,12 +128,15 @@ export function useConversationMessages( return; // Get the true oldest message as cursor for the next page - const oldestMessage = messages.reduce((oldest, msg) => { - if (!oldest) return msg; - if (msg.received_at < oldest.received_at) return msg; - if (msg.received_at === oldest.received_at && msg.id < oldest.id) return msg; - return oldest; - }, null as Message | null); + const oldestMessage = messages.reduce( + (oldest, msg) => { + if (!oldest) return msg; + if (msg.received_at < oldest.received_at) return msg; + if (msg.received_at === oldest.received_at && msg.id < oldest.id) return msg; + return oldest; + }, + null as Message | null + ); if (!oldestMessage) return; setLoadingOlder(true); diff --git a/tests/test_message_prefix_claim.py b/tests/test_message_prefix_claim.py index c82e28e..e98c4af 100644 --- a/tests/test_message_prefix_claim.py +++ b/tests/test_message_prefix_claim.py @@ -3,7 +3,7 @@ import pytest from app.database import Database -from app.repository import MessageRepository +from app.repository import ContactRepository, MessageRepository @pytest.fixture @@ -29,6 +29,9 @@ async def test_claim_prefix_promotes_dm_to_full_key(test_db): full_key = "a1b2c3d3ba9f5fa8705b9845fe11cc6f01d1d49caaf4d122ac7121663c5beec7" prefix = full_key[:6].upper() + # Create the contact so the claim safety check (exactly 1 contact matches prefix) passes + await ContactRepository.upsert({"public_key": full_key, "name": "Test"}) + msg_id = await MessageRepository.create( msg_type="PRIV", text="hello",