feat: Enhance drawing functionality with sender tracking and sharing capabilities

This commit is contained in:
Janez T
2025-10-15 22:41:57 +02:00
parent 317addba9e
commit 800786ec9c
12 changed files with 618 additions and 107 deletions

View File

@@ -4,14 +4,17 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'connection_provider.dart';
import 'contacts_provider.dart';
import 'messages_provider.dart';
import 'drawing_provider.dart';
import '../services/tile_cache_service.dart';
import '../models/contact.dart';
import '../utils/drawing_message_parser.dart';
/// Main App Provider - coordinates all other providers
class AppProvider with ChangeNotifier {
final ConnectionProvider connectionProvider;
final ContactsProvider contactsProvider;
final MessagesProvider messagesProvider;
final DrawingProvider drawingProvider;
final TileCacheService tileCacheService;
bool _isInitialized = false;
@@ -21,6 +24,7 @@ class AppProvider with ChangeNotifier {
required this.connectionProvider,
required this.contactsProvider,
required this.messagesProvider,
required this.drawingProvider,
required this.tileCacheService,
}) {
_setupCallbacks();
@@ -61,6 +65,20 @@ class AppProvider with ChangeNotifier {
// When a message is received
connectionProvider.onMessageReceived = (message) {
// Check if message is a drawing broadcast
if (DrawingMessageParser.isDrawingMessage(message.text)) {
debugPrint('🎨 [AppProvider] Drawing message received, parsing...');
final drawing = DrawingMessageParser.parseDrawingMessage(message.text);
if (drawing != null) {
debugPrint('🎨 [AppProvider] Drawing parsed successfully: ${drawing.type.name} from ${drawing.senderName ?? "unknown"}');
drawingProvider.addReceivedDrawing(drawing);
} else {
debugPrint('⚠️ [AppProvider] Failed to parse drawing message');
}
// Don't add drawing messages to the message list
return;
}
// Pass contact lookup function to link channel messages with contacts
messagesProvider.addMessage(
message,

View File

@@ -1,8 +1,10 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:latlong2/latlong.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/map_drawing.dart';
import '../utils/drawing_message_parser.dart';
/// Drawing mode state
enum DrawingMode {
@@ -255,4 +257,23 @@ class DrawingProvider with ChangeNotifier {
}
return null;
}
/// Add received drawing from another node
void addReceivedDrawing(MapDrawing drawing) {
// Check if drawing with this ID already exists
if (_drawings.any((d) => d.id == drawing.id)) {
debugPrint('Drawing ${drawing.id} already exists, skipping');
return;
}
_drawings.add(drawing);
_saveDrawings();
notifyListeners();
}
/// Broadcast a drawing to contacts
/// Returns the formatted message string ready to send
String createDrawingBroadcastMessage(MapDrawing drawing, String senderName) {
return DrawingMessageParser.createDrawingMessage(drawing, senderName);
}
}