Commit Graph
205 Commits
Author SHA1 Message Date
jack 784a809d07 Add delivery confirmation and read receipts for private messages
- Implement full delivery status flow: sending → sent → delivered → read
- Add visual indicators (gray/green/blue checkmarks)
- Create DeliveryTracker service for managing confirmations
- Add end-to-end encrypted ACK and read receipt messages
- Handle ephemeral peer ID changes with message migration
- Fix message ID preservation in BinaryProtocol
- Ensure proper delivery status for incoming messages
- Add multiple triggers for sending read receipts
- Maintain full backwards compatibility with older clients

Visual indicators:
- ○ Gray circle = Sending
- ✓ Gray check = Sent
- ✓✓ Green double checks = Delivered
- ✓✓ Blue double checks = Read
- ⚠ Red triangle = Failed
2025-07-06 23:44:42 +02:00
jack 13d9be9082 Fix read receipts for existing messages when opening chat
Critical fixes:
1. Match messages by sender nickname in addition to peer ID (since peer IDs change)
2. Send read receipts to CURRENT peer ID, not old senderPeerID from message
3. Remove requirement for senderPeerID to be non-nil (blocks older messages)
4. Add extensive logging to trace the flow

The core issue was that peer IDs are ephemeral and change between sessions:
- Rick sends message with peer ID A
- Later, Jack connects to Rick who now has peer ID B
- Read receipt needs to be sent to B, not A
- Messages need to be matched by nickname, not just peer ID
2025-07-06 22:55:51 +02:00
jack d892c790a7 Fix read receipts being overwritten by delivery ACKs
- Added logic to prevent downgrading from 'read' status to 'delivered'
- When an ACK arrives after a read receipt, the read status is preserved
- This fixes the issue where blue checkmarks briefly appear then revert to green
- Applied fix to all message types (main, private, room)
2025-07-06 22:52:10 +02:00
jack 8b79721725 Fix read receipts not being sent for existing messages
- Added app activation observer to send read receipts when app becomes active
- Send read receipts for all unread messages when receiving a new message while chat is open
- Added import for NSApplication/UIApplication notifications
- This ensures messages are marked as read even when opening chat from notifications or returning to app
2025-07-06 22:47:02 +02:00
jack e93d02afd0 Fix read receipts for existing messages when opening chat
- Added delay to ensure messages are loaded before checking
- Fixed logic to check if message is FROM the other person (not TO them)
- Added onAppear handler to send read receipts when view loads
- Added detailed logging to debug the flow
- Now correctly identifies received messages that need read receipts
2025-07-06 22:42:08 +02:00
jack fbe779e684 Fix read receipts and improve UI
- Changed back to bold blue double checkmarks for read status
- Send read receipts for both 'sent' and 'delivered' status messages
- Added onChange handler to send read receipts whenever switching to a private chat
- Made markPrivateMessagesAsRead public so it can be called from views
- This ensures read receipts are sent when opening a chat from notifications or any other way
2025-07-06 22:37:59 +02:00
jack 1fec1ee315 Fix read receipts using wrong peer ID
- Read receipts were being sent to the current ephemeral peer ID instead of the message's senderPeerID
- This caused read receipts to be lost when peer IDs changed between sessions
- Now using message.senderPeerID consistently for all read receipt sending
- Added detailed logging to track which peer ID receives the read receipt
2025-07-06 22:30:33 +02:00
jack ab5af1546d Add comprehensive logging and force UI updates for delivery status
- Add logging to track what delivery status is shown in UI
- Add logging when green/blue checkmarks appear
- Force complete dictionary reassignment to trigger SwiftUI updates
- Add diagnostics to understand why blue checkmarks aren't showing
2025-07-06 22:26:56 +02:00
jack c9a594d0b5 Fix UI not updating for delivery status changes
- Use message ID instead of index for ForEach to trigger proper updates
- Add explicit objectWillChange.send() when updating delivery status
- Fix scroll-to-bottom logic to use message IDs
- This should make blue checkmarks appear when read receipts are received
2025-07-06 22:22:13 +02:00
jack d162a89ac2 Add debugging and fix read receipts for messages without delivery status
- Add detailed logging to track read receipt generation
- Handle messages that don't have delivery status (older messages)
- Send read receipts for all unread messages when opening chat
2025-07-06 22:14:41 +02:00
jack 942913fb6d Add debugging logs for delivery confirmation
- Track message IDs through the delivery process
- Log ACK generation and processing
- Log status updates in ChatViewModel
- Log read receipt generation and sending
2025-07-06 21:58:07 +02:00
jack e2b0632879 Add read receipts for private messages
- Added ReadReceipt structure and .readReceipt message type
- Added .read delivery status with blue checkmarks in UI
- Send read receipts when viewing a private chat
- Send read receipts immediately for new messages if chat is open
- Update message status from delivered to read when receipt received
2025-07-06 21:49:56 +02:00
jack 78cb8b1039 Fix delivery confirmation for private messages
- Pass message ID from ChatViewModel to BluetoothMeshService
- Preserve original message ID when creating ACK messages
- Move delivery tracking to ChatViewModel for consistent IDs
- Update project.yml to match current project structure
2025-07-06 21:25:41 +02:00
jack dc9e7242fd Fix unused variable warnings
- Remove unused keyData debug logging variables
- Clean up leftover debug logging comments
2025-07-05 21:36:59 +02:00
jack 463e94f379 Remove local logging functionality
- Delete LoggingService.swift
- Remove all bitchatLog() function calls throughout the codebase
- Update Xcode project to remove LoggingService references
- Clean up debug logging statements from all services and views
2025-07-05 21:36:59 +02:00
jack 1f890b00ac Add room-wide mandatory retention, update UI formatting, and documentation
- Implement room-wide message retention controlled by room owners
- Change username format from <name> to <@name> throughout UI
- Fix text alignment in chat messages (consistent font sizes)
- Add comprehensive technical whitepaper with Mermaid diagrams
- Update README with current features and commands
- Add retention status indicators and announcements
- Update command help text to use short versions (/j, /m)
2025-07-05 19:35:37 +02:00
jack 81f0022dbc Fix saved messages not loading on app restart
- Load saved messages for saved rooms during app initialization
- Messages are now restored when reopening the app
- Rooms marked as saved will show their message history immediately
2025-07-05 19:35:37 +02:00
jack f7ebcd6032 Add visual save indicator button for rooms
- Add bookmark icon button in room header to toggle save status
- Use bookmark.fill when room is saved, bookmark when not
- Button shows yellow when saved, default color when not
- Integrate with existing /save command functionality
- Add savedRooms published property for reactive UI updates
2025-07-05 19:35:37 +02:00
jack 41c2899008 Refactor room commands and improve UX
- Replace /list with /rooms showing all discovered rooms with join status
- Remove /discover command (merged into /rooms)
- Rename /favorite to /save for clarity
- Make room-specific commands (/transfer, /pass, /save) only appear in room context
- Remove voice notes from app info (feature doesn't exist)
- Remove Commands line from app info screen
- Show checkmark (✓) for joined rooms in /rooms output
2025-07-05 19:35:37 +02:00
jack 506c2bc7cb Implement message retention, retry mechanism, and app updates
- Add KeychainManager for secure password storage
- Implement MessageRetentionService for encrypted local storage of favorite room messages
- Add MessageRetryService for automatic retry of failed messages
- Add /favorite command to toggle room retention
- Add /discover command to find active rooms
- Fix all force unwrapped optionals in BluetoothMeshService
- Update app info screen with new features
- Integrate all services with proper cleanup on panic
2025-07-05 19:35:37 +02:00
jack 7151896102 feat: enhance password-protected rooms with key commitments and management
- Add key commitment scheme for immediate password verification
- Implement ownership transfer with /transfer command
- Add password change functionality with /pass command
- Include room metadata in initialization messages
- Remove /help command and rename /changepass to /pass
- Make room names tappable to show sidebar
- Remove spaces in person/room counter display
- Update UI to show lock icons and orange colors for protected rooms
- Fix password verification to work with empty rooms
- Add comprehensive tests for new functionality

This update significantly improves the security and usability of
password-protected rooms by allowing immediate verification without
waiting for encrypted messages.
2025-07-05 19:35:37 +02:00
jack cfded8c4df Fix room UI and membership tracking issues
- Add lock icon to room header for password management
- Change "leave" to "leave room" for clarity
- Fix bug where non-members appeared in room member list
- Only process room messages if user has joined the room
- Initialize room data structures on app launch
- Prevent auto-join when just mentioning a room
2025-07-05 19:35:37 +02:00
jack 8d553adc0c Implement password-protected rooms with encryption
- Room creators can set/remove passwords for their rooms
- Passwords are used to derive encryption keys via PBKDF2
- All messages in password-protected rooms are encrypted with AES-GCM
- Room protection status is announced to all peers
- Password and room data persists across app launches
- Visual lock indicators for password-protected rooms
- Password prompts when joining protected rooms
- Only room creators can modify password settings
- Encrypted messages show placeholder text if password is unknown
2025-07-05 19:35:37 +02:00
jack 4dec23e216 Implement proper room leave notifications and improve UI
- Send leave notifications when users exit rooms
- Update room member lists when peers leave rooms
- Change current user icon from dot to person.fill
- Handle room-specific leave messages via protocol
- Maintain backwards compatibility for general peer disconnection
2025-07-05 19:35:37 +02:00
jack a83dee34ba Update logging to only write to disk on macOS
- Add conditional compilation to LoggingService
- macOS continues to write logs to Documents/Logs
- iOS uses /dev/null to prevent disk writes
- Remove room auto-join on mention (only join when sending to room)
2025-07-05 19:35:37 +02:00
jack 22e02633b5 Add comprehensive logging system for debugging
- Create LoggingService that writes to Documents/Logs directory
- Log to both console and file with timestamps
- Replace debug print statements with bitchatLog()
- Add log file location display in AppInfoView
- Enable opening log file in Finder on macOS
- Track room member operations and view state
- Persist logs for debugging room member display issues
2025-07-05 19:35:37 +02:00
jack 10ee001728 Add room message indicator and simplify room header
- Add blue hashtag icon in main header when there are unread room messages
- Remove member count from room title for cleaner look
- Add debug logging to diagnose room member list issue
2025-07-05 19:35:37 +02:00
jack bf4a572299 Fix critical room functionality issues
- Fix room field not being copied when creating messageWithPeerID in BluetoothMeshService
- This was causing all room messages to appear in main chat
- Fix room member tracking by ensuring senderPeerID is included
- Change room color from orange to blue to differentiate from private messages
- Clean up room members when peers disconnect to fix member count
- Add debug logging to track room field through message flow
2025-07-05 19:35:37 +02:00
jack 4051cda7e4 Remove debug logging for room messages 2025-07-05 19:35:37 +02:00
jack eee97881e9 Add debug logging for room message routing
- Log when sending messages with room context
- Log when receiving room vs main chat messages
- Helps diagnose if room field is being properly transmitted
2025-07-05 19:35:37 +02:00
jack f1fcf11dcc Improve room functionality
- Fix header to show "x people / y rooms" count
- Add proper leave room functionality that cleans up data
- Track and display room members in sidebar
- Show "IN #ROOM" header when viewing a room
- Only show peers who have sent messages to current room
- Add leave button in room header alongside main button
- Ensure senderPeerID is set for room member tracking
2025-07-05 19:35:37 +02:00
jack 3d7232222c Implement hashtag rooms feature
- Add room field to BitchatMessage structure
- Update BinaryProtocol to encode/decode room information
- Create room management in ChatViewModel (join/leave/switch rooms)
- Add BluetoothMeshService support for room messages
- Implement rooms UI in sidebar with unread counts
- Create clickable hashtags in messages to join rooms
- Add room persistence across app restarts
- Filter message display by current room selection
2025-07-05 19:35:37 +02:00
jack 4d61cec032 Prepare for App Store submission
- Added public domain headers to all test files
- Updated Info.plist with required App Store keys:
  - ITSAppUsesNonExemptEncryption = NO
  - LSApplicationCategoryType = Social Networking
  - UIRequiresFullScreen = YES
- Created proper Assets.xcassets structure
- Configured AppIcon.appiconset with all icon references
- Removed last TODO comment
- Created comprehensive App Store submission checklist
- Updated project.yml to include Assets.xcassets

The app is now ready for App Store submission. All debug code has been removed,
icons are configured, and privacy/security compliance is documented.
2025-07-04 16:44:00 +02:00
jack 0ab1f2ecfd Add public domain license and copyright headers
- Added LICENSE file with Unlicense (public domain dedication)
- Added public domain headers to all main source files
- Updated README to mention public domain status
- All code is free and unencumbered, released into the public domain

Anyone is free to use this code for any purpose without restriction.
2025-07-04 16:21:49 +02:00
jack 6023ff8af0 Fix thread safety issue causing peer count to show 0
- Add thread safety lock for activePeers Set access
- Force UI update when peer list changes with objectWillChange
- Add debug logging to track peer additions/removals
- This fixes the 'alone :/' display when peers are actually connected
2025-07-04 15:59:56 +02:00
jack a569b87a18 Fix store-and-forward duplicate message delivery and timestamp ordering
- Add tracking to prevent sending cached messages multiple times to the same peer
- Only cache messages for offline favorites, not online ones
- Sort messages by timestamp when adding to ensure proper chronological order
- Clean up tracking sets when peers disconnect to allow re-sending on reconnect
- Cache our own messages when sending to offline favorites
- Update favorite online notification text to "wanna get in there?"
2025-07-04 15:02:49 +02:00
jack 6f85faa6c0 Fix BLE advertisement warnings and duplicate registrations
- Remove 'Is Connectable' and 'Manufacturer Data' keys from BLE ads
- Only use allowed keys: service UUIDs and local name
- Prevent duplicate fingerprint registrations in favorites
- Comment out unused fragment type string variable

The warnings about advertisement keys should no longer appear.
2025-07-04 13:33:38 +02:00
jack f77cec3fb2 Analyze scalability and prepare for TestFlight
- Deep analysis of mesh network scalability limits
- Current full mesh topology supports ~20-30 users maximum
- Identified bottlenecks: O(n²) connections, message flooding, battery impact
- Documented future scaling solutions: hierarchical topology, DHT routing
- Ready for TestFlight submission with current capacity constraints
2025-07-04 11:53:57 +02:00
jack c7baf31f03 Implement indefinite store-and-forward for favorite peers
- Change message cache timeout from 5 minutes to 12 hours for regular peers
- Add indefinite message storage for favorite peers with 1000 message limit
- Cache relayed messages for offline favorites
- Automatically send cached messages when favorites come online
- Use public key fingerprints to identify favorites persistently
- Add isFavorite delegate method to check favorites by fingerprint
2025-07-04 01:51:37 +02:00
jack fe986ed397 Fix encryption key exchange and add persistent identity for favorites
- Implement three-tier key system: ephemeral encryption, ephemeral signing, persistent identity
- Fix signature verification by properly separating KeyAgreement and Signing keys
- Add persistent identity key for favorites that survives app restarts
- Fix Data subscript crashes by converting to byte arrays
- Add proper error handling for key exchange
- Private messages remain fully encrypted with ephemeral keys
2025-07-04 01:43:16 +02:00
jack 34e51b3d9a Fix peer nickname display once and for all
- Only show peers in UI who have announced (have nicknames)
- Filter out peers without nicknames from getAllConnectedPeerIDs()
- Send announces proactively when app starts, not just on connection
- Send announces immediately when nickname changes via saveNickname()
- Send announces when Bluetooth services become available
- Send announces multiple times (0.5s, 1s, 2s) for reliability
- Add sendBroadcastAnnounce() method for proactive announcing

This ensures peers always see proper nicknames, never 'person-xxx'
2025-07-03 23:38:17 +02:00
jack 8346ecd2a7 Fix message display and add voice note debugging
- Fix escaped backslashes in timestamp and sender name display
- Add comprehensive logging for voice note transmission pipeline
- Add peripheral write completion logging
- Track broadcast success/failure for central updates
- Log audio recorder creation and preparation steps
- Better diagnostics for troubleshooting voice note issues
2025-07-03 23:28:07 +02:00
jack 78ddb36db7 Add tap-to-PM and favorite features
- Make sender names tappable in messages to start private chat
- Add star button in private chat header to favorite/unfavorite peers
- Refactor message view to separate timestamp, sender, and content
- Add helper methods for formatting different parts of messages
- Own sender name is not tappable (only other users)
- Voice notes remain tappable to play/pause
2025-07-03 23:24:30 +02:00
jack d6ae19e11e Enable notifications on macOS
- Add macOS support to NotificationService
- Use NSApplication.shared.isActive to check app state on macOS
- Move notification logic outside of iOS-only block in ChatViewModel
- Notifications now work for both mentions and private messages on macOS
- Keep haptic feedback iOS-only as it's not available on macOS
2025-07-03 23:21:29 +02:00
jack 2993fc3e06 Implement favorites, notifications, and improve fragment handling
- Add favorites functionality for peers with persistent storage
  - Star icon to toggle favorites in sidebar
  - Favorites appear at top of peer list
  - Storage persists across app launches using peer ID

- Add local notifications for mentions and private messages
  - Notifications appear when app is in background
  - Separate notification types for mentions vs private messages
  - Request notification permissions on app launch

- Fix sidebar header alignment to match main toolbar (44pt)
  - Add background color to sidebar header for visual consistency

- Improve voice note fragment transmission
  - Send fragments in batches of 5 with delays to prevent congestion
  - Better logging to debug fragment transmission issues
  - Reduce delay between fragments from 50ms to batch-based timing

- Fix other UI issues
  - Ensure mic recording ripples originate from mic button
  - Update sidebar to swipe from right edge smoothly
2025-07-03 22:13:28 +02:00
jack 94a9888ef5 Add push-to-talk voice notes functionality
- Added voice note support to BitchatMessage with audio data and duration
- Updated binary protocol to encode/decode voice notes (flag 0x40)
- Created AudioRecordingService for recording up to 10s voice clips
- Created AudioPlaybackService for playing voice notes
- Added microphone permission to Info.plist and project.yml
- Implemented push-to-talk UI with mic button in ContentView
- Voice notes use AAC compression at 16kHz/32kbps for small file sizes
- Added play/pause buttons for voice notes in message list
- Voice notes display as '🎤 Voice note (X.Xs)' in chat
- Platform-specific audio session handling for iOS/macOS
2025-07-03 01:13:16 +02:00
jack d142fde11d Add @ autocomplete functionality
- Added autocomplete state tracking in ChatViewModel
- Implemented updateAutocomplete() to parse @ mentions and show suggestions
- Added completeNickname() to handle nickname completion
- Created autocomplete UI overlay above input field
- Shows list of matching nicknames when typing @
- Highlights selected suggestion
- Clicking suggestion completes the mention
2025-07-03 01:08:11 +02:00
jack 4b98aa7918 Fix iOS background BLE, RSSI tracking, and peer nickname display
- Add UIBackgroundModes for bluetooth-central/peripheral to restore background messaging
- Implement RSSI tracking with proper peer ID mapping and UI updates
- Fix announce packet delivery for immediate nickname display
- Convert to binary protocol for 62-69% size reduction
- Fix peer count to exclude self from display
- Add platform-specific UI improvements (font sizes, dropdown styling)
2025-07-03 00:51:59 +02:00
jack 1eaba703e9 Fix peer dropdown layout and announcement timing
- Move peer dropdown next to bitchat title
- Add immediate peer announcement on connection
- Fix iOS menu chevron visibility with platform-specific styling
- Force UI updates for join/leave messages
- Add peers to active list immediately on connection
- Remove all announcement delays for instant name resolution
2025-07-02 21:39:31 +02:00
jack e50f14eeed Fix notification dot size and improve peer announcements
- Make notification dot smaller (5x5) for better appearance
- Remove all delays from announcement sending
- Send announcements immediately on connection
- Add debug logging for join/leave messages
- Ensure join/leave messages are properly displayed
2025-07-02 21:32:51 +02:00