feat: Release version 3.1.4 - Mode terrain et génération PDF

 Nouvelles fonctionnalités:
- Ajout du mode terrain pour utilisation mobile hors connexion
- Génération automatique de reçus PDF avec template personnalisé
- Révision complète du système de cartes avec amélioration des performances

🔧 Améliorations techniques:
- Refactoring du module chat avec architecture simplifiée
- Optimisation du système de sécurité NIST SP 800-63B
- Amélioration de la gestion des secteurs géographiques
- Support UTF-8 étendu pour les noms d'utilisateurs

📱 Application mobile:
- Nouveau mode terrain dans user_field_mode_page
- Interface utilisateur adaptative pour conditions difficiles
- Synchronisation offline améliorée

🗺️ Cartographie:
- Optimisation des performances MapBox
- Meilleure gestion des tuiles hors ligne
- Amélioration de l'affichage des secteurs

📄 Documentation:
- Ajout guide Android (ANDROID-GUIDE.md)
- Documentation sécurité API (API-SECURITY.md)
- Guide module chat (CHAT_MODULE.md)

🐛 Corrections:
- Résolution des erreurs 400 lors de la création d'utilisateurs
- Correction de la validation des noms d'utilisateurs
- Fix des problèmes de synchronisation chat

🤖 Generated with Claude Code (https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-19 19:38:03 +02:00
parent 4f7247eb2d
commit 3443277d4a
185 changed files with 109354 additions and 102937 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1,64 +0,0 @@
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ConversationModelAdapter extends TypeAdapter<ConversationModel> {
@override
final int typeId = 20;
@override
ConversationModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ConversationModel(
id: fields[0] as String,
type: fields[1] as String,
title: fields[2] as String?,
createdAt: fields[3] as DateTime,
updatedAt: fields[4] as DateTime,
participants: (fields[5] as List).cast<ParticipantModel>(),
isSynced: fields[6] as bool,
replyPermission: fields[7] as String,
isPinned: fields[8] as bool,
expiryDate: fields[9] as DateTime?,
);
}
@override
void write(BinaryWriter writer, ConversationModel obj) {
writer
..writeByte(10)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.type)
..writeByte(2)
..write(obj.title)
..writeByte(3)
..write(obj.createdAt)
..writeByte(4)
..write(obj.updatedAt)
..writeByte(5)
..write(obj.participants)
..writeByte(6)
..write(obj.isSynced)
..writeByte(7)
..write(obj.replyPermission)
..writeByte(8)
..write(obj.isPinned)
..writeByte(9)
..write(obj.expiryDate);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ConversationModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -2,45 +2,48 @@
// TypeAdapterGenerator
// **************************************************************************
class AudienceTargetModelAdapter extends TypeAdapter<AudienceTargetModel> {
class MessageAdapter extends TypeAdapter<Message> {
@override
final int typeId = 24;
final int typeId = 51;
@override
AudienceTargetModel read(BinaryReader reader) {
Message read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return AudienceTargetModel(
return Message(
id: fields[0] as String,
conversationId: fields[1] as String,
targetType: fields[2] as String,
targetId: fields[3] as String?,
createdAt: fields[4] as DateTime,
roleFilter: fields[5] as String?,
entityFilter: fields[6] as String?,
roomId: fields[1] as String,
content: fields[2] as String,
senderId: fields[3] as int,
senderName: fields[4] as String,
sentAt: fields[5] as DateTime,
isMe: fields[6] as bool,
isRead: fields[7] as bool,
);
}
@override
void write(BinaryWriter writer, AudienceTargetModel obj) {
void write(BinaryWriter writer, Message obj) {
writer
..writeByte(7)
..writeByte(8)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.conversationId)
..write(obj.roomId)
..writeByte(2)
..write(obj.targetType)
..write(obj.content)
..writeByte(3)
..write(obj.targetId)
..write(obj.senderId)
..writeByte(4)
..write(obj.createdAt)
..write(obj.senderName)
..writeByte(5)
..write(obj.roleFilter)
..write(obj.sentAt)
..writeByte(6)
..write(obj.entityFilter);
..write(obj.isMe)
..writeByte(7)
..write(obj.isRead);
}
@override
@@ -49,7 +52,7 @@ class AudienceTargetModelAdapter extends TypeAdapter<AudienceTargetModel> {
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AudienceTargetModelAdapter &&
other is MessageAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,67 +0,0 @@
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class MessageModelAdapter extends TypeAdapter<MessageModel> {
@override
final int typeId = 21;
@override
MessageModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return MessageModel(
id: fields[0] as String,
conversationId: fields[1] as String,
senderId: fields[2] as String?,
senderType: fields[3] as String,
content: fields[4] as String,
contentType: fields[5] as String,
createdAt: fields[6] as DateTime,
deliveredAt: fields[7] as DateTime?,
readAt: fields[8] as DateTime?,
status: fields[9] as String,
isAnnouncement: fields[10] as bool,
);
}
@override
void write(BinaryWriter writer, MessageModel obj) {
writer
..writeByte(11)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.conversationId)
..writeByte(2)
..write(obj.senderId)
..writeByte(3)
..write(obj.senderType)
..writeByte(4)
..write(obj.content)
..writeByte(5)
..write(obj.contentType)
..writeByte(6)
..write(obj.createdAt)
..writeByte(7)
..write(obj.deliveredAt)
..writeByte(8)
..write(obj.readAt)
..writeByte(9)
..write(obj.status)
..writeByte(10)
..write(obj.isAnnouncement);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is MessageModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,64 +0,0 @@
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class NotificationSettingsAdapter extends TypeAdapter<NotificationSettings> {
@override
final int typeId = 25;
@override
NotificationSettings read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return NotificationSettings(
enableNotifications: fields[0] as bool,
soundEnabled: fields[1] as bool,
vibrationEnabled: fields[2] as bool,
mutedConversations: (fields[3] as List).cast<String>(),
showPreview: fields[4] as bool,
conversationNotifications: (fields[5] as Map).cast<String, bool>(),
doNotDisturb: fields[6] as bool,
doNotDisturbStart: fields[7] as DateTime?,
doNotDisturbEnd: fields[8] as DateTime?,
deviceToken: fields[9] as String?,
);
}
@override
void write(BinaryWriter writer, NotificationSettings obj) {
writer
..writeByte(10)
..writeByte(0)
..write(obj.enableNotifications)
..writeByte(1)
..write(obj.soundEnabled)
..writeByte(2)
..write(obj.vibrationEnabled)
..writeByte(3)
..write(obj.mutedConversations)
..writeByte(4)
..write(obj.showPreview)
..writeByte(5)
..write(obj.conversationNotifications)
..writeByte(6)
..write(obj.doNotDisturb)
..writeByte(7)
..write(obj.doNotDisturbStart)
..writeByte(8)
..write(obj.doNotDisturbEnd)
..writeByte(9)
..write(obj.deviceToken);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is NotificationSettingsAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -1,61 +0,0 @@
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ParticipantModelAdapter extends TypeAdapter<ParticipantModel> {
@override
final int typeId = 22;
@override
ParticipantModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ParticipantModel(
id: fields[0] as String,
conversationId: fields[1] as String,
userId: fields[2] as String?,
anonymousId: fields[3] as String?,
role: fields[4] as String,
joinedAt: fields[5] as DateTime,
lastReadMessageId: fields[6] as String?,
viaTarget: fields[7] as bool,
canReply: fields[8] as bool?,
);
}
@override
void write(BinaryWriter writer, ParticipantModel obj) {
writer
..writeByte(9)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.conversationId)
..writeByte(2)
..write(obj.userId)
..writeByte(3)
..write(obj.anonymousId)
..writeByte(4)
..write(obj.role)
..writeByte(5)
..write(obj.joinedAt)
..writeByte(6)
..write(obj.lastReadMessageId)
..writeByte(7)
..write(obj.viaTarget)
..writeByte(8)
..write(obj.canReply);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ParticipantModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -2,45 +2,45 @@
// TypeAdapterGenerator
// **************************************************************************
class AnonymousUserModelAdapter extends TypeAdapter<AnonymousUserModel> {
class RoomAdapter extends TypeAdapter<Room> {
@override
final int typeId = 23;
final int typeId = 50;
@override
AnonymousUserModel read(BinaryReader reader) {
Room read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return AnonymousUserModel(
return Room(
id: fields[0] as String,
deviceId: fields[1] as String,
name: fields[2] as String?,
email: fields[3] as String?,
createdAt: fields[4] as DateTime,
convertedToUserId: fields[5] as String?,
metadata: (fields[6] as Map?)?.cast<String, dynamic>(),
title: fields[1] as String,
type: fields[2] as String,
createdAt: fields[3] as DateTime,
lastMessage: fields[4] as String?,
lastMessageAt: fields[5] as DateTime?,
unreadCount: fields[6] as int,
);
}
@override
void write(BinaryWriter writer, AnonymousUserModel obj) {
void write(BinaryWriter writer, Room obj) {
writer
..writeByte(7)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.deviceId)
..write(obj.title)
..writeByte(2)
..write(obj.name)
..write(obj.type)
..writeByte(3)
..write(obj.email)
..writeByte(4)
..write(obj.createdAt)
..writeByte(4)
..write(obj.lastMessage)
..writeByte(5)
..write(obj.convertedToUserId)
..write(obj.lastMessageAt)
..writeByte(6)
..write(obj.metadata);
..write(obj.unreadCount);
}
@override
@@ -49,7 +49,7 @@ class AnonymousUserModelAdapter extends TypeAdapter<AnonymousUserModel> {
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is AnonymousUserModelAdapter &&
other is RoomAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@@ -10,6 +10,7 @@ import 'package:connectivity_plus/src/connectivity_plus_web.dart';
import 'package:geolocator_web/geolocator_web.dart';
import 'package:image_picker_for_web/image_picker_for_web.dart';
import 'package:package_info_plus/src/package_info_plus_web.dart';
import 'package:sensors_plus/src/sensors_plus_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:url_launcher_web/url_launcher_web.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
@@ -20,6 +21,7 @@ void registerPlugins([final Registrar? pluginRegistrar]) {
GeolocatorPlugin.registerWith(registrar);
ImagePickerPlugin.registerWith(registrar);
PackageInfoPlusWebPlugin.registerWith(registrar);
WebSensorsPlugin.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar);
UrlLauncherPlugin.registerWith(registrar);
registrar.registerMessageHandler();

View File

@@ -1,31 +0,0 @@
Extension Discovery Cache
=========================
This folder is used by `package:extension_discovery` to cache lists of
packages that contains extensions for other packages.
DO NOT USE THIS FOLDER
----------------------
* Do not read (or rely) the contents of this folder.
* Do write to this folder.
If you're interested in the lists of extensions stored in this folder use the
API offered by package `extension_discovery` to get this information.
If this package doesn't work for your use-case, then don't try to read the
contents of this folder. It may change, and will not remain stable.
Use package `extension_discovery`
---------------------------------
If you want to access information from this folder.
Feel free to delete this folder
-------------------------------
Files in this folder act as a cache, and the cache is discarded if the files
are older than the modification time of `.dart_tool/package_config.json`.
Hence, it should never be necessary to clear this cache manually, if you find a
need to do please file a bug.

View File

@@ -1 +0,0 @@
{"version":2,"entries":[{"package":"geosector_app","rootUri":"../","packageUri":"lib/"}]}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/dart_build_result.json:

View File

@@ -0,0 +1 @@
{"inputs":["/home/pierre/dev/flutter/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart","/home/pierre/dev/geosector/app/.dart_tool/package_config_subset"],"outputs":["/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/dart_build_result.json","/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/dart_build_result.json"]}

View File

@@ -0,0 +1 @@
{"dependencies":[],"code_assets":[]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"inputs":["/home/pierre/dev/geosector/app/.dart_tool/package_config_subset"],"outputs":["/home/pierre/dev/geosector/app/.dart_tool/flutter_build/dart_plugin_registrant.dart"]}

View File

@@ -0,0 +1 @@
{"inputs":[],"outputs":[]}

View File

@@ -0,0 +1 @@
/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/native_assets.json:

View File

@@ -0,0 +1 @@
{"inputs":["/home/pierre/dev/flutter/packages/flutter_tools/lib/src/build_system/targets/native_assets.dart","/home/pierre/dev/geosector/app/.dart_tool/package_config_subset"],"outputs":["/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/native_assets.json","/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/native_assets.json"]}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
{"format-version":[1,0,0],"native-assets":{}}

View File

@@ -0,0 +1 @@
["/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/vm_snapshot_data","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/isolate_snapshot_data","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/kernel_blob.bin","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/logo-geosector-512.png-autosave.kra","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/icon-geosector.svg","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/geosector_map_admin.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/logo_recu.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/logo-geosector-512.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/geosector-logo.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/images/logo-geosector-1024.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/animations/geo_main.json","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/lib/chat/chat_config.yaml","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/assets/fonts/Figtree-VariableFont_wght.ttf","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/packages/cupertino_icons/assets/CupertinoIcons.ttf","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/packages/flutter_map/lib/assets/flutter_map_logo.png","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/fonts/MaterialIcons-Regular.otf","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/shaders/ink_sparkle.frag","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/AssetManifest.json","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/AssetManifest.bin","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/FontManifest.json","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/NOTICES.Z","/home/pierre/dev/geosector/app/build/app/intermediates/flutter/debug/flutter_assets/NativeAssetsManifest.json"]

File diff suppressed because one or more lines are too long

View File

@@ -369,27 +369,27 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/html_
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/permissions_manager.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/web_settings.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/go_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/builder.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/configuration.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/delegate.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/information_provider.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/logging.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/match.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/custom_parameter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/error_screen.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/errors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/extensions.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/inherited_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/cupertino.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/custom_transition_page.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/material.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/path_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/route.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/route_data.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/state.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/go_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/builder.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/configuration.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/delegate.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/information_provider.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/logging.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/match.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/custom_parameter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/error_screen.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/errors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/extensions.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/inherited_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/cupertino.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/custom_transition_page.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/material.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/path_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/route.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/route_data.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/state.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/hive.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/src/adapters/big_int_adapter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/src/adapters/date_time_adapter.dart
@@ -502,11 +502,11 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/http_dat
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/media_type.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/scan.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.1.2/lib/image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/image_picker_for_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/image_resizer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/image_resizer_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/pkg_web_tweaks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.2.0/lib/image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/image_picker_for_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/image_resizer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/image_resizer_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/pkg_web_tweaks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/image_picker_platform_interface.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/src/method_channel/method_channel_image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/src/platform_interface/image_picker_platform.dart
@@ -737,6 +737,19 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projection
file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projections/utm.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projections/vandg.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/retry-3.1.2/lib/retry.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/sensors_plus.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/sensors_plus_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/web_sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/web_sensors_interop.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/sensors_plus_platform_interface.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/accelerometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/barometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/gyroscope_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/magnetometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/method_channel_sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/sensor_interval.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/user_accelerometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/shared_preferences.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/src/shared_preferences_async.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/src/shared_preferences_devtools_extension_data.dart
@@ -774,128 +787,128 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/charts.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/datetime_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/datetime_category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/logarithmic_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/multi_level_labels.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/numeric_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/plot_band.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/base.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/crosshair.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/trackball.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/zooming.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/cartesian_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/circular_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/annotation.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/callbacks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/chart_point.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/circular_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/circular_data_label_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/connector_line.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/core_legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/core_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/element_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/empty_points.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/funnel_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/interactive_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/layout_handler.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/pyramid_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/title.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/funnel_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/accumulation_distribution_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/atr_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/bollinger_bands_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/ema_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/macd_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/momentum_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/roc_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/rsi_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/sma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/stochastic_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/technical_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/tma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/wma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/behavior.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/selection.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/pyramid_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/box_and_whisker_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/bubble_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/candle_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/chart_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/doughnut_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/error_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/fast_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/funnel_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/hilo_open_close_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/hilo_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/histogram_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/pie_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/pyramid_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/radial_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/range_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/range_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/scatter_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/spline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_area100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_bar100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_column100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_line100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/step_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stepline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/waterfall_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/trendline/trendline.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/constants.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/renderer_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/typedef.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/zooming_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/core.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/calendar/calendar_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/calendar/hijri_date_time.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/localizations/global_localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/slider_controller.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/assistview_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/barcodes_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/calendar_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/chat_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/color_scheme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/datagrid_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/datapager_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/daterangepicker_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/gauges_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/maps_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/pdfviewer_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/range_selector_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/range_slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/spark_charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/theme_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/treemap_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/utils/shape_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/charts.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/datetime_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/datetime_category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/logarithmic_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/multi_level_labels.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/numeric_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/plot_band.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/base.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/crosshair.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/trackball.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/zooming.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/cartesian_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/circular_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/annotation.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/callbacks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/chart_point.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/circular_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/circular_data_label_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/connector_line.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/core_legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/core_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/element_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/empty_points.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/funnel_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/interactive_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/layout_handler.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/pyramid_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/title.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/funnel_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/accumulation_distribution_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/atr_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/bollinger_bands_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/ema_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/macd_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/momentum_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/roc_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/rsi_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/sma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/stochastic_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/technical_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/tma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/wma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/behavior.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/selection.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/pyramid_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/box_and_whisker_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/bubble_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/candle_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/chart_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/doughnut_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/error_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/fast_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/funnel_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/hilo_open_close_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/hilo_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/histogram_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/pie_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/pyramid_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/radial_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/range_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/range_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/scatter_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/spline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_area100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_bar100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_column100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_line100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/step_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stepline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/waterfall_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/trendline/trendline.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/constants.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/renderer_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/typedef.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/zooming_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/core.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/calendar/calendar_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/calendar/hijri_date_time.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/localizations/global_localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/slider_controller.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/assistview_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/barcodes_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/calendar_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/chat_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/color_scheme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/datagrid_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/datapager_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/daterangepicker_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/gauges_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/maps_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/pdfviewer_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/range_selector_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/range_slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/spark_charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/theme_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/treemap_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/utils/shape_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart
@@ -988,7 +1001,6 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_m
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector4.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math_64.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/helpers.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom/accelerometer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom/angle_instanced_arrays.dart
@@ -1183,6 +1195,22 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/parser.da
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/process.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/proj_wkt.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/wkt_parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/charcodes.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/equality.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/error_listener.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/loader.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/null_span.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/style.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/token.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_document.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_exception.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node_wrapper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/yaml.dart
file:///home/pierre/dev/flutter/bin/cache/dart-sdk/lib/libraries.json
file:///home/pierre/dev/flutter/bin/cache/flutter_web_sdk/kernel/dart2js_platform.dill
file:///home/pierre/dev/flutter/packages/flutter/lib/animation.dart
@@ -1852,21 +1880,18 @@ file:///home/pierre/dev/geosector/app/.dart_tool/flutter_build/d35d2e27406b267ee
file:///home/pierre/dev/geosector/app/.dart_tool/flutter_build/d35d2e27406b267ee35b6a1db0e24c05/web_plugin_registrant.dart
file:///home/pierre/dev/geosector/app/.dart_tool/package_config.json
file:///home/pierre/dev/geosector/app/lib/app.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/anonymous_user_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/anonymous_user_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/audience_target_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/audience_target_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/chat_adapters.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/conversation_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/conversation_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/notification_settings.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/notification_settings.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/participant_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/participant_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/chat_screen.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/conversations_list.dart
file:///home/pierre/dev/geosector/app/lib/chat/chat_module.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/room.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/room.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/chat_page.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/rooms_page.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/rooms_page_embedded.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_config_loader.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_info_service.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_service.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/recipient_selector.dart
file:///home/pierre/dev/geosector/app/lib/core/constants/app_keys.dart
file:///home/pierre/dev/geosector/app/lib/core/data/models/amicale_model.dart
file:///home/pierre/dev/geosector/app/lib/core/data/models/amicale_model.g.dart
@@ -1926,12 +1951,14 @@ file:///home/pierre/dev/geosector/app/lib/presentation/dialogs/sector_dialog.dar
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_communication_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_dashboard_home_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_dashboard_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_field_mode_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_history_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_map_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_statistics_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_form.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_row_widget.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_table_widget.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/badged_navigation_destination.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/activity_chart.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/charts.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/combined_chart.dart
@@ -1942,9 +1969,6 @@ file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/passage_ut
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_data.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_pie_chart.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_summary_card.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_input.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_messages.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_sidebar.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/connectivity_indicator.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/custom_button.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/custom_text_field.dart

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -369,27 +369,27 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/html_
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/permissions_manager.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/geolocator_web-4.1.3/lib/web_settings.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/go_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/builder.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/configuration.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/delegate.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/information_provider.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/logging.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/match.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/custom_parameter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/error_screen.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/errors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/extensions.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/misc/inherited_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/cupertino.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/custom_transition_page.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/pages/material.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/path_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/route.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/route_data.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/src/state.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/go_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/builder.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/configuration.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/delegate.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/information_provider.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/logging.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/match.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/custom_parameter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/error_screen.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/errors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/extensions.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/misc/inherited_router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/cupertino.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/custom_transition_page.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/pages/material.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/path_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/route.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/route_data.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/router.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/src/state.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/hive.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/src/adapters/big_int_adapter.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/hive-2.2.3/lib/src/adapters/date_time_adapter.dart
@@ -502,11 +502,11 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/http_dat
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/media_type.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/scan.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/http_parser-4.1.2/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.1.2/lib/image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/image_picker_for_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/image_resizer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/image_resizer_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/src/pkg_web_tweaks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.2.0/lib/image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/image_picker_for_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/image_resizer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/image_resizer_utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/src/pkg_web_tweaks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/image_picker_platform_interface.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/src/method_channel/method_channel_image_picker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/src/platform_interface/image_picker_platform.dart
@@ -737,6 +737,19 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projection
file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projections/utm.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/proj4dart-2.1.0/lib/src/projections/vandg.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/retry-3.1.2/lib/retry.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/sensors_plus.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/sensors_plus_web.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/web_sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/src/web_sensors_interop.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/sensors_plus_platform_interface.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/accelerometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/barometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/gyroscope_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/magnetometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/method_channel_sensors.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/sensor_interval.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/src/user_accelerometer_event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/shared_preferences.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/src/shared_preferences_async.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/lib/src/shared_preferences_devtools_extension_data.dart
@@ -774,128 +787,128 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/span_
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/string_scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/string_scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/charts.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/datetime_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/datetime_category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/logarithmic_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/multi_level_labels.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/numeric_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/axis/plot_band.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/base.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/crosshair.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/trackball.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/behaviors/zooming.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/cartesian_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/circular_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/annotation.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/callbacks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/chart_point.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/circular_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/circular_data_label_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/connector_line.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/core_legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/core_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/element_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/empty_points.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/funnel_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/interactive_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/layout_handler.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/pyramid_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/common/title.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/funnel_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/accumulation_distribution_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/atr_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/bollinger_bands_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/ema_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/macd_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/momentum_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/roc_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/rsi_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/sma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/stochastic_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/technical_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/tma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/indicators/wma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/behavior.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/selection.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/interactions/tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/pyramid_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/box_and_whisker_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/bubble_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/candle_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/chart_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/doughnut_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/error_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/fast_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/funnel_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/hilo_open_close_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/hilo_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/histogram_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/pie_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/pyramid_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/radial_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/range_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/range_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/scatter_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/spline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_area100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_bar100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_column100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_line100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stacked_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/step_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/stepline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/series/waterfall_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/trendline/trendline.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/constants.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/renderer_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/typedef.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/charts/utils/zooming_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/src/sparkline/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/core.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/calendar/calendar_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/calendar/hijri_date_time.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/localizations/global_localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/slider_controller.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/assistview_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/barcodes_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/calendar_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/chat_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/color_scheme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/datagrid_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/datapager_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/daterangepicker_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/gauges_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/maps_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/pdfviewer_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/range_selector_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/range_slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/spark_charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/theme_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/theme/treemap_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/src/utils/shape_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/charts.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/datetime_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/datetime_category_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/logarithmic_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/multi_level_labels.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/numeric_axis.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/axis/plot_band.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/base.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/crosshair.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/trackball.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/behaviors/zooming.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/cartesian_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/circular_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/annotation.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/callbacks.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/chart_point.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/circular_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/circular_data_label_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/connector_line.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/core_legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/core_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/element_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/empty_points.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/funnel_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/interactive_tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/layout_handler.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/legend.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/pyramid_data_label.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/common/title.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/funnel_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/accumulation_distribution_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/atr_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/bollinger_bands_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/ema_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/macd_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/momentum_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/roc_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/rsi_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/sma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/stochastic_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/technical_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/tma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/indicators/wma_indicator.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/behavior.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/selection.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/interactions/tooltip.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/pyramid_chart.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/box_and_whisker_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/bubble_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/candle_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/chart_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/doughnut_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/error_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/fast_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/funnel_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/hilo_open_close_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/hilo_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/histogram_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/pie_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/pyramid_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/radial_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/range_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/range_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/scatter_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/spline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_area100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_bar100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_bar_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_column100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_column_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_line100_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stacked_line_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/step_area_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/stepline_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/series/waterfall_series.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/trendline/trendline.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/constants.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/renderer_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/typedef.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/charts/utils/zooming_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/marker.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/utils/enum.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/src/sparkline/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/core.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/calendar/calendar_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/calendar/hijri_date_time.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/localizations/global_localizations.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/slider_controller.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/assistview_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/barcodes_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/calendar_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/chat_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/color_scheme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/datagrid_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/datapager_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/daterangepicker_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/gauges_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/maps_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/pdfviewer_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/range_selector_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/range_slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/slider_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/spark_charts_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/theme_widget.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/theme/treemap_theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/utils/helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/src/utils/shape_helper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/theme.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/ascii_glyph_set.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/glyph_set.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/lib/src/generated/top_level.dart
@@ -988,7 +1001,6 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_m
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/src/vector_math_64/vector4.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib/vector_math_64.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/helpers.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom/accelerometer.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/web-1.1.1/lib/src/dom/angle_instanced_arrays.dart
@@ -1183,6 +1195,22 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/parser.da
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/process.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/src/proj_wkt.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/wkt_parser-2.0.0/lib/wkt_parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/charcodes.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/equality.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/error_listener.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/event.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/loader.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/null_span.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/parser.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/scanner.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/style.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/token.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/utils.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_document.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_exception.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/src/yaml_node_wrapper.dart
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/lib/yaml.dart
file:///home/pierre/dev/flutter/bin/cache/flutter_web_sdk/kernel/dart2js_platform.dill
file:///home/pierre/dev/flutter/packages/flutter/lib/animation.dart
file:///home/pierre/dev/flutter/packages/flutter/lib/cupertino.dart
@@ -1851,21 +1879,18 @@ file:///home/pierre/dev/geosector/app/.dart_tool/flutter_build/d35d2e27406b267ee
file:///home/pierre/dev/geosector/app/.dart_tool/flutter_build/d35d2e27406b267ee35b6a1db0e24c05/main.dart
file:///home/pierre/dev/geosector/app/.dart_tool/flutter_build/d35d2e27406b267ee35b6a1db0e24c05/web_plugin_registrant.dart
file:///home/pierre/dev/geosector/app/lib/app.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/anonymous_user_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/anonymous_user_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/audience_target_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/audience_target_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/chat_adapters.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/conversation_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/conversation_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/notification_settings.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/notification_settings.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/participant_model.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/participant_model.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/chat_screen.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/conversations_list.dart
file:///home/pierre/dev/geosector/app/lib/chat/chat_module.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/message.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/room.dart
file:///home/pierre/dev/geosector/app/lib/chat/models/room.g.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/chat_page.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/rooms_page.dart
file:///home/pierre/dev/geosector/app/lib/chat/pages/rooms_page_embedded.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_config_loader.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_info_service.dart
file:///home/pierre/dev/geosector/app/lib/chat/services/chat_service.dart
file:///home/pierre/dev/geosector/app/lib/chat/widgets/recipient_selector.dart
file:///home/pierre/dev/geosector/app/lib/core/constants/app_keys.dart
file:///home/pierre/dev/geosector/app/lib/core/data/models/amicale_model.dart
file:///home/pierre/dev/geosector/app/lib/core/data/models/amicale_model.g.dart
@@ -1925,12 +1950,14 @@ file:///home/pierre/dev/geosector/app/lib/presentation/dialogs/sector_dialog.dar
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_communication_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_dashboard_home_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_dashboard_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_field_mode_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_history_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_map_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/user/user_statistics_page.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_form.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_row_widget.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/amicale_table_widget.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/badged_navigation_destination.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/activity_chart.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/charts.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/combined_chart.dart
@@ -1941,9 +1968,6 @@ file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/passage_ut
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_data.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_pie_chart.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/charts/payment_summary_card.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_input.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_messages.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/chat/chat_sidebar.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/connectivity_indicator.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/custom_button.dart
file:///home/pierre/dev/geosector/app/lib/presentation/widgets/custom_text_field.dart

View File

@@ -1 +1 @@
["/home/pierre/dev/geosector/app/build/web/*/index.html","/home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js","/home/pierre/dev/geosector/app/build/web/main.dart.js","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra","/home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png","/home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json","/home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf","/home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf","/home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png","/home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf","/home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json","/home/pierre/dev/geosector/app/build/web/assets/FontManifest.json","/home/pierre/dev/geosector/app/build/web/assets/NOTICES","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-152.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-180.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-167.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-512.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png","/home/pierre/dev/geosector/app/build/web/favicon-64.png","/home/pierre/dev/geosector/app/build/web/.DS_Store","/home/pierre/dev/geosector/app/build/web/favicon-32.png","/home/pierre/dev/geosector/app/build/web/favicon.png","/home/pierre/dev/geosector/app/build/web/favicon-16.png","/home/pierre/dev/geosector/app/build/web/manifest.json","/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js"]
["/home/pierre/dev/geosector/app/build/web/*/index.html","/home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js","/home/pierre/dev/geosector/app/build/web/main.dart.js","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra","/home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png","/home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json","/home/pierre/dev/geosector/app/build/web/assets/lib/chat/chat_config.yaml","/home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf","/home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf","/home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png","/home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf","/home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json","/home/pierre/dev/geosector/app/build/web/assets/FontManifest.json","/home/pierre/dev/geosector/app/build/web/assets/NOTICES","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-152.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-180.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-167.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-512.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png","/home/pierre/dev/geosector/app/build/web/favicon-64.png","/home/pierre/dev/geosector/app/build/web/.DS_Store","/home/pierre/dev/geosector/app/build/web/favicon-32.png","/home/pierre/dev/geosector/app/build/web/favicon.png","/home/pierre/dev/geosector/app/build/web/favicon-16.png","/home/pierre/dev/geosector/app/build/web/manifest.json","/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js"]

View File

@@ -1 +1 @@
/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js: /home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png /home/pierre/dev/geosector/app/build/web/icons/Icon-192.png /home/pierre/dev/geosector/app/build/web/icons/Icon-152.png /home/pierre/dev/geosector/app/build/web/icons/Icon-180.png /home/pierre/dev/geosector/app/build/web/icons/Icon-167.png /home/pierre/dev/geosector/app/build/web/icons/Icon-512.png /home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png /home/pierre/dev/geosector/app/build/web/flutter.js /home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js /home/pierre/dev/geosector/app/build/web/favicon-64.png /home/pierre/dev/geosector/app/build/web/index.html /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js /home/pierre/dev/geosector/app/build/web/favicon-32.png /home/pierre/dev/geosector/app/build/web/version.json /home/pierre/dev/geosector/app/build/web/favicon.png /home/pierre/dev/geosector/app/build/web/favicon-16.png /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin /home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf /home/pierre/dev/geosector/app/build/web/assets/FontManifest.json /home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png /home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra /home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg /home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png /home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf /home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json /home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag /home/pierre/dev/geosector/app/build/web/assets/NOTICES /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json /home/pierre/dev/geosector/app/build/web/main.dart.js /home/pierre/dev/geosector/app/build/web/manifest.json
/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js: /home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png /home/pierre/dev/geosector/app/build/web/icons/Icon-192.png /home/pierre/dev/geosector/app/build/web/icons/Icon-152.png /home/pierre/dev/geosector/app/build/web/icons/Icon-180.png /home/pierre/dev/geosector/app/build/web/icons/Icon-167.png /home/pierre/dev/geosector/app/build/web/icons/Icon-512.png /home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png /home/pierre/dev/geosector/app/build/web/flutter.js /home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js /home/pierre/dev/geosector/app/build/web/favicon-64.png /home/pierre/dev/geosector/app/build/web/index.html /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.wasm /home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js.symbols /home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js /home/pierre/dev/geosector/app/build/web/favicon-32.png /home/pierre/dev/geosector/app/build/web/version.json /home/pierre/dev/geosector/app/build/web/favicon.png /home/pierre/dev/geosector/app/build/web/favicon-16.png /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin /home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf /home/pierre/dev/geosector/app/build/web/assets/FontManifest.json /home/pierre/dev/geosector/app/build/web/assets/lib/chat/chat_config.yaml /home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png /home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra /home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg /home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png /home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png /home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf /home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json /home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag /home/pierre/dev/geosector/app/build/web/assets/NOTICES /home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json /home/pierre/dev/geosector/app/build/web/main.dart.js /home/pierre/dev/geosector/app/build/web/manifest.json

View File

@@ -10,6 +10,7 @@ import 'package:connectivity_plus/src/connectivity_plus_web.dart';
import 'package:geolocator_web/geolocator_web.dart';
import 'package:image_picker_for_web/image_picker_for_web.dart';
import 'package:package_info_plus/src/package_info_plus_web.dart';
import 'package:sensors_plus/src/sensors_plus_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart';
import 'package:url_launcher_web/url_launcher_web.dart';
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
@@ -20,6 +21,7 @@ void registerPlugins([final Registrar? pluginRegistrar]) {
GeolocatorPlugin.registerWith(registrar);
ImagePickerPlugin.registerWith(registrar);
PackageInfoPlusWebPlugin.registerWith(registrar);
WebSensorsPlugin.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar);
UrlLauncherPlugin.registerWith(registrar);
registrar.registerMessageHandler();

File diff suppressed because one or more lines are too long

View File

@@ -1 +1 @@
{"inputs":["/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-152.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-180.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-167.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-512.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png","/home/pierre/dev/geosector/app/build/web/flutter.js","/home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js","/home/pierre/dev/geosector/app/build/web/favicon-64.png","/home/pierre/dev/geosector/app/build/web/index.html","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js","/home/pierre/dev/geosector/app/build/web/favicon-32.png","/home/pierre/dev/geosector/app/build/web/version.json","/home/pierre/dev/geosector/app/build/web/favicon.png","/home/pierre/dev/geosector/app/build/web/favicon-16.png","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin","/home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf","/home/pierre/dev/geosector/app/build/web/assets/FontManifest.json","/home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png","/home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra","/home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png","/home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf","/home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json","/home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag","/home/pierre/dev/geosector/app/build/web/assets/NOTICES","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json","/home/pierre/dev/geosector/app/build/web/main.dart.js","/home/pierre/dev/geosector/app/build/web/manifest.json"],"outputs":["/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js"]}
{"inputs":["/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-192.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-152.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-180.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-167.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-512.png","/home/pierre/dev/geosector/app/build/web/icons/Icon-maskable-512.png","/home/pierre/dev/geosector/app/build/web/flutter.js","/home/pierre/dev/geosector/app/build/web/flutter_bootstrap.js","/home/pierre/dev/geosector/app/build/web/favicon-64.png","/home/pierre/dev/geosector/app/build/web/index.html","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/chromium/canvaskit.js","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.wasm","/home/pierre/dev/geosector/app/build/web/canvaskit/canvaskit.js","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js.symbols","/home/pierre/dev/geosector/app/build/web/canvaskit/skwasm.js","/home/pierre/dev/geosector/app/build/web/favicon-32.png","/home/pierre/dev/geosector/app/build/web/version.json","/home/pierre/dev/geosector/app/build/web/favicon.png","/home/pierre/dev/geosector/app/build/web/favicon-16.png","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.json","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin","/home/pierre/dev/geosector/app/build/web/assets/fonts/MaterialIcons-Regular.otf","/home/pierre/dev/geosector/app/build/web/assets/FontManifest.json","/home/pierre/dev/geosector/app/build/web/assets/lib/chat/chat_config.yaml","/home/pierre/dev/geosector/app/build/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png","/home/pierre/dev/geosector/app/build/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png-autosave.kra","/home/pierre/dev/geosector/app/build/web/assets/assets/images/icon-geosector.svg","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector_map_admin.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo_recu.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-512.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/geosector-logo.png","/home/pierre/dev/geosector/app/build/web/assets/assets/images/logo-geosector-1024.png","/home/pierre/dev/geosector/app/build/web/assets/assets/fonts/Figtree-VariableFont_wght.ttf","/home/pierre/dev/geosector/app/build/web/assets/assets/animations/geo_main.json","/home/pierre/dev/geosector/app/build/web/assets/shaders/ink_sparkle.frag","/home/pierre/dev/geosector/app/build/web/assets/NOTICES","/home/pierre/dev/geosector/app/build/web/assets/AssetManifest.bin.json","/home/pierre/dev/geosector/app/build/web/main.dart.js","/home/pierre/dev/geosector/app/build/web/manifest.json"],"outputs":["/home/pierre/dev/geosector/app/build/web/flutter_service_worker.js"]}

View File

@@ -0,0 +1,372 @@
//
// Generated file. Do not edit.
// This file is generated from template in file `flutter_tools/lib/src/flutter_plugins.dart`.
//
// @dart = 3.0
import 'dart:io'; // flutter_ignore: dart_io_import.
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:geolocator_android/geolocator_android.dart';
import 'package:image_picker_android/image_picker_android.dart';
import 'package:path_provider_android/path_provider_android.dart';
import 'package:shared_preferences_android/shared_preferences_android.dart';
import 'package:url_launcher_android/url_launcher_android.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:geolocator_apple/geolocator_apple.dart';
import 'package:image_picker_ios/image_picker_ios.dart';
import 'package:path_provider_foundation/path_provider_foundation.dart';
import 'package:shared_preferences_foundation/shared_preferences_foundation.dart';
import 'package:url_launcher_ios/url_launcher_ios.dart';
import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:file_selector_linux/file_selector_linux.dart';
import 'package:flutter_local_notifications_linux/flutter_local_notifications_linux.dart';
import 'package:geolocator_linux/geolocator_linux.dart';
import 'package:image_picker_linux/image_picker_linux.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path_provider_linux/path_provider_linux.dart';
import 'package:shared_preferences_linux/shared_preferences_linux.dart';
import 'package:url_launcher_linux/url_launcher_linux.dart';
import 'package:file_selector_macos/file_selector_macos.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:geolocator_apple/geolocator_apple.dart';
import 'package:image_picker_macos/image_picker_macos.dart';
import 'package:path_provider_foundation/path_provider_foundation.dart';
import 'package:shared_preferences_foundation/shared_preferences_foundation.dart';
import 'package:url_launcher_macos/url_launcher_macos.dart';
import 'package:file_selector_windows/file_selector_windows.dart';
import 'package:flutter_local_notifications_windows/flutter_local_notifications_windows.dart';
import 'package:image_picker_windows/image_picker_windows.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:path_provider_windows/path_provider_windows.dart';
import 'package:shared_preferences_windows/shared_preferences_windows.dart';
import 'package:url_launcher_windows/url_launcher_windows.dart';
@pragma('vm:entry-point')
class _PluginRegistrant {
@pragma('vm:entry-point')
static void register() {
if (Platform.isAndroid) {
try {
AndroidFlutterLocalNotificationsPlugin.registerWith();
} catch (err) {
print(
'`flutter_local_notifications` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
GeolocatorAndroid.registerWith();
} catch (err) {
print(
'`geolocator_android` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
ImagePickerAndroid.registerWith();
} catch (err) {
print(
'`image_picker_android` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PathProviderAndroid.registerWith();
} catch (err) {
print(
'`path_provider_android` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
SharedPreferencesAndroid.registerWith();
} catch (err) {
print(
'`shared_preferences_android` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
UrlLauncherAndroid.registerWith();
} catch (err) {
print(
'`url_launcher_android` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
} else if (Platform.isIOS) {
try {
IOSFlutterLocalNotificationsPlugin.registerWith();
} catch (err) {
print(
'`flutter_local_notifications` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
GeolocatorApple.registerWith();
} catch (err) {
print(
'`geolocator_apple` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
ImagePickerIOS.registerWith();
} catch (err) {
print(
'`image_picker_ios` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PathProviderFoundation.registerWith();
} catch (err) {
print(
'`path_provider_foundation` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
SharedPreferencesFoundation.registerWith();
} catch (err) {
print(
'`shared_preferences_foundation` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
UrlLauncherIOS.registerWith();
} catch (err) {
print(
'`url_launcher_ios` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
} else if (Platform.isLinux) {
try {
ConnectivityPlusLinuxPlugin.registerWith();
} catch (err) {
print(
'`connectivity_plus` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
FileSelectorLinux.registerWith();
} catch (err) {
print(
'`file_selector_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
LinuxFlutterLocalNotificationsPlugin.registerWith();
} catch (err) {
print(
'`flutter_local_notifications_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
GeolocatorLinux.registerWith();
} catch (err) {
print(
'`geolocator_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
ImagePickerLinux.registerWith();
} catch (err) {
print(
'`image_picker_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PackageInfoPlusLinuxPlugin.registerWith();
} catch (err) {
print(
'`package_info_plus` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PathProviderLinux.registerWith();
} catch (err) {
print(
'`path_provider_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
SharedPreferencesLinux.registerWith();
} catch (err) {
print(
'`shared_preferences_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
UrlLauncherLinux.registerWith();
} catch (err) {
print(
'`url_launcher_linux` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
} else if (Platform.isMacOS) {
try {
FileSelectorMacOS.registerWith();
} catch (err) {
print(
'`file_selector_macos` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
MacOSFlutterLocalNotificationsPlugin.registerWith();
} catch (err) {
print(
'`flutter_local_notifications` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
GeolocatorApple.registerWith();
} catch (err) {
print(
'`geolocator_apple` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
ImagePickerMacOS.registerWith();
} catch (err) {
print(
'`image_picker_macos` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PathProviderFoundation.registerWith();
} catch (err) {
print(
'`path_provider_foundation` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
SharedPreferencesFoundation.registerWith();
} catch (err) {
print(
'`shared_preferences_foundation` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
UrlLauncherMacOS.registerWith();
} catch (err) {
print(
'`url_launcher_macos` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
} else if (Platform.isWindows) {
try {
FileSelectorWindows.registerWith();
} catch (err) {
print(
'`file_selector_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
FlutterLocalNotificationsWindows.registerWith();
} catch (err) {
print(
'`flutter_local_notifications_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
ImagePickerWindows.registerWith();
} catch (err) {
print(
'`image_picker_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PackageInfoPlusWindowsPlugin.registerWith();
} catch (err) {
print(
'`package_info_plus` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
PathProviderWindows.registerWith();
} catch (err) {
print(
'`path_provider_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
SharedPreferencesWindows.registerWith();
} catch (err) {
print(
'`shared_preferences_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
try {
UrlLauncherWindows.registerWith();
} catch (err) {
print(
'`url_launcher_windows` threw an error: $err. '
'The app may not function as expected until you remove this plugin from pubspec.yaml'
);
}
}
}
}

View File

@@ -223,12 +223,6 @@
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "event_bus",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/event_bus-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.12"
},
{
"name": "fake_async",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/fake_async-1.3.3",
@@ -255,9 +249,9 @@
},
{
"name": "file_selector_macos",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+3",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+4",
"packageUri": "lib/",
"languageVersion": "3.6"
"languageVersion": "3.7"
},
{
"name": "file_selector_platform_interface",
@@ -351,9 +345,9 @@
},
{
"name": "flutter_svg",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.2.0",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.0.13",
"packageUri": "lib/",
"languageVersion": "3.6"
"languageVersion": "3.4"
},
{
"name": "flutter_test",
@@ -429,9 +423,9 @@
},
{
"name": "go_router",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0",
"packageUri": "lib/",
"languageVersion": "3.6"
"languageVersion": "3.7"
},
{
"name": "google_fonts",
@@ -513,39 +507,39 @@
},
{
"name": "image_picker",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.1.2",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.2.0",
"packageUri": "lib/",
"languageVersion": "3.3"
"languageVersion": "3.6"
},
{
"name": "image_picker_android",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.12+25",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.13",
"packageUri": "lib/",
"languageVersion": "3.6"
},
{
"name": "image_picker_for_web",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "3.6"
},
{
"name": "image_picker_ios",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.12+2",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "3.6"
},
{
"name": "image_picker_linux",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1+2",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.2",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "3.6"
},
{
"name": "image_picker_macos",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1+2",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.2",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "3.6"
},
{
"name": "image_picker_platform_interface",
@@ -555,9 +549,9 @@
},
{
"name": "image_picker_windows",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1+1",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.2",
"packageUri": "lib/",
"languageVersion": "2.19"
"languageVersion": "3.6"
},
{
"name": "intl",
@@ -667,12 +661,6 @@
"packageUri": "lib/",
"languageVersion": "3.2"
},
{
"name": "mqtt5_client",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/mqtt5_client-4.14.0",
"packageUri": "lib/",
"languageVersion": "3.8"
},
{
"name": "nm",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/nm-0.5.0",
@@ -723,9 +711,9 @@
},
{
"name": "path_provider_foundation",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.2",
"packageUri": "lib/",
"languageVersion": "3.3"
"languageVersion": "3.7"
},
{
"name": "path_provider_linux",
@@ -747,9 +735,9 @@
},
{
"name": "petitparser",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-6.1.0",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-7.0.1",
"packageUri": "lib/",
"languageVersion": "3.5"
"languageVersion": "3.8"
},
{
"name": "platform",
@@ -799,6 +787,18 @@
"packageUri": "lib/",
"languageVersion": "3.0"
},
{
"name": "sensors_plus",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2",
"packageUri": "lib/",
"languageVersion": "3.3"
},
{
"name": "sensors_plus_platform_interface",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1",
"packageUri": "lib/",
"languageVersion": "2.18"
},
{
"name": "shared_preferences",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3",
@@ -909,13 +909,13 @@
},
{
"name": "syncfusion_flutter_charts",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6",
"packageUri": "lib/",
"languageVersion": "3.7"
},
{
"name": "syncfusion_flutter_core",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6",
"packageUri": "lib/",
"languageVersion": "3.7"
},
@@ -987,9 +987,9 @@
},
{
"name": "url_launcher_ios",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.4",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "3.7"
},
{
"name": "url_launcher_linux",
@@ -999,9 +999,9 @@
},
{
"name": "url_launcher_macos",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.2",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.3",
"packageUri": "lib/",
"languageVersion": "3.3"
"languageVersion": "3.7"
},
{
"name": "url_launcher_platform_interface",
@@ -1035,15 +1035,15 @@
},
{
"name": "vector_graphics_codec",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.13",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.11+1",
"packageUri": "lib/",
"languageVersion": "3.4"
"languageVersion": "2.17"
},
{
"name": "vector_graphics_compiler",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.17",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.11+1",
"packageUri": "lib/",
"languageVersion": "3.6"
"languageVersion": "2.19"
},
{
"name": "vector_math",
@@ -1101,9 +1101,9 @@
},
{
"name": "xml",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.5.0",
"rootUri": "file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.6.1",
"packageUri": "lib/",
"languageVersion": "3.2"
"languageVersion": "3.8"
},
{
"name": "yaml",

View File

@@ -142,10 +142,6 @@ equatable
2.12
file:///home/pierre/.pub-cache/hosted/pub.dev/equatable-2.0.7/
file:///home/pierre/.pub-cache/hosted/pub.dev/equatable-2.0.7/lib/
event_bus
2.12
file:///home/pierre/.pub-cache/hosted/pub.dev/event_bus-2.0.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/event_bus-2.0.1/lib/
fake_async
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/fake_async-1.3.3/
@@ -163,9 +159,9 @@ file_selector_linux
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.3+2/
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_linux-0.9.3+2/lib/
file_selector_macos
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+3/
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+3/lib/
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+4/
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_macos-0.9.4+4/lib/
file_selector_platform_interface
3.0
file:///home/pierre/.pub-cache/hosted/pub.dev/file_selector_platform_interface-2.6.2/
@@ -219,9 +215,9 @@ flutter_plugin_android_lifecycle
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.29/
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_plugin_android_lifecycle-2.0.29/lib/
flutter_svg
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.2.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.2.0/lib/
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.0.13/
file:///home/pierre/.pub-cache/hosted/pub.dev/flutter_svg-2.0.13/lib/
frontend_server_client
3.0
file:///home/pierre/.pub-cache/hosted/pub.dev/frontend_server_client-4.0.0/
@@ -263,9 +259,9 @@ glob
file:///home/pierre/.pub-cache/hosted/pub.dev/glob-2.1.3/
file:///home/pierre/.pub-cache/hosted/pub.dev/glob-2.1.3/lib/
go_router
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.1.0/lib/
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/go_router-16.2.0/lib/
google_fonts
2.14
file:///home/pierre/.pub-cache/hosted/pub.dev/google_fonts-6.3.0/
@@ -319,37 +315,37 @@ image
file:///home/pierre/.pub-cache/hosted/pub.dev/image-4.5.4/
file:///home/pierre/.pub-cache/hosted/pub.dev/image-4.5.4/lib/
image_picker
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.1.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.1.2/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.2.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker-1.2.0/lib/
image_picker_android
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.12+25/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.12+25/lib/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.13/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_android-0.8.13/lib/
image_picker_for_web
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.0.6/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_for_web-3.1.0/lib/
image_picker_ios
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.12+2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.12+2/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_ios-0.8.13/lib/
image_picker_linux
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1+2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.1+2/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_linux-0.2.2/lib/
image_picker_macos
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1+2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.1+2/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_macos-0.2.2/lib/
image_picker_platform_interface
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_platform_interface-2.11.0/lib/
image_picker_windows
2.19
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1+1/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.1+1/lib/
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/image_picker_windows-0.2.2/lib/
intl
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/intl-0.20.2/
@@ -422,10 +418,6 @@ mime
3.2
file:///home/pierre/.pub-cache/hosted/pub.dev/mime-2.0.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/mime-2.0.0/lib/
mqtt5_client
3.8
file:///home/pierre/.pub-cache/hosted/pub.dev/mqtt5_client-4.14.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/mqtt5_client-4.14.0/lib/
nm
2.12
file:///home/pierre/.pub-cache/hosted/pub.dev/nm-0.5.0/
@@ -459,9 +451,9 @@ path_provider_android
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_android-2.2.17/
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_android-2.2.17/lib/
path_provider_foundation
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.1/lib/
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.2/lib/
path_provider_linux
2.19
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/
@@ -475,9 +467,9 @@ path_provider_windows
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/lib/
petitparser
3.5
file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-6.1.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-6.1.0/lib/
3.8
file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-7.0.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/petitparser-7.0.1/lib/
platform
3.2
file:///home/pierre/.pub-cache/hosted/pub.dev/platform-3.1.6/
@@ -510,6 +502,14 @@ retry
3.0
file:///home/pierre/.pub-cache/hosted/pub.dev/retry-3.1.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/retry-3.1.2/lib/
sensors_plus
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus-6.1.2/lib/
sensors_plus_platform_interface
2.18
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/sensors_plus_platform_interface-2.0.1/lib/
shared_preferences
3.5
file:///home/pierre/.pub-cache/hosted/pub.dev/shared_preferences-2.5.3/
@@ -580,12 +580,12 @@ file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/
syncfusion_flutter_charts
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.5/lib/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_charts-30.2.6/lib/
syncfusion_flutter_core
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.5/lib/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/
file:///home/pierre/.pub-cache/hosted/pub.dev/syncfusion_flutter_core-30.2.6/lib/
synchronized
3.8
file:///home/pierre/.pub-cache/hosted/pub.dev/synchronized-3.4.0/
@@ -631,17 +631,17 @@ url_launcher_android
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.17/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.17/lib/
url_launcher_ios
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.3/lib/
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.4/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.4/lib/
url_launcher_linux
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.1/lib/
url_launcher_macos
3.3
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.2/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.2/lib/
3.7
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.3/
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.3/lib/
url_launcher_platform_interface
3.1
file:///home/pierre/.pub-cache/hosted/pub.dev/url_launcher_platform_interface-2.3.2/
@@ -663,13 +663,13 @@ vector_graphics
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics-1.1.19/
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics-1.1.19/lib/
vector_graphics_codec
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.13/
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.13/lib/
2.17
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.11+1/
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_codec-1.1.11+1/lib/
vector_graphics_compiler
3.6
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.17/
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.17/lib/
2.19
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.11+1/
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_graphics_compiler-1.1.11+1/lib/
vector_math
2.14
file:///home/pierre/.pub-cache/hosted/pub.dev/vector_math-2.1.4/
@@ -707,9 +707,9 @@ xdg_directories
file:///home/pierre/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/xdg_directories-1.1.0/lib/
xml
3.2
file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.5.0/
file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.5.0/lib/
3.8
file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.6.1/
file:///home/pierre/.pub-cache/hosted/pub.dev/xml-6.6.1/lib/
yaml
3.4
file:///home/pierre/.pub-cache/hosted/pub.dev/yaml-3.1.3/

View File

@@ -5,7 +5,7 @@
"packages": [
{
"name": "geosector_app",
"version": "3.0.8+308",
"version": "3.1.4+314",
"dependencies": [
"connectivity_plus",
"cupertino_icons",
@@ -26,15 +26,16 @@
"image_picker",
"intl",
"latlong2",
"mqtt5_client",
"package_info_plus",
"path_provider",
"retry",
"sensors_plus",
"shared_preferences",
"syncfusion_flutter_charts",
"universal_html",
"url_launcher",
"uuid"
"uuid",
"yaml"
],
"devDependencies": [
"build_runner",
@@ -104,17 +105,12 @@
]
},
{
"name": "image_picker",
"version": "1.1.2",
"name": "sensors_plus",
"version": "6.1.2",
"dependencies": [
"flutter",
"image_picker_android",
"image_picker_for_web",
"image_picker_ios",
"image_picker_linux",
"image_picker_macos",
"image_picker_platform_interface",
"image_picker_windows"
"flutter_web_plugins",
"sensors_plus_platform_interface"
]
},
{
@@ -390,6 +386,28 @@
"meta"
]
},
{
"name": "sensors_plus_platform_interface",
"version": "2.0.1",
"dependencies": [
"flutter",
"logging",
"meta",
"plugin_platform_interface"
]
},
{
"name": "flutter_web_plugins",
"version": "0.0.0",
"dependencies": [
"characters",
"collection",
"flutter",
"material_color_utilities",
"meta",
"vector_math"
]
},
{
"name": "universal_io",
"version": "2.2.2",
@@ -411,6 +429,14 @@
"package_info_plus"
]
},
{
"name": "geoclue",
"version": "0.1.1",
"dependencies": [
"dbus",
"meta"
]
},
{
"name": "equatable",
"version": "2.0.7",
@@ -425,11 +451,94 @@
"dependencies": []
},
{
"name": "geoclue",
"version": "0.1.1",
"name": "yaml",
"version": "3.1.3",
"dependencies": [
"dbus",
"meta"
"collection",
"source_span",
"string_scanner"
]
},
{
"name": "image_picker",
"version": "1.2.0",
"dependencies": [
"flutter",
"image_picker_android",
"image_picker_for_web",
"image_picker_ios",
"image_picker_linux",
"image_picker_macos",
"image_picker_platform_interface",
"image_picker_windows"
]
},
{
"name": "image_picker_windows",
"version": "0.2.2",
"dependencies": [
"file_selector_platform_interface",
"file_selector_windows",
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "image_picker_platform_interface",
"version": "2.11.0",
"dependencies": [
"cross_file",
"flutter",
"http",
"plugin_platform_interface"
]
},
{
"name": "image_picker_macos",
"version": "0.2.2",
"dependencies": [
"file_selector_macos",
"file_selector_platform_interface",
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "image_picker_linux",
"version": "0.2.2",
"dependencies": [
"file_selector_linux",
"file_selector_platform_interface",
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "image_picker_ios",
"version": "0.8.13",
"dependencies": [
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "image_picker_for_web",
"version": "3.1.0",
"dependencies": [
"flutter",
"flutter_web_plugins",
"image_picker_platform_interface",
"mime",
"web"
]
},
{
"name": "image_picker_android",
"version": "0.8.13",
"dependencies": [
"flutter",
"flutter_plugin_android_lifecycle",
"image_picker_platform_interface"
]
},
{
@@ -441,6 +550,11 @@
"synchronized"
]
},
{
"name": "sprintf",
"version": "7.0.0",
"dependencies": []
},
{
"name": "flutter_map_cache",
"version": "2.0.0+1",
@@ -465,6 +579,16 @@
"url_launcher_windows"
]
},
{
"name": "uuid",
"version": "4.5.1",
"dependencies": [
"crypto",
"fixnum",
"meta",
"sprintf"
]
},
{
"name": "package_info_plus",
"version": "8.3.1",
@@ -490,43 +614,11 @@
"plugin_platform_interface"
]
},
{
"name": "flutter_web_plugins",
"version": "0.0.0",
"dependencies": [
"characters",
"collection",
"flutter",
"material_color_utilities",
"meta",
"vector_math"
]
},
{
"name": "go_router",
"version": "16.1.0",
"dependencies": [
"collection",
"flutter",
"flutter_web_plugins",
"logging",
"meta"
]
},
{
"name": "cupertino_icons",
"version": "1.0.8",
"dependencies": []
},
{
"name": "yaml",
"version": "3.1.3",
"dependencies": [
"collection",
"source_span",
"string_scanner"
]
},
{
"name": "cli_util",
"version": "0.4.2",
@@ -545,15 +637,17 @@
]
},
{
"name": "image_picker_windows",
"version": "0.2.1+1",
"name": "plugin_platform_interface",
"version": "2.1.8",
"dependencies": [
"file_selector_platform_interface",
"file_selector_windows",
"flutter",
"image_picker_platform_interface"
"meta"
]
},
{
"name": "logging",
"version": "1.3.0",
"dependencies": []
},
{
"name": "typed_data",
"version": "1.4.0",
@@ -570,21 +664,6 @@
"uuid"
]
},
{
"name": "uuid",
"version": "4.5.1",
"dependencies": [
"crypto",
"fixnum",
"meta",
"sprintf"
]
},
{
"name": "sprintf",
"version": "7.0.0",
"dependencies": []
},
{
"name": "fixnum",
"version": "1.1.1",
@@ -680,24 +759,6 @@
"meta"
]
},
{
"name": "syncfusion_flutter_charts",
"version": "30.2.5",
"dependencies": [
"flutter",
"intl",
"syncfusion_flutter_core",
"vector_math"
]
},
{
"name": "syncfusion_flutter_core",
"version": "30.2.5",
"dependencies": [
"flutter",
"vector_math"
]
},
{
"name": "connectivity_plus",
"version": "6.1.5",
@@ -728,46 +789,20 @@
]
},
{
"name": "args",
"version": "2.7.0",
"dependencies": []
},
{
"name": "image_picker_platform_interface",
"version": "2.11.0",
"name": "go_router",
"version": "16.2.0",
"dependencies": [
"cross_file",
"collection",
"flutter",
"http",
"plugin_platform_interface"
]
},
{
"name": "plugin_platform_interface",
"version": "2.1.8",
"dependencies": [
"flutter_web_plugins",
"logging",
"meta"
]
},
{
"name": "image_picker_macos",
"version": "0.2.1+2",
"dependencies": [
"file_selector_macos",
"file_selector_platform_interface",
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "image_picker_linux",
"version": "0.2.1+2",
"dependencies": [
"file_selector_linux",
"file_selector_platform_interface",
"flutter",
"image_picker_platform_interface"
]
"name": "args",
"version": "2.7.0",
"dependencies": []
},
{
"name": "csslib",
@@ -794,14 +829,6 @@
"web"
]
},
{
"name": "url_launcher_platform_interface",
"version": "2.3.2",
"dependencies": [
"flutter",
"plugin_platform_interface"
]
},
{
"name": "web",
"version": "1.1.1",
@@ -817,6 +844,14 @@
"web"
]
},
{
"name": "url_launcher_platform_interface",
"version": "2.3.2",
"dependencies": [
"flutter",
"plugin_platform_interface"
]
},
{
"name": "path_provider_windows",
"version": "2.3.0",
@@ -837,11 +872,21 @@
]
},
{
"name": "path_provider_foundation",
"version": "2.4.1",
"name": "syncfusion_flutter_charts",
"version": "30.2.6",
"dependencies": [
"flutter",
"path_provider_platform_interface"
"intl",
"syncfusion_flutter_core",
"vector_math"
]
},
{
"name": "syncfusion_flutter_core",
"version": "30.2.6",
"dependencies": [
"flutter",
"vector_math"
]
},
{
@@ -897,6 +942,11 @@
"xml"
]
},
{
"name": "mime",
"version": "2.0.0",
"dependencies": []
},
{
"name": "dio_cache_interceptor",
"version": "4.0.3",
@@ -906,19 +956,19 @@
]
},
{
"name": "url_launcher_macos",
"version": "3.2.2",
"name": "url_launcher_linux",
"version": "3.2.1",
"dependencies": [
"flutter",
"url_launcher_platform_interface"
]
},
{
"name": "url_launcher_linux",
"version": "3.2.1",
"name": "path_provider_foundation",
"version": "2.4.2",
"dependencies": [
"flutter",
"url_launcher_platform_interface"
"path_provider_platform_interface"
]
},
{
@@ -937,6 +987,14 @@
"url_launcher_platform_interface"
]
},
{
"name": "url_launcher_macos",
"version": "3.2.3",
"dependencies": [
"flutter",
"url_launcher_platform_interface"
]
},
{
"name": "flutter_local_notifications",
"version": "19.4.0",
@@ -980,15 +1038,6 @@
"xdg_directories"
]
},
{
"name": "xml",
"version": "6.5.0",
"dependencies": [
"collection",
"meta",
"petitparser"
]
},
{
"name": "timezone",
"version": "0.10.1",
@@ -1002,14 +1051,59 @@
"version": "2.1.4",
"dependencies": []
},
{
"name": "xml",
"version": "6.6.1",
"dependencies": [
"collection",
"meta",
"petitparser"
]
},
{
"name": "petitparser",
"version": "6.1.0",
"version": "7.0.1",
"dependencies": [
"collection",
"meta"
]
},
{
"name": "flutter_svg",
"version": "2.0.13",
"dependencies": [
"flutter",
"http",
"vector_graphics",
"vector_graphics_codec",
"vector_graphics_compiler"
]
},
{
"name": "vector_graphics_compiler",
"version": "1.1.11+1",
"dependencies": [
"args",
"meta",
"path",
"path_parsing",
"vector_graphics_codec",
"xml"
]
},
{
"name": "vector_graphics_codec",
"version": "1.1.11+1",
"dependencies": []
},
{
"name": "path_parsing",
"version": "1.1.0",
"dependencies": [
"meta",
"vector_math"
]
},
{
"name": "geolocator_apple",
"version": "2.3.13",
@@ -1018,22 +1112,6 @@
"geolocator_platform_interface"
]
},
{
"name": "url_launcher_ios",
"version": "6.3.3",
"dependencies": [
"flutter",
"url_launcher_platform_interface"
]
},
{
"name": "xdg_directories",
"version": "1.1.0",
"dependencies": [
"meta",
"path"
]
},
{
"name": "file_selector_linux",
"version": "0.9.3+2",
@@ -1063,6 +1141,14 @@
"typed_data"
]
},
{
"name": "xdg_directories",
"version": "1.1.0",
"dependencies": [
"meta",
"path"
]
},
{
"name": "crypto",
"version": "3.0.6",
@@ -1071,9 +1157,12 @@
]
},
{
"name": "logging",
"version": "1.3.0",
"dependencies": []
"name": "url_launcher_ios",
"version": "6.3.4",
"dependencies": [
"flutter",
"url_launcher_platform_interface"
]
},
{
"name": "shared_preferences",
@@ -1166,45 +1255,25 @@
]
},
{
"name": "image_picker_for_web",
"version": "3.0.6",
"name": "source_helper",
"version": "1.3.5",
"dependencies": [
"flutter",
"flutter_web_plugins",
"image_picker_platform_interface",
"mime",
"web"
"analyzer",
"collection",
"source_gen"
]
},
{
"name": "mime",
"version": "2.0.0",
"dependencies": []
},
{
"name": "mqtt5_client",
"version": "4.14.0",
"name": "glob",
"version": "2.1.3",
"dependencies": [
"characters",
"crypto",
"event_bus",
"meta",
"async",
"collection",
"file",
"path",
"typed_data",
"universal_html",
"web"
"string_scanner"
]
},
{
"name": "event_bus",
"version": "2.0.1",
"dependencies": []
},
{
"name": "platform",
"version": "3.1.6",
"dependencies": []
},
{
"name": "file",
"version": "7.0.1",
@@ -1214,31 +1283,17 @@
]
},
{
"name": "url_launcher_web",
"version": "2.4.1",
"name": "platform",
"version": "3.1.6",
"dependencies": []
},
{
"name": "vector_graphics",
"version": "1.1.19",
"dependencies": [
"flutter",
"flutter_web_plugins",
"url_launcher_platform_interface",
"web"
]
},
{
"name": "file_selector_macos",
"version": "0.9.4+3",
"dependencies": [
"cross_file",
"file_selector_platform_interface",
"flutter"
]
},
{
"name": "source_helper",
"version": "1.3.5",
"dependencies": [
"analyzer",
"collection",
"source_gen"
"http",
"vector_graphics_codec"
]
},
{
@@ -1256,14 +1311,22 @@
]
},
{
"name": "glob",
"version": "2.1.3",
"name": "url_launcher_web",
"version": "2.4.1",
"dependencies": [
"async",
"collection",
"file",
"path",
"string_scanner"
"flutter",
"flutter_web_plugins",
"url_launcher_platform_interface",
"web"
]
},
{
"name": "file_selector_macos",
"version": "0.9.4+4",
"dependencies": [
"cross_file",
"file_selector_platform_interface",
"flutter"
]
},
{
@@ -1273,51 +1336,6 @@
"meta"
]
},
{
"name": "flutter_svg",
"version": "2.2.0",
"dependencies": [
"flutter",
"http",
"vector_graphics",
"vector_graphics_codec",
"vector_graphics_compiler"
]
},
{
"name": "vector_graphics_codec",
"version": "1.1.13",
"dependencies": []
},
{
"name": "vector_graphics_compiler",
"version": "1.1.17",
"dependencies": [
"args",
"meta",
"path",
"path_parsing",
"vector_graphics_codec",
"xml"
]
},
{
"name": "path_parsing",
"version": "1.1.0",
"dependencies": [
"meta",
"vector_math"
]
},
{
"name": "vector_graphics",
"version": "1.1.19",
"dependencies": [
"flutter",
"http",
"vector_graphics_codec"
]
},
{
"name": "path_provider_android",
"version": "2.2.17",
@@ -1713,21 +1731,6 @@
"stream_channel"
]
},
{
"name": "image_picker_ios",
"version": "0.8.12+2",
"dependencies": [
"flutter",
"image_picker_platform_interface"
]
},
{
"name": "win32",
"version": "5.14.0",
"dependencies": [
"ffi"
]
},
{
"name": "file_selector_windows",
"version": "0.9.3+4",
@@ -1745,6 +1748,13 @@
"web"
]
},
{
"name": "win32",
"version": "5.14.0",
"dependencies": [
"ffi"
]
},
{
"name": "url_launcher_android",
"version": "6.3.17",
@@ -1753,15 +1763,6 @@
"url_launcher_platform_interface"
]
},
{
"name": "image_picker_android",
"version": "0.8.12+25",
"dependencies": [
"flutter",
"flutter_plugin_android_lifecycle",
"image_picker_platform_interface"
]
},
{
"name": "flutter_plugin_android_lifecycle",
"version": "2.0.29",

File diff suppressed because one or more lines are too long

339
app/ANDROID-GUIDE.md Normal file
View File

@@ -0,0 +1,339 @@
# 📱 Guide de Développement Android pour GeoSector
## 🚀 Configuration initiale
### Prérequis sur Debian/Ubuntu
```bash
# Installer les outils Android de base
sudo apt update
sudo apt install adb fastboot android-tools-adb android-tools-fastboot
# Pour le support MTP (transfert de fichiers)
sudo apt install mtp-tools jmtpfs gvfs-backends
# Vérifier l'installation
adb --version
```
### Configuration du téléphone Android
1. **Activer le mode développeur** :
- Aller dans `Paramètres > À propos du téléphone`
- Taper 7 fois sur `Numéro de build`
2. **Activer le débogage USB** :
- Aller dans `Paramètres > Options pour développeurs`
- Activer `Débogage USB`
- Activer `Installation via USB` (si disponible)
3. **Connexion USB** :
- Brancher le téléphone
- Autoriser le débogage sur le téléphone (popup)
- Choisir "Toujours autoriser depuis cet ordinateur"
## 🔍 Commandes ADB essentielles
### Vérification de la connexion
```bash
# Lister les devices connectés
adb devices
# Voir les infos détaillées du device
adb shell getprop | grep -E "model|version|manufacturer"
# Vérifier si le device est en USB
lsusb | grep -i samsung
```
### Installation et gestion des APK
```bash
# Installer un APK
adb install app-release.apk
# Installer en écrasant la version existante
adb install -r app-release.apk
# Installer un APK debug (avec permission de debug)
adb install -t app-debug.apk
# Désinstaller une application
adb uninstall fr.geosector.app2025
# Lister les packages installés
adb shell pm list packages | grep geosector
# Voir le chemin d'installation d'une app
adb shell pm path fr.geosector.app2025
```
## 📊 Logs et débogage en temps réel
### Voir TOUS les logs du téléphone
```bash
# Logs en temps réel (CTRL+C pour arrêter)
adb logcat
# Logs avec filtre sur votre app uniquement
adb logcat | grep -i geosector
# Logs Flutter uniquement (très utile !)
adb logcat | grep -E "flutter|dart"
```
### Logs Flutter spécifiques (RECOMMANDÉ)
```bash
# Méthode 1: Via Flutter directement (le plus pratique)
flutter logs
# Méthode 2: Filtrer par tag Flutter
adb logcat -s flutter
# Méthode 3: Logs avec niveau de verbosité
adb logcat "*:E" # Erreurs uniquement
adb logcat "*:W" # Warnings et erreurs
adb logcat "*:I" # Info, warnings et erreurs
```
### Logs avec timestamps et couleurs
```bash
# Avec timestamp
adb logcat -v time | grep -i geosector
# Format détaillé avec PID
adb logcat -v threadtime | grep -i geosector
# Sauvegarder les logs dans un fichier
adb logcat -d > logs_android.txt
```
### Nettoyer les logs
```bash
# Effacer le buffer de logs
adb logcat -c
# Puis relancer pour voir uniquement les nouveaux logs
adb logcat | grep -i geosector
```
## 🐛 Débogage avancé
### Lancer l'application depuis ADB
```bash
# Démarrer l'application
adb shell monkey -p fr.geosector.app2025 -c android.intent.category.LAUNCHER 1
# Ou avec am (Activity Manager)
adb shell am start -n fr.geosector.app2025/.MainActivity
# Forcer l'arrêt de l'application
adb shell am force-stop fr.geosector.app2025
```
### Capturer des screenshots
```bash
# Prendre une capture d'écran
adb shell screencap /sdcard/screenshot.png
adb pull /sdcard/screenshot.png ./screenshot.png
# Enregistrer une vidéo (appuyer CTRL+C pour arrêter)
adb shell screenrecord /sdcard/demo.mp4
adb pull /sdcard/demo.mp4 ./demo.mp4
```
### Informations système
```bash
# Voir l'utilisation mémoire
adb shell dumpsys meminfo fr.geosector.app2025
# Voir les permissions de l'app
adb shell dumpsys package fr.geosector.app2025 | grep permission
# Version d'Android
adb shell getprop ro.build.version.release
# Taille de l'écran
adb shell wm size
# Densité de l'écran
adb shell wm density
```
## 🔥 Hot Reload avec Flutter
### Développement en temps réel
```bash
# Lancer l'app en mode debug avec hot reload
flutter run
# Une fois lancé, utiliser ces commandes :
# r - Hot reload (rechargement rapide)
# R - Hot restart (redémarrage complet)
# h - Afficher l'aide
# q - Quitter
# p - Afficher/masquer la grille de construction
# o - Basculer iOS/Android
```
### Lancer sur un device spécifique
```bash
# Lister les devices disponibles
flutter devices
# Lancer sur un device spécifique
flutter run -d R3CY409BQBZ # Remplacer par votre device ID
# Lancer en mode release pour tester les performances
flutter run --release
```
## 🏗️ Build et compilation
### Générer les APK
```bash
# APK debug (non signé, pour tests)
flutter build apk --debug
# APK release (signé, optimisé)
flutter build apk --release
# APK séparés par architecture (plus petits)
flutter build apk --split-per-abi
# App Bundle pour Google Play Store
flutter build appbundle --release
```
### Analyser la taille de l'APK
```bash
# Voir la taille détaillée de l'APK
flutter build apk --analyze-size
# Utiliser l'outil APK Analyzer d'Android
java -jar ~/Android/Sdk/tools/bin/apkanalyzer.jar apk summary app-release.apk
```
## 🔧 Résolution de problèmes courants
### Device non détecté
```bash
# Redémarrer le serveur ADB
adb kill-server
adb start-server
adb devices
# Vérifier les règles udev (Linux)
ls -la /etc/udev/rules.d/ | grep android
# Ajouter les permissions utilisateur
sudo usermod -aG plugdev $USER
# Puis se déconnecter/reconnecter
```
### Permissions Android
```bash
# Accorder une permission manuellement
adb shell pm grant fr.geosector.app2025 android.permission.ACCESS_FINE_LOCATION
# Révoquer une permission
adb shell pm revoke fr.geosector.app2025 android.permission.ACCESS_FINE_LOCATION
# Lister toutes les permissions
adb shell pm list permissions -g
```
### Problème de signature
```bash
# Vérifier la signature de l'APK
jarsigner -verify -verbose -certs app-release.apk
# Voir le certificat
keytool -printcert -jarfile app-release.apk
```
## 📦 Transfert de fichiers
### Via ADB (recommandé pour dev)
```bash
# Envoyer un fichier vers le téléphone
adb push fichier.txt /sdcard/Download/
# Récupérer un fichier du téléphone
adb pull /sdcard/Download/fichier.txt ./
# Lister les fichiers
adb shell ls -la /sdcard/Download/
```
### Via MTP (pour Thunar)
```bash
# Monter le téléphone
jmtpfs ~/phone
# Démonter
fusermount -u ~/phone
# Ou redémarrer Thunar
thunar -q && thunar &
```
## 🎯 Commandes utiles pour GeoSector
### Logs spécifiques à l'application
```bash
# Voir les erreurs de l'API
adb logcat | grep -E "ApiService|ApiException"
# Voir les opérations Hive (base de données locale)
adb logcat | grep -i hive
# Voir les erreurs de géolocalisation
adb logcat | grep -E "geolocator|location"
# Tout voir pour GeoSector
adb logcat | grep -E "geosector|flutter" --color=always
```
### Script de déploiement rapide
Créer un fichier `deploy-android.sh` :
```bash
#!/bin/bash
echo "🚀 Déploiement sur Android..."
# Nettoyer et compiler
flutter clean
flutter pub get
flutter build apk --release
# Installer sur le device
adb install -r build/app/outputs/flutter-apk/app-release.apk
# Lancer l'application
adb shell am start -n fr.geosector.app2025/.MainActivity
# Afficher les logs
echo "📊 Logs en temps réel (CTRL+C pour arrêter)..."
adb logcat | grep -E "geosector|flutter" --color=always
```
Rendre exécutable : `chmod +x deploy-android.sh`
## 🏁 Workflow de développement recommandé
1. **Brancher le téléphone** et vérifier : `adb devices`
2. **Lancer en mode debug** : `flutter run`
3. **Modifier le code** et appuyer sur `r` pour hot reload
4. **Voir les logs** dans un autre terminal : `flutter logs`
5. **Tester la release** : `flutter run --release`
6. **Compiler l'APK final** : `flutter build apk --release`
7. **Installer** : `adb install -r app-release.apk`
## 💡 Tips & Tricks
- **Performance** : Toujours tester en mode `--release` pour juger les vraies performances
- **Logs** : Garder un terminal avec `flutter logs` ouvert en permanence pendant le dev
- **Hot Reload** : Fonctionne uniquement en mode debug, pas en release
- **Wi-Fi Debug** : Possible avec `adb connect <IP>:5555` après configuration
- **Multi-devices** : Flutter peut déployer sur plusieurs devices simultanément
---
*Guide créé pour le projet GeoSector - Mise à jour : Août 2025*

View File

@@ -1106,11 +1106,97 @@ Cette architecture garantit une gestion des membres robuste, sécurisée et intu
## 🗺️ Cartes et géolocalisation
Flutter Map : Rendu cartographique haute performance
Tuiles Mapbox : Cartographie détaillée et personnalisable
Géolocalisation temps réel : Suivi GPS des équipes
Secteurs géographiques : Visualisation et attribution dynamique
Passages géolocalisés : Enregistrement précis des distributions
### 🎯 Architecture cartographique
**Flutter Map** : Rendu cartographique haute performance
**Providers de tuiles** : Solution hybride Mapbox/OpenStreetMap
**Géolocalisation temps réel** : Suivi GPS des équipes
**Secteurs géographiques** : Visualisation et attribution dynamique
**Passages géolocalisés** : Enregistrement précis des distributions
### 🌍 Configuration des tuiles de carte
GEOSECTOR v2.0 utilise une **stratégie différenciée** pour l'affichage des tuiles de carte selon la plateforme :
#### **Configuration actuelle**
| Plateforme | Provider | URL Template | Raison |
|------------|----------|--------------|---------|
| **Web** | Mapbox | `https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/` | Token compatible avec l'API styles |
| **Mobile** | OpenStreetMap | `https://tile.openstreetmap.org/{z}/{x}/{y}.png` | Gratuit, sans restriction de token |
#### **Pourquoi cette approche ?**
1. **Problème de permissions Mapbox** : Les tokens Mapbox actuels (DEV/REC/PROD) n'ont pas les permissions pour l'API `styles/v1` qui retourne une erreur 403 sur mobile
2. **Solution pragmatique** : OpenStreetMap fonctionne parfaitement sans token et offre une qualité de carte équivalente
3. **Facilité de maintenance** : Pas besoin de gérer des tokens différents selon les environnements
### 💾 Système de cache des tuiles
Le cache fonctionne **pour les deux providers** (Mapbox et OpenStreetMap) :
#### **Configuration du cache**
```dart
// Dans mapbox_map.dart
CachedTileProvider(
store: FileCacheStore(cachePath),
maxStale: Duration(days: 30), // Tuiles valides 30 jours
)
```
#### **Caches séparés par provider**
- **Web (Mapbox)** : Cache dans `MapboxTileCache/`
- **Mobile (OSM)** : Cache dans `OSMTileCache/`
#### **Avantages du cache**
**Mode hors ligne** : Les zones visitées restent disponibles sans connexion
**Performance** : Chargement instantané des tuiles en cache
**Économie de données** : Pas de re-téléchargement inutile
**Fiabilité** : Fonctionne même avec une connexion instable
### 🔧 Widget MapboxMap centralisé
Le widget `MapboxMap` (`lib/presentation/widgets/mapbox_map.dart`) centralise toute la logique cartographique :
#### **Paramètres principaux**
```dart
MapboxMap(
initialPosition: LatLng(48.1173, -1.6778), // Rennes
initialZoom: 13.0,
markers: [...], // Marqueurs (passages, etc.)
polygons: [...], // Polygones (secteurs)
useOpenStreetMap: !kIsWeb, // OSM sur mobile, Mapbox sur web
showControls: true, // Boutons zoom/localisation
)
```
#### **Utilisation dans l'application**
- **admin_map_page.dart** : Carte d'administration avec édition de secteurs
- **user_map_page.dart** : Carte utilisateur avec visualisation des passages
- **user_field_mode_page.dart** : Mode terrain avec GPS et boussole
### 🔄 Migration future vers Mapbox complet
Si vous obtenez un token Mapbox avec les permissions appropriées :
1. **Retirer le paramètre** `useOpenStreetMap: !kIsWeb` dans les pages
2. **Le widget détectera automatiquement** et utilisera Mapbox partout
3. **Le cache continuera de fonctionner** avec le nouveau provider
### 📱 Mode terrain (Field Mode)
Le mode terrain offre des fonctionnalités avancées pour les équipes sur le terrain :
- **Indicateurs GPS** : Qualité du signal (GPS/Réseau) avec actualisation 5s
- **Mode boussole** : Orientation de la carte selon le magnétomètre
- **Markers optimisés** : Affichage simplifié (première lettre de rueBis)
- **Liste triée** : Passages organisés par distance
- **Cercles de distance** : Visualisation des zones de proximité
## 🔄 Synchronisation et réactivité

View File

@@ -1,194 +1,7 @@
# TODO-APP.md
## TODO-APP.md
## 📋 Liste des tâches à effectuer sur l'application GEOSECTOR
### 🔧 Migration du pattern de gestion des erreurs API
#### 🎯 Objectif
Appliquer le nouveau pattern de gestion des erreurs pour que tous les messages spécifiques de l'API soient correctement affichés aux utilisateurs (au lieu du message générique "Erreur inattendue").
---
### ✅ Repositories déjà migrés
- [x] **MembreRepository** (`lib/core/repositories/membre_repository.dart`)
- ✅ Conversion DioException → ApiException
- ✅ Simplification du code
- ✅ Logs avec LoggerService
---
### 📝 Repositories à migrer
#### 1. **UserRepository** (`lib/core/repositories/user_repository.dart`)
- [ ] Vérifier/ajouter l'import `ApiException`
- [ ] Simplifier `updateUser()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `syncUser()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `syncAllUsers()` - supprimer les vérifications de statut après l'appel API
- [ ] Remplacer `debugPrint` par `LoggerService`
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
#### 2. **OperationRepository** (`lib/core/repositories/operation_repository.dart`)
- [ ] Vérifier/ajouter l'import `ApiException`
- [ ] Simplifier `createOperation()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `updateOperation()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `deleteOperation()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `activateOperation()` - supprimer les vérifications de statut après l'appel API
- [ ] Remplacer `debugPrint` par `LoggerService`
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
#### 3. **PassageRepository** (`lib/core/repositories/passage_repository.dart`)
- [ ] Vérifier/ajouter l'import `ApiException`
- [ ] Simplifier `createPassage()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `updatePassage()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `updatePassageStatus()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `syncPassages()` - supprimer les vérifications de statut après l'appel API
- [ ] Remplacer `debugPrint` par `LoggerService`
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
#### 4. **SectorRepository** (`lib/core/repositories/sector_repository.dart`)
- [ ] Vérifier/ajouter l'import `ApiException`
- [ ] Simplifier `createSector()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `updateSector()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `deleteSector()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `assignUserToSector()` - supprimer les vérifications de statut après l'appel API
- [ ] Remplacer `debugPrint` par `LoggerService`
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
#### 5. **AmicaleRepository** (`lib/core/repositories/amicale_repository.dart`)
- [ ] Vérifier/ajouter l'import `ApiException`
- [ ] Simplifier `updateAmicale()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `createAmicale()` - supprimer les vérifications de statut après l'appel API
- [ ] Simplifier `syncAmicales()` - supprimer les vérifications de statut après l'appel API
- [ ] Remplacer `debugPrint` par `LoggerService`
- [ ] Améliorer la gestion des erreurs dans le bloc catch (ne pas logger DioException)
---
### 🛠️ Pattern à appliquer
#### ❌ Code à supprimer (ancien pattern)
```dart
try {
final response = await ApiService.instance.put('/endpoint', data: data);
if (response.statusCode == 200) {
// Traitement succès
return true;
}
// ⚠️ Ce code ne sera JAMAIS exécuté
if (response.data != null && response.data is Map<String, dynamic>) {
final responseData = response.data as Map<String, dynamic>;
if (responseData['status'] == 'error') {
throw Exception(responseData['message']);
}
}
return false;
} catch (e) {
debugPrint('Erreur: $e');
rethrow;
}
```
#### ✅ Nouveau pattern à utiliser
```dart
try {
final response = await ApiService.instance.put('/endpoint', data: data);
// Si on arrive ici, la requête a réussi (200/201)
// Traitement succès
return true;
} catch (e) {
// Log propre sans détails techniques
if (e is ApiException) {
LoggerService.error('Erreur lors de l\'opération: ${e.message}');
} else {
LoggerService.error('Erreur lors de l\'opération');
}
rethrow; // Propager pour affichage UI
}
```
---
### 📦 Imports nécessaires
Ajouter ces imports dans chaque repository si manquants :
```dart
import 'package:geosector_app/core/services/logger_service.dart';
import 'package:geosector_app/core/utils/api_exception.dart';
```
---
### 🧪 Tests de validation
Pour chaque repository migré, tester :
1. **Test d'erreur 409 (Conflict)** :
- Créer/modifier avec un email déjà existant
- Vérifier que le message "Cet email est déjà utilisé" s'affiche
2. **Test d'erreur 400 (Bad Request)** :
- Envoyer des données invalides
- Vérifier que le message d'erreur spécifique s'affiche
3. **Test d'erreur réseau** :
- Couper la connexion
- Vérifier que "Problème de connexion réseau" s'affiche
4. **Test de succès** :
- Opération normale
- Vérifier que tout fonctionne comme avant
---
### 📊 Critères de succès
- [ ] Tous les repositories utilisent le nouveau pattern
- [ ] Plus aucun `debugPrint` dans les repositories (remplacé par `LoggerService`)
- [ ] Les messages d'erreur spécifiques de l'API s'affichent correctement
- [ ] Les logs en production sont désactivés (sauf erreurs)
- [ ] Le code est plus simple et maintenable
---
### 🔍 Commandes utiles pour vérifier
```bash
# Rechercher les anciens patterns à remplacer
grep -r "response.statusCode ==" lib/core/repositories/
grep -r "responseData\['status'\] == 'error'" lib/core/repositories/
grep -r "debugPrint" lib/core/repositories/
# Vérifier les imports manquants
grep -L "LoggerService" lib/core/repositories/*.dart
grep -L "ApiException" lib/core/repositories/*.dart
```
---
### 📅 Priorité
1. **Haute** : UserRepository (utilisé partout)
2. **Haute** : OperationRepository (fonctionnalité critique)
3. **Moyenne** : PassageRepository (utilisé fréquemment)
4. **Moyenne** : AmicaleRepository (gestion administrative)
5. **Basse** : SectorRepository (moins critique)
---
### 📝 Notes
- Cette migration améliore l'UX en affichant des messages d'erreur clairs
- Le LoggerService désactive automatiquement les logs en production
- Le code devient plus maintenable et cohérent
- Documenter dans README-APP.md une fois terminé
---
## 🧪 Tests unitaires Flutter à implémenter
### 📁 Structure des tests
@@ -197,95 +10,108 @@ Le dossier `/test` doit contenir des tests unitaires pour valider le comportemen
### 📝 Tests prioritaires à créer
#### 1. **Tests des Repositories** (`test/repositories/`)
#### 1\. **Tests des Repositories** (`test/repositories/`)
##### `test/repositories/membre_repository_test.dart`
- [ ] Test de création d'un membre avec succès
- [ ] Test de création avec email déjà existant (409)
- [ ] Test de mise à jour d'un membre
- [ ] Test de suppression d'un membre
- [ ] Test de gestion des erreurs réseau
- [ ] Test du cache Hive local
`test/repositories/membre_repository_test.dart`
##### `test/repositories/user_repository_test.dart`
- [ ] Test de connexion réussie
- [ ] Test de connexion avec mauvais identifiants
- [ ] Test de mise à jour du profil utilisateur
- [ ] Test de synchronisation des données
- [ ] Test de gestion de session
- Test de création d'un membre avec succès
- Test de création avec email déjà existant (409)
- Test de mise à jour d'un membre
- Test de suppression d'un membre
- Test de gestion des erreurs réseau
- Test du cache Hive local
##### `test/repositories/operation_repository_test.dart`
- [ ] Test de création d'opération
- [ ] Test d'activation/désactivation
- [ ] Test de récupération des opérations par amicale
- [ ] Test de suppression avec transfert de passages
`test/repositories/user_repository_test.dart`
#### 2. **Tests des Services** (`test/services/`)
- Test de connexion réussie
- Test de connexion avec mauvais identifiants
- Test de mise à jour du profil utilisateur
- Test de synchronisation des données
- Test de gestion de session
##### `test/services/api_service_test.dart`
- [ ] Test de détection d'environnement (DEV/REC/PROD)
- [ ] Test de gestion des sessions
- [ ] Test de conversion DioException vers ApiException
- [ ] Test des différents codes d'erreur HTTP
- [ ] Test du retry automatique
`test/repositories/operation_repository_test.dart`
##### `test/services/logger_service_test.dart`
- [ ] Test de désactivation des logs en PROD
- [ ] Test des différents niveaux de log
- [ ] Test du formatage des messages
- Test de création d'opération
- Test d'activation/désactivation
- Test de récupération des opérations par amicale
- Test de suppression avec transfert de passages
##### `test/services/hive_service_test.dart`
- [ ] Test d'initialisation des boîtes Hive
- [ ] Test de sauvegarde et récupération
- [ ] Test de suppression de données
- [ ] Test de migration de schéma
#### 2\. **Tests des Services** (`test/services/`)
#### 3. **Tests des Models** (`test/models/`)
`test/services/api_service_test.dart`
##### `test/models/membre_model_test.dart`
- [ ] Test de sérialisation JSON
- [ ] Test de désérialisation JSON
- [ ] Test de conversion vers UserModel
- [ ] Test des valeurs par défaut
- Test de détection d'environnement (DEV/REC/PROD)
- Test de gestion des sessions
- Test de conversion DioException vers ApiException
- Test des différents codes d'erreur HTTP
- Test du retry automatique
##### `test/models/amicale_model_test.dart`
- [ ] Test de sérialisation/désérialisation
- [ ] Test des nouveaux champs booléens (chk_mdp_manuel, chk_username_manuel)
- [ ] Test de validation des données
`test/services/logger_service_test.dart`
#### 4. **Tests des Widgets** (`test/widgets/`)
- Test de désactivation des logs en PROD
- Test des différents niveaux de log
- Test du formatage des messages
##### `test/widgets/user_form_test.dart`
- [ ] Test d'affichage conditionnel des champs (username/password)
- [ ] Test de validation du mot de passe (regex)
- [ ] Test de validation de l'username (pas d'espaces)
- [ ] Test de génération automatique d'username
- [ ] Test du mode création vs modification
`test/services/hive_service_test.dart`
##### `test/widgets/membre_table_widget_test.dart`
- [ ] Test d'affichage responsive (mobile vs web)
- [ ] Test de masquage des colonnes sur mobile
- [ ] Test des icônes de statut
- [ ] Test du tri et filtrage
- Test d'initialisation des boîtes Hive
- Test de sauvegarde et récupération
- Test de suppression de données
- Test de migration de schéma
#### 5. **Tests d'intégration** (`test/integration/`)
#### 3\. **Tests des Models** (`test/models/`)
##### `test/integration/auth_flow_test.dart`
- [ ] Test du flow complet de connexion
- [ ] Test de persistance de session
- [ ] Test de déconnexion
- [ ] Test de redirection après expiration
`test/models/membre_model_test.dart`
##### `test/integration/membre_management_test.dart`
- [ ] Test de création complète d'un membre
- [ ] Test de modification avec validation
- [ ] Test de suppression avec transfert
- [ ] Test de gestion des erreurs
- Test de sérialisation JSON
- Test de désérialisation JSON
- Test de conversion vers UserModel
- Test des valeurs par défaut
`test/models/amicale_model_test.dart`
- Test de sérialisation/désérialisation
- Test des nouveaux champs booléens (chk_mdp_manuel, chk_username_manuel)
- Test de validation des données
#### 4\. **Tests des Widgets** (`test/widgets/`)
`test/widgets/user_form_test.dart`
- Test d'affichage conditionnel des champs (username/password)
- Test de validation du mot de passe (regex)
- Test de validation de l'username (pas d'espaces)
- Test de génération automatique d'username
- Test du mode création vs modification
`test/widgets/membre_table_widget_test.dart`
- Test d'affichage responsive (mobile vs web)
- Test de masquage des colonnes sur mobile
- Test des icônes de statut
- Test du tri et filtrage
#### 5\. **Tests d'intégration** (`test/integration/`)
`test/integration/auth_flow_test.dart`
- Test du flow complet de connexion
- Test de persistance de session
- Test de déconnexion
- Test de redirection après expiration
`test/integration/membre_management_test.dart`
- Test de création complète d'un membre
- Test de modification avec validation
- Test de suppression avec transfert
- Test de gestion des erreurs
### 🛠️ Configuration des tests
#### Fichier `test/test_helpers.dart`
```dart
```plaintext
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:dio/dio.dart';
@@ -293,7 +119,7 @@ import 'package:hive_flutter/hive_flutter.dart';
// Mocks nécessaires
class MockDio extends Mock implements Dio {}
class MockBox<T> extends Mock implements Box<T> {}
class MockBox<t> extends Mock implements Box<t> {}
class MockApiService extends Mock implements ApiService {}
// Helper pour initialiser Hive en tests
@@ -317,7 +143,7 @@ class TestDataFactory {
// ...
);
}
static MembreModel createTestMembre() {
return MembreModel(
id: 1,
@@ -332,7 +158,7 @@ class TestDataFactory {
### 📋 Commandes de test
```bash
```plaintext
# Lancer tous les tests
flutter test
@@ -349,16 +175,17 @@ open coverage/html/index.html
### 🎯 Objectifs de couverture
- [ ] **Repositories** : 80% minimum
- [ ] **Services** : 90% minimum
- [ ] **Models** : 95% minimum
- [ ] **Widgets critiques** : 70% minimum
- [ ] **Couverture globale** : 75% minimum
- **Repositories** : 80% minimum
- **Services** : 90% minimum
- **Models** : 95% minimum
- **Widgets critiques** : 70% minimum
- **Couverture globale** : 75% minimum
### 📚 Dépendances de test à ajouter
Dans `pubspec.yaml` :
```yaml
```plaintext
dev_dependencies:
flutter_test:
sdk: flutter
@@ -372,7 +199,8 @@ dev_dependencies:
### 🔄 Intégration CI/CD
Ajouter dans le pipeline CI :
```yaml
```plaintext
test:
stage: test
script:
@@ -386,14 +214,12 @@ test:
### 📝 Bonnes pratiques
1. **Isolation** : Chaque test doit être indépendant
2. **Mocking** : Utiliser des mocks pour les dépendances externes
3. **Nommage** : Utiliser des noms descriptifs (test_should_xxx_when_yyy)
4. **AAA** : Suivre le pattern Arrange-Act-Assert
5. **Edge cases** : Tester les cas limites et erreurs
6. **Performance** : Les tests unitaires doivent être rapides (<100ms)
---
1. **Isolation** : Chaque test doit être indépendant
2. **Mocking** : Utiliser des mocks pour les dépendances externes
3. **Nommage** : Utiliser des noms descriptifs (test_should_xxx_when_yyy)
4. **AAA** : Suivre le pattern Arrange-Act-Assert
5. **Edge cases** : Tester les cas limites et erreurs
6. **Performance** : Les tests unitaires doivent être rapides (\<100ms)
## 💬 Module Chat en ligne GEOSECTOR
@@ -403,7 +229,7 @@ Le module chat est partiellement implémenté avec une architecture MQTT pour le
### 🏗️ Architecture existante
```
```plaintext
lib/chat/
├── models/ # ✅ Modèles créés avec Hive
│ ├── conversation_model.dart # Conversations (one-to-one, groupe, annonce)
@@ -429,60 +255,67 @@ lib/chat/
### 📝 Tâches de développement Chat
#### 1. **Finalisation des modèles Hive**
- [ ] Compléter les adaptateurs Hive pour tous les modèles
- [ ] Ajouter la gestion des pièces jointes (images, documents)
- [ ] Implémenter le modèle `AnonymousUserModel` pour les utilisateurs temporaires
- [ ] Ajouter les timestamps et statuts de lecture
#### 1\. **Finalisation des modèles Hive**
#### 2. **Repository ChatRepository**
- [ ] Implémenter `createConversation()` avec participants
- [ ] Implémenter `sendMessage()` avec queue hors ligne
- [ ] Implémenter `getConversations()` avec pagination
- [ ] Implémenter `getMessages()` avec lazy loading
- [ ] Ajouter la gestion des participants (ajout/suppression)
- [ ] Implémenter les annonces ciblées par groupe
- Compléter les adaptateurs Hive pour tous les modèles
- Ajouter la gestion des pièces jointes (images, documents)
- Implémenter le modèle `AnonymousUserModel` pour les utilisateurs temporaires
- Ajouter les timestamps et statuts de lecture
#### 3. **Services**
- [ ] Compléter `ChatApiService` avec endpoints REST
- [ ] Implémenter la synchronisation bidirectionnelle
- [ ] Configurer `OfflineQueueService` pour messages en attente
- [ ] Implémenter le retry automatique avec exponential backoff
- [ ] Ajouter la compression des images avant envoi
#### 2\. **Repository ChatRepository**
#### 4. **Notifications MQTT**
- [ ] Installer et configurer Mosquitto dans le container Incus
- [ ] Configurer SSL/TLS pour MQTT (port 8883)
- [ ] Implémenter l'authentification par token JWT
- [ ] Créer les topics par utilisateur/groupe/conversation
- [ ] Implémenter le système de présence (online/offline/typing)
- [ ] Ajouter les ACLs pour sécuriser les topics
- Implémenter `createConversation()` avec participants
- Implémenter `sendMessage()` avec queue hors ligne
- Implémenter `getConversations()` avec pagination
- Implémenter `getMessages()` avec lazy loading
- Ajouter la gestion des participants (ajout/suppression)
- Implémenter les annonces ciblées par groupe
#### 5. **Interface utilisateur**
- [ ] Créer `ChatScreen` avec liste de messages
- [ ] Implémenter `ConversationsList` avec badges non-lus
- [ ] Designer `MessageBubble` (texte, images, documents)
- [ ] Créer `ChatInput` avec:
- [ ] Saisie de texte avec emoji picker
- [ ] Bouton d'envoi de fichiers
- [ ] Indicateur "en train d'écrire"
- [ ] Enregistrement vocal (optionnel)
- [ ] Ajouter les animations (apparition messages, typing indicator)
- [ ] Implémenter le swipe pour répondre
- [ ] Ajouter la recherche dans les conversations
#### 3\. **Services**
#### 6. **Fonctionnalités avancées**
- [ ] Notifications push locales via `flutter_local_notifications`
- [ ] Chiffrement end-to-end des messages sensibles
- [ ] Réactions aux messages (emojis)
- [ ] Messages éphémères avec auto-suppression
- [ ] Partage de localisation en temps réel
- [ ] Appels audio/vidéo via WebRTC (phase 2)
- Compléter `ChatApiService` avec endpoints REST
- Implémenter la synchronisation bidirectionnelle
- Configurer `OfflineQueueService` pour messages en attente
- Implémenter le retry automatique avec exponential backoff
- Ajouter la compression des images avant envoi
#### 4\. **Notifications MQTT**
- Installer et configurer Mosquitto dans le container Incus
- Configurer SSL/TLS pour MQTT (port 8883)
- Implémenter l'authentification par token JWT
- Créer les topics par utilisateur/groupe/conversation
- Implémenter le système de présence (online/offline/typing)
- Ajouter les ACLs pour sécuriser les topics
#### 5\. **Interface utilisateur**
- Créer `ChatScreen` avec liste de messages
- Implémenter `ConversationsList` avec badges non-lus
- Designer `MessageBubble` (texte, images, documents)
- Créer `ChatInput` avec:
- Saisie de texte avec emoji picker
- Bouton d'envoi de fichiers
- Indicateur "en train d'écrire"
- Enregistrement vocal (optionnel)
- Ajouter les animations (apparition messages, typing indicator)
- Implémenter le swipe pour répondre
- Ajouter la recherche dans les conversations
#### 6\. **Fonctionnalités avancées**
- Notifications push locales via `flutter_local_notifications`
- Chiffrement end-to-end des messages sensibles
- Réactions aux messages (emojis)
- Messages éphémères avec auto-suppression
- Partage de localisation en temps réel
- Appels audio/vidéo via WebRTC (phase 2)
### 🔧 Configuration backend requise
#### Base de données
```sql
```plaintext
-- Tables à créer (voir chat_tables.sql)
CREATE TABLE chat_conversations (
id INT PRIMARY KEY AUTO_INCREMENT,
@@ -512,7 +345,8 @@ CREATE TABLE chat_participants (
```
#### Configuration MQTT
```bash
```plaintext
# Installation Mosquitto
apt-get install mosquitto mosquitto-clients
@@ -528,18 +362,18 @@ password_file /etc/mosquitto/passwd
### 📦 Dépendances à ajouter
```yaml
```plaintext
dependencies:
# MQTT et notifications
mqtt5_client: ^4.0.0
flutter_local_notifications: ^17.0.0
# UI et UX
emoji_picker_flutter: ^2.0.0
cached_network_image: ^3.3.1
photo_view: ^0.14.0
file_picker: ^6.1.1
# Utilitaires
path_provider: ^2.1.2
image_picker: ^1.0.7
@@ -548,13 +382,12 @@ dependencies:
```
### 🧪 Tests à implémenter
- [ ] Tests unitaires des repositories
- [ ] Tests d'intégration MQTT
- [ ] Tests de performance (1000+ messages)
- [ ] Tests hors ligne/online
- [ ] Tests de sécurité (injection, XSS)
---
- Tests unitaires des repositories
- Tests d'intégration MQTT
- Tests de performance (1000+ messages)
- Tests hors ligne/online
- Tests de sécurité (injection, XSS)
## 💳 Module de paiement Stripe
@@ -564,76 +397,82 @@ Intégration de Stripe pour permettre aux amicales ayant activé `chk_stripe` d'
### 🎯 Objectifs
1. Permettre le paiement en ligne lors des passages
2. Gérer les comptes Stripe des amicales
3. Suivre les transactions et commissions
4. Offrir une expérience de paiement fluide
1. Permettre le paiement en ligne lors des passages
2. Gérer les comptes Stripe des amicales
3. Suivre les transactions et commissions
4. Offrir une expérience de paiement fluide
### 📝 Tâches de développement Stripe
#### 1. **Configuration initiale Stripe**
- [ ] Créer un compte Stripe Connect Platform
- [ ] Configurer les webhooks Stripe
- [ ] Mettre en place l'environnement de test (sandbox)
- [ ] Configurer les clés API (publishable/secret)
- [ ] Implémenter la gestion sécurisée des clés
#### 1\. **Configuration initiale Stripe**
#### 2. **Onboarding des amicales**
- [ ] Créer un workflow d'inscription Stripe pour les amicales
- [ ] Implémenter Stripe Connect Onboarding
- [ ] Gérer le KYC (Know Your Customer) requis par Stripe
- [ ] Stocker de manière sécurisée le `stripe_account_id`
- [ ] Créer une page de statut du compte Stripe
- [ ] Gérer les documents requis (RIB, statuts, etc.)
- Créer un compte Stripe Connect Platform
- Configurer les webhooks Stripe
- Mettre en place l'environnement de test (sandbox)
- Configurer les clés API (publishable/secret)
- Implémenter la gestion sécurisée des clés
#### 3. **Modèles de données**
- [ ] Créer `StripeAccountModel` pour les comptes Connect
- [ ] Créer `PaymentIntentModel` pour les intentions de paiement
- [ ] Créer `TransactionModel` pour l'historique
- [ ] Ajouter les champs Stripe dans `PassageModel`
- [ ] Implémenter la table des commissions
#### 2\. **Onboarding des amicales**
#### 4. **Service StripeService**
```dart
- Créer un workflow d'inscription Stripe pour les amicales
- Implémenter Stripe Connect Onboarding
- Gérer le KYC (Know Your Customer) requis par Stripe
- Stocker de manière sécurisée le `stripe_account_id`
- Créer une page de statut du compte Stripe
- Gérer les documents requis (RIB, statuts, etc.)
#### 3\. **Modèles de données**
- Créer `StripeAccountModel` pour les comptes Connect
- Créer `PaymentIntentModel` pour les intentions de paiement
- Créer `TransactionModel` pour l'historique
- Ajouter les champs Stripe dans `PassageModel`
- Implémenter la table des commissions
#### 4\. **Service StripeService**
```plaintext
class StripeService {
// Compte Connect
Future<String> createConnectAccount(AmicaleModel amicale);
Future<string> createConnectAccount(AmicaleModel amicale);
Future<void> updateAccountStatus(String accountId);
Future<String> createAccountLink(String accountId);
Future<string> createAccountLink(String accountId);
// Paiements
Future<PaymentIntent> createPaymentIntent({
Future<paymentintent> createPaymentIntent({
required double amount,
required String currency,
required String connectedAccountId,
});
Future<void> confirmPayment(String paymentIntentId);
Future<void> refundPayment(String paymentIntentId);
// Commissions
double calculateApplicationFee(double amount); // 1.4%
}
```
#### 5. **Interface de paiement dans PassageForm**
- [ ] Détecter si l'amicale accepte Stripe (`chk_stripe`)
- [ ] Ajouter l'option "Paiement par carte" dans le dropdown
- [ ] Intégrer Stripe Elements pour la saisie de carte
- [ ] Implémenter le flow de paiement 3D Secure
- [ ] Gérer les erreurs de paiement
- [ ] Afficher le reçu de paiement
- [ ] Permettre l'envoi du reçu par email
#### 5\. **Interface de paiement dans PassageForm**
#### 6. **Widget StripePaymentSheet**
```dart
- Détecter si l'amicale accepte Stripe (`chk_stripe`)
- Ajouter l'option "Paiement par carte" dans le dropdown
- Intégrer Stripe Elements pour la saisie de carte
- Implémenter le flow de paiement 3D Secure
- Gérer les erreurs de paiement
- Afficher le reçu de paiement
- Permettre l'envoi du reçu par email
#### 6\. **Widget StripePaymentSheet**
```plaintext
class StripePaymentSheet extends StatefulWidget {
final double amount;
final String currency;
final AmicaleModel amicale;
final Function(String) onSuccess;
final Function(String) onError;
// UI avec:
// - Montant à payer
// - Formulaire de carte (Stripe Elements)
@@ -643,15 +482,17 @@ class StripePaymentSheet extends StatefulWidget {
}
```
#### 7. **Tableau de bord financier**
- [ ] Page de suivi des transactions Stripe
- [ ] Graphiques des paiements par période
- [ ] Export des transactions (CSV/Excel)
- [ ] Calcul automatique des commissions
- [ ] Rapprochement bancaire
- [ ] Dashboard temps réel des paiements
#### 7\. **Tableau de bord financier**
- Page de suivi des transactions Stripe
- Graphiques des paiements par période
- Export des transactions (CSV/Excel)
- Calcul automatique des commissions
- Rapprochement bancaire
- Dashboard temps réel des paiements
#### 8\. **Webhooks Stripe**
#### 8. **Webhooks Stripe**
```php
// Backend PHP pour gérer les webhooks
class StripeWebhookHandler {
@@ -664,26 +505,29 @@ class StripeWebhookHandler {
}
```
#### 9. **Sécurité**
- [ ] Chiffrement des données sensibles
- [ ] Validation PCI DSS
- [ ] Audit trail des transactions
- [ ] Détection de fraude
- [ ] Rate limiting sur les API
- [ ] Tokenisation des cartes
#### 9\. **Sécurité**
#### 10. **Tests et conformité**
- [ ] Tests avec cartes de test Stripe
- [ ] Tests des cas d'erreur (carte refusée, etc.)
- [ ] Tests 3D Secure
- [ ] Tests de performance
- [ ] Conformité RGPD pour les données de paiement
- [ ] Documentation utilisateur
- Chiffrement des données sensibles
- Validation PCI DSS
- Audit trail des transactions
- Détection de fraude
- Rate limiting sur les API
- Tokenisation des cartes
#### 10\. **Tests et conformité**
- Tests avec cartes de test Stripe
- Tests des cas d'erreur (carte refusée, etc.)
- Tests 3D Secure
- Tests de performance
- Conformité RGPD pour les données de paiement
- Documentation utilisateur
### 🔧 Configuration backend requise
#### Tables base de données
```sql
```plaintext
CREATE TABLE stripe_accounts (
id INT PRIMARY KEY AUTO_INCREMENT,
fk_entite INT NOT NULL,
@@ -708,7 +552,8 @@ CREATE TABLE stripe_transactions (
```
#### Variables d'environnement
```env
```plaintext
STRIPE_PUBLISHABLE_KEY=pk_test_xxx
STRIPE_SECRET_KEY=sk_test_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx
@@ -717,14 +562,14 @@ STRIPE_APPLICATION_FEE_PERCENT=1.4
### 📦 Dépendances Stripe
```yaml
```plaintext
dependencies:
# Stripe
flutter_stripe: ^10.1.1
# Sécurité
flutter_secure_storage: ^9.0.0
# UI
shimmer: ^3.0.0 # Loading states
lottie: ^3.1.0 # Animations succès/échec
@@ -733,21 +578,25 @@ dependencies:
### 🚀 Roadmap d'implémentation
**Phase 1 (2 semaines)**
- Configuration Stripe Connect
- Onboarding basique des amicales
- Tests en sandbox
**Phase 2 (3 semaines)**
- Intégration dans PassageForm
- Gestion des paiements simples
- Webhooks essentiels
**Phase 3 (2 semaines)**
- Dashboard financier
- Export et rapports
- Tests complets
**Phase 4 (1 semaine)**
- Mise en production
- Monitoring
- Documentation
@@ -759,8 +608,6 @@ dependencies:
- **Commission application** : 1.4% (reversée à GEOSECTOR)
- **Coût net pour l'amicale** : ~2.8% + 0.25€ par transaction
---
**Date de création** : 2025-08-07
**Auteur** : Architecture Team
**Version** : 1.2.0
**Date de création** : 2025-08-07
**Auteur** : Architecture Team
**Version** : 1.2.0\</string,>\</string,>

View File

@@ -54,12 +54,24 @@ android {
buildTypes {
release {
// Optimisations sans ProGuard pour éviter les problèmes
isMinifyEnabled = false
isShrinkResources = false
// Configuration de signature
if (keystorePropertiesFile.exists()) {
signingConfig = signingConfigs.getByName("release")
} else {
signingConfig = signingConfigs.getByName("debug")
}
}
debug {
// Mode debug pour le développement
isDebuggable = true
applicationIdSuffix = ".debug"
versionNameSuffix = "-DEBUG"
}
}
}

View File

@@ -1,11 +1,17 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Permission Internet pour l'API -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Permissions pour la géolocalisation -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Feature GPS requise pour l'application -->
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
<application
android:label="geosector_app"
android:label="GeoSector"
android:name="${applicationName}"
android:icon="@mipmap/launcher_icon">
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground>
<inset
android:drawable="@drawable/ic_launcher_foreground"
android:inset="16%" />
</foreground>
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@@ -1,3 +1,7 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
android.useAndroidX=true
android.enableJetifier=true
# Optimisations de build
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configureondemand=true

View File

@@ -1,14 +1,14 @@
flutter_launcher_icons:
# Configuration générale
image_path: "assets/images/icon-geosector.svg"
image_path_android: "assets/images/icon-geosector.svg"
image_path_ios: "assets/images/icon-geosector.svg"
image_path: "assets/images/logo-geosector-1024.png"
image_path_android: "assets/images/logo-geosector-1024.png"
image_path_ios: "assets/images/logo-geosector-1024.png"
# Configuration Android
android: true
min_sdk_android: 21
adaptive_icon_background: "#FFFFFF"
adaptive_icon_foreground: "assets/images/icon-geosector.svg"
adaptive_icon_foreground: "assets/images/logo-geosector-512.png"
# Configuration iOS
ios: true

View File

@@ -471,7 +471,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEFINES_MODULE = YES;
@@ -566,7 +566,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -624,7 +624,7 @@
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = AppIcon;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
@@ -680,7 +680,7 @@
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEFINES_MODULE = YES;
@@ -727,7 +727,7 @@
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEFINES_MODULE = YES;

View File

@@ -1,122 +1 @@
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
{"images":[{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"20x20","idiom":"iphone","filename":"Icon-App-20x20@3x.png","scale":"3x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"29x29","idiom":"iphone","filename":"Icon-App-29x29@3x.png","scale":"3x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"40x40","idiom":"iphone","filename":"Icon-App-40x40@3x.png","scale":"3x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@1x.png","scale":"1x"},{"size":"57x57","idiom":"iphone","filename":"Icon-App-57x57@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@2x.png","scale":"2x"},{"size":"60x60","idiom":"iphone","filename":"Icon-App-60x60@3x.png","scale":"3x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@1x.png","scale":"1x"},{"size":"20x20","idiom":"ipad","filename":"Icon-App-20x20@2x.png","scale":"2x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@1x.png","scale":"1x"},{"size":"29x29","idiom":"ipad","filename":"Icon-App-29x29@2x.png","scale":"2x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@1x.png","scale":"1x"},{"size":"40x40","idiom":"ipad","filename":"Icon-App-40x40@2x.png","scale":"2x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@1x.png","scale":"1x"},{"size":"50x50","idiom":"ipad","filename":"Icon-App-50x50@2x.png","scale":"2x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@1x.png","scale":"1x"},{"size":"72x72","idiom":"ipad","filename":"Icon-App-72x72@2x.png","scale":"2x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@1x.png","scale":"1x"},{"size":"76x76","idiom":"ipad","filename":"Icon-App-76x76@2x.png","scale":"2x"},{"size":"83.5x83.5","idiom":"ipad","filename":"Icon-App-83.5x83.5@2x.png","scale":"2x"},{"size":"1024x1024","idiom":"ios-marketing","filename":"Icon-App-1024x1024@1x.png","scale":"1x"}],"info":{"version":1,"author":"xcode"}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 222 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -1,82 +1,198 @@
# Module Chat GEOSECTOR
# Module Chat Autonome pour GEOSECTOR
## Structure du module
## Description
Module de chat **totalement autonome et portable** pour l'application GEOSECTOR.
- **100% indépendant** : Peut être réutilisé dans n'importe quelle application Flutter
- **API REST uniquement** : Plus de dépendance MQTT
- **Architecture simple** : Code maintenable et facilement compréhensible
- **Cache local Hive** : Fonctionnement offline avec synchronisation automatique
- **Gestion des rôles** : Permissions configurables via YAML
- **Autocomplete intelligent** : Sélection des destinataires selon les permissions
Le module chat est organisé selon une architecture modulaire respectant la séparation des préoccupations :
## Architecture simplifiée
### Structure minimale
```
lib/chat/
├── models/ # Modèles de données
│ ├── conversation_model.dart
── message_model.dart
│ ├── participant_model.dart
── audience_target_model.dart
├── repositories/ # Gestion des données
│ └── chat_repository.dart
├── services/ # Services techniques
│ ├── chat_api_service.dart
── offline_queue_service.dart
├── widgets/ # Composants UI
│ ├── chat_screen.dart
│ ├── conversations_list.dart
│ ├── message_bubble.dart
│ └── chat_input.dart
├── pages/ # Pages de l'application
├── models/ # 2 modèles simples
│ ├── room.dart
── message.dart
├── services/ # Services de gestion
── chat_service.dart # Service principal
│ └── chat_config_loader.dart # Chargeur de configuration
├── widgets/ # Composants réutilisables
│ └── recipient_selector.dart # Sélecteur de destinataires
├── pages/ # 2 pages essentielles
── rooms_page.dart
│ └── chat_page.dart
├── chat.dart # Point d'entrée avec exports
└── README.md # Documentation du module
├── chat_config.yaml # Configuration des permissions
└── chat_module.dart # Point d'entrée
```
## Fonctionnalités principales
## Intégration dans votre application
1. **Conversations** : Support des conversations one-to-one, groupes et annonces
2. **Messages** : Envoi/réception de messages texte et pièces jointes
3. **Participants** : Gestion des participants aux conversations
4. **Annonces** : Diffusion de messages à des groupes spécifiques
5. **Mode hors ligne** : File d'attente pour la synchronisation des données
## Utilisation
### Importation
```dart
import 'package:geosector/chat/chat.dart';
### 1. Installation
```yaml
# pubspec.yaml
dependencies:
dio: ^5.4.0
hive: ^2.2.3
hive_flutter: ^1.1.0
yaml: ^3.1.2
```
### Affichage de la page chat
### 2. Initialisation
```dart
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ChatPage()),
await ChatModule.init(
apiUrl: 'https://api.geosector.fr',
userId: currentUser.id,
userName: currentUser.name,
userRole: currentUser.fkRole, // 1, 2 ou 9
userEntite: currentUser.entiteId, // ID de l'amicale
authToken: authToken, // Optionnel
);
```
### Création d'une conversation
### 3. Utilisation
```dart
final chatRepository = ChatRepository();
final conversation = await chatRepository.createConversation({
'type': 'one_to_one',
'participants': [userId1, userId2],
});
// Ouvrir le chat
ChatModule.openChat(context);
// Ou obtenir directement une page
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ChatModule.getRoomsPage(),
),
);
```
## États d'implémentation
## Gestion des permissions par rôle
- [x] Structure de base
- [ ] Modèles de données complets
- [ ] Intégration avec Hive
- [ ] Services API
- [ ] Gestion hors ligne
- [ ] Widgets visuels
- [ ] Tests unitaires
### Configuration (chat_config.yaml)
Les permissions sont définies dans un fichier YAML facilement modifiable :
## À faire
#### Rôle 1 (Membre)
- Peut discuter avec les membres de son amicale (rôle 1)
- Peut discuter avec l'admin de son amicale (rôle 2)
- Restriction : même entité uniquement
1. Compléter l'implémentation des modèles avec les adaptateurs Hive
2. Implémenter les méthodes dans les services et repositories
3. Créer les widgets visuels avec le design approprié
4. Ajouter les adaptateurs Hive pour le stockage local
5. Implémenter la gestion des pièces jointes
6. Ajouter les tests unitaires
#### Rôle 2 (Admin Amicale)
- Peut discuter avec tous les membres de son amicale
- Peut discuter avec les superadmins (rôle 9)
- Peut créer des groupes de discussion
#### Rôle 9 (Super Admin)
- Peut envoyer des messages à tous les admins d'amicale
- Peut sélectionner des destinataires spécifiques
- Peut faire du broadcast à tous les admins
## API Backend requise
### Endpoints REST
- `GET /api/chat/rooms` - Liste des conversations filtrées par rôle
- `POST /api/chat/rooms` - Créer une conversation avec vérification des permissions
- `GET /api/chat/rooms/{id}/messages` - Messages d'une conversation
- `POST /api/chat/rooms/{id}/messages` - Envoyer un message
- `POST /api/chat/rooms/{id}/read` - Marquer comme lu
- `GET /api/chat/recipients` - Liste des destinataires possibles selon le rôle
### Structure base de données
```sql
-- Tables préfixées "chat_"
CREATE TABLE chat_rooms (
id VARCHAR(36) PRIMARY KEY,
title VARCHAR(255),
type ENUM('private', 'group', 'broadcast'),
created_at TIMESTAMP,
created_by INT
);
CREATE TABLE chat_messages (
id VARCHAR(36) PRIMARY KEY,
room_id VARCHAR(36),
content TEXT,
sender_id INT,
sent_at TIMESTAMP,
FOREIGN KEY (room_id) REFERENCES chat_rooms(id)
);
CREATE TABLE chat_participants (
room_id VARCHAR(36),
user_id INT,
role INT,
entite_id INT,
joined_at TIMESTAMP,
PRIMARY KEY (room_id, user_id)
);
CREATE TABLE chat_read_receipts (
message_id VARCHAR(36),
user_id INT,
read_at TIMESTAMP,
PRIMARY KEY (message_id, user_id)
);
```
## Stockage local Hive
### TypeIds réservés
- TypeId 50: Room
- TypeId 51: Message
- TypeIds 52-60: Réservés pour extensions futures
### Boxes Hive
- `chat_rooms`: Conversations en cache
- `chat_messages`: Messages en cache
## Interface utilisateur
### Design minimaliste et professionnel
- Palette de couleurs sobre (blanc, gris, bleu accent)
- Pas d'animations superflues
- Focus sur la lisibilité et l'efficacité
- Interface responsive pour toutes les plateformes
### Composants principaux
1. **Liste des conversations** : Vue simple avec badges non-lus
2. **Page de chat** : Messages avec bulles, input simple
3. **Sélecteur de destinataires** : Autocomplete avec filtrage par rôle
## Planning de développement (2 sessions)
### Session 1 : Architecture de base ✅
- [x] Nettoyage et suppression du MQTT
- [x] Création des modèles simples (Room, Message)
- [x] Service unique ChatService
- [x] Pages minimales (RoomsPage, ChatPage)
- [x] Module d'entrée ChatModule
- [x] Gestion des rôles et permissions via YAML
- [x] Widget autocomplete pour sélection des destinataires
- [x] Adaptation de l'UI selon les permissions
### Session 2 : Finalisation
- [ ] Tests d'intégration avec l'API
- [ ] Documentation API complète
- [ ] Optimisations performances
- [ ] Gestion erreurs robuste
## Points d'attention
### Sécurité
- Authentification via token JWT
- Vérification des permissions côté serveur
- Validation des inputs
### Performance
- Cache Hive pour mode offline
- Pagination des messages
- Lazy loading des conversations
### Maintenance
- Code simple et documenté
- Architecture modulaire
- Configuration externalisée (YAML)
## Support
Pour toute question ou problème, consulter la documentation principale de l'application GEOSECTOR.

170
app/lib/chat/TODO_CHAT.md Normal file
View File

@@ -0,0 +1,170 @@
# 📋 TODO List - Module Chat v1.0.0
## 🎯 Objectif
Aligner le module chat avec l'API backend et optimiser l'expérience utilisateur.
## 📊 État d'avancement global : 8/13 (62%)
---
## 🔴 PRIORITÉ HAUTE - Fonctionnalités essentielles
### 1. ✅ Pagination des messages
- **Description** : Implémenter la pagination avec limit=50 et paramètre `before`
- **Endpoint** : `GET /api/chat/rooms/{id}/messages?limit=50&before={message_id}`
- **Fichiers** : `chat_service.dart`, `chat_page.dart`
- **Statut** : ✅ COMPLÉTÉ
### 2. ✅ Chargement progressif
- **Description** : Ajouter bouton "Charger plus" en haut de la conversation
- **UI** : Bouton ou indicateur en haut de la liste des messages
- **Fichiers** : `chat_page.dart`
- **Statut** : ✅ COMPLÉTÉ
### 3. ✅ Gestion du flag has_more
- **Description** : Gérer la réponse API pour savoir s'il reste des messages
- **Logique** : Désactiver "Charger plus" si `has_more: false`
- **Fichiers** : `message.dart`, `chat_service.dart`
- **Statut** : ✅ COMPLÉTÉ
---
## 🟠 PRIORITÉ MOYENNE - Amélioration UX
### 4. ✅ Message initial à la création
- **Description** : Ajouter `initial_message` lors de la création d'une room
- **Endpoint** : `POST /api/chat/rooms` avec body `{..., "initial_message": "..."}`
- **Fichiers** : `chat_service.dart`, `recipient_selector.dart`
- **Statut** : ✅ COMPLÉTÉ
### 5. ⬜ Extraction infos chat du login
- **Description** : Récupérer `total_rooms`, `unread_messages` depuis la réponse login
- **Intégration** : Stocker dans Hive ou service global
- **Fichiers** : `user_repository.dart`, `chat_service.dart`
- **Temps estimé** : 20 min
### 6. ⬜ Badge messages non lus
- **Description** : Afficher un badge rouge avec le nombre sur l'icône chat
- **UI** : Badge sur NavigationDestination et dans la sidebar
- **Fichiers** : `responsive_navigation.dart`, `admin_dashboard_page.dart`
- **Temps estimé** : 15 min
### 7. ✅ Pull-to-refresh RoomsPage
- **Description** : Ajouter RefreshIndicator pour rafraîchir la liste des rooms
- **Geste** : Tirer vers le bas pour recharger
- **Fichiers** : `rooms_page.dart`
- **Statut** : ✅ COMPLÉTÉ (déjà implémenté)
### 8. ✅ Pull-to-refresh ChatPage
- **Description** : Ajouter RefreshIndicator pour rafraîchir les messages
- **Geste** : Tirer vers le bas pour recharger les derniers messages
- **Fichiers** : `chat_page.dart`
- **Statut** : ✅ COMPLÉTÉ
---
## 🟡 PRIORITÉ BASSE - Optimisations
### 9. ✅ Optimiser cache Hive
- **Description** : Limiter à 100 messages max par room dans le cache
- **Logique** : Supprimer les plus anciens si > 100
- **Fichiers** : `chat_service.dart`
- **Statut** : ✅ COMPLÉTÉ
### 10. ⬜ Optimiser le polling
- **Description** : Polling actif seulement si la page chat est visible
- **Optimisation** : Pause/reprise selon WidgetsBindingObserver
- **Fichiers** : `chat_service.dart`, `rooms_page.dart`
- **Temps estimé** : 15 min
### 11. ✅ Indicateurs de chargement
- **Description** : Ajouter spinners lors du chargement de la pagination
- **UI** : CircularProgressIndicator pendant les requêtes
- **Fichiers** : `chat_page.dart`
- **Statut** : ✅ COMPLÉTÉ
### 12. ⬜ Auto-refresh au retour
- **Description** : Rafraîchir quand l'app revient au premier plan
- **Implémentation** : WidgetsBindingObserver avec AppLifecycleState
- **Fichiers** : `chat_module.dart`, `rooms_page.dart`
- **Temps estimé** : 10 min
---
## 📚 DOCUMENTATION
### 13. ⬜ Mettre à jour README.md
- **Description** : Documenter toutes les nouvelles fonctionnalités
- **Sections** : Pagination, pull-to-refresh, badges, optimisations
- **Fichiers** : `README.md`
- **Temps estimé** : 15 min
---
## ⏱️ Temps total restant : ~1h
## 🚀 Ordre de développement recommandé
### Phase 1 : Core ✅ COMPLÉTÉ
1. Pagination des messages ✅
2. Chargement progressif ✅
3. Gestion has_more ✅
### Phase 2 : Intégration (En cours)
4. Message initial ✅
5. Infos chat login ⬜
6. Badge non lus ⬜
7. Pull-to-refresh rooms ✅
8. Pull-to-refresh chat ✅
### Phase 3 : Polish (Partiellement complété)
9. Optimiser cache ✅
10. Optimiser polling ⬜
11. Indicateurs chargement ✅
12. Auto-refresh ⬜
### Phase 4 : Documentation
13. README.md ⬜
---
## 📝 Notes
- **Version actuelle** : 1.0.0
- **Date de création** : 2025-01-17
- **Dernière mise à jour** : 2025-01-17
- **Développeur** : Module Chat Team
## 🔗 Références
- [API Documentation](../../../docs/API_CHAT.md)
- [Architecture Flutter](../README.md)
- [Permissions YAML](../chat_config.yaml)
## ✨ Améliorations implémentées
### Pagination
- Limite de 50 messages par requête
- Paramètre `before` pour charger les messages plus anciens
- Gestion du flag `has_more` pour indiquer s'il reste des messages
- Bouton "Charger plus" en haut de la conversation
### Optimisations cache
- Limitation à 100 messages maximum par room dans Hive
- Suppression automatique des messages les plus anciens
- Méthode `_saveMessagesToCache` dédiée
### Message initial
- Champ de texte ajouté dans le dialog de sélection des destinataires
- Paramètre `initial_message` dans les méthodes de création de room
- Support dans l'API pour envoyer le message initial
### Pull-to-refresh
- RefreshIndicator dans RoomsPage (déjà existant)
- RefreshIndicator dans ChatPage pour rafraîchir les messages
- Rechargement complet des messages récents
### Indicateurs de chargement
- Spinner pendant le chargement de la pagination
- État `_isLoadingMore` pour gérer l'affichage
- CircularProgressIndicator de taille réduite

View File

@@ -1,36 +0,0 @@
/// Exportation principale du module chat
///
/// Ce fichier centralise les exportations du module chat
/// pour faciliter l'importation dans d'autres parties de l'application
library;
// Models
export 'models/conversation_model.dart';
export 'models/message_model.dart';
export 'models/participant_model.dart';
export 'models/audience_target_model.dart';
export 'models/anonymous_user_model.dart';
export 'models/chat_config.dart';
export 'models/notification_settings.dart';
// Repositories
export 'repositories/chat_repository.dart';
// Services
export 'services/chat_api_service.dart';
export 'services/offline_queue_service.dart';
export 'services/notifications/mqtt_notification_service.dart';
export 'services/notifications/mqtt_config.dart';
// Widgets
export 'widgets/chat_screen.dart';
export 'widgets/conversations_list.dart';
export 'widgets/message_bubble.dart';
export 'widgets/chat_input.dart';
export 'widgets/notification_settings_widget.dart';
// Pages
export 'pages/chat_page.dart';
// Constants
export 'constants/chat_constants.dart';

View File

@@ -0,0 +1,84 @@
# Configuration du module Chat
# Regles de permissions par role
# Version du module
module_info:
version: "1.0.0"
name: "Chat Module Light"
description: "Module de chat autonome et portable pour GEOSECTOR"
chat_permissions:
# Role 1: Membre standard
role_1:
name: "Membre"
description: "Membre de l'amicale"
can_message_with:
- role: 1
condition: "same_entite" # Meme amicale seulement
description: "Collegues membres"
- role: 2
condition: "same_entite" # Admin de sa propre amicale
description: "Administrateur de votre amicale"
can_create_group: false
can_broadcast: false
help_text: "Vous pouvez discuter avec les membres de votre amicale"
# Role 2: Administrateur d'amicale
role_2:
name: "Admin Amicale"
description: "Administrateur d'une amicale"
can_message_with:
- role: 1
condition: "same_entite" # Membres de son amicale
description: "Membres de votre amicale"
- role: 2
condition: "same_entite" # Autres admins de son amicale
description: "Co-administrateurs"
- role: 9
condition: "all" # Tous les superadmins
description: "Super administrateurs"
can_create_group: true
can_broadcast: false
help_text: "Vous pouvez discuter avec les membres de votre amicale et les super admins"
# Role 9: Super administrateur
role_9:
name: "Super Admin"
description: "Administrateur systeme"
can_message_with:
- role: 2
condition: "all" # Tous les admins d'amicale
description: "Administrateurs d'amicale"
allow_selection: true # Permet selection multiple
allow_broadcast: true # Permet envoi groupe
can_create_group: true
can_broadcast: true
help_text: "Vous pouvez envoyer des messages a tous les administrateurs d'amicale ou selectionner des destinataires specifiques"
# Configuration de l'interface
ui_config:
show_role_badge: true
show_entite_info: true
enable_autocomplete: true
min_search_length: 2
# Messages par defaut
messages:
no_permission: "Vous n'avez pas la permission de creer cette conversation"
no_recipients: "Aucun destinataire disponible"
search_placeholder: "Rechercher un destinataire..."
new_conversation: "Nouvelle conversation"
select_recipients: "Selectionner les destinataires"
# Couleurs par role (optionnel)
role_colors:
1: "#64748B" # Gris pour membre
2: "#2563EB" # Bleu pour admin
9: "#DC2626" # Rouge pour superadmin
# Configuration API
api_config:
recipients_endpoint: "/chat/recipients"
create_room_endpoint: "/chat/rooms"
require_entite_for_role_1: true
require_entite_for_role_2: true

59
app/lib/chat/chat_module.dart Executable file
View File

@@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'services/chat_service.dart';
import 'pages/rooms_page.dart';
import 'pages/chat_page.dart';
/// Module de chat autonome avec gestion des rôles
///
/// Les permissions sont gérées via le fichier chat_config.yaml
class ChatModule {
/// Initialiser le module chat avec support des rôles
///
/// @param apiUrl URL de base de l'API
/// @param userId ID de l'utilisateur connecté
/// @param userName Nom de l'utilisateur
/// @param userRole Rôle de l'utilisateur (1: membre, 2: admin amicale, 9: superadmin)
/// @param userEntite ID de l'entité/amicale de l'utilisateur (optionnel)
/// @param authToken Token JWT d'authentification (optionnel)
static Future<void> init({
required String apiUrl,
required int userId,
required String userName,
required int userRole,
int? userEntite,
String? authToken,
}) async {
await ChatService.init(
apiUrl: apiUrl,
userId: userId,
userName: userName,
userRole: userRole,
userEntite: userEntite,
authToken: authToken,
);
}
/// Obtenir la page de liste des conversations
static Widget getRoomsPage() => const RoomsPage();
/// Obtenir la page de chat pour une room spécifique
static Widget getChatPage(String roomId, String roomTitle) => ChatPage(
roomId: roomId,
roomTitle: roomTitle,
);
/// Naviguer vers le chat depuis n'importe où
static void openChat(BuildContext context) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => const RoomsPage(),
),
);
}
/// Nettoyer les ressources
static void dispose() {
ChatService.instance.dispose();
}
}

View File

@@ -1,510 +0,0 @@
# Solution de Chat pour Applications Flutter
## Présentation générale
Cette solution propose un système de chat personnalisé et autonome pour des applications Flutter, avec possibilité d'intégration web. Elle est conçue pour fonctionner dans deux contextes différents :
1. **Chat entre utilisateurs authentifiés** (cas Geosector) : communications one-to-one ou en groupe entre utilisateurs déjà enregistrés dans la base de données.
2. **Chat entre professionnels et visiteurs anonymes** (cas Resalice) : communications initiées par des visiteurs anonymes qui peuvent ensuite être convertis en clients référencés.
## Architecture technique
### 1. Structure générale
La solution s'articule autour de quatre composants principaux :
- **Module Flutter** : Widgets et logique pour l'interface utilisateur mobile
- **Module Web** : Composants pour l'intégration web (compatible avec Flutter Web ou sites traditionnels)
- **API Backend** : Endpoints REST uniquement pour la récupération de l'historique des conversations
- **Module Go Chat Service** : Service de gestion des messages MQTT, modération et synchronisation avec la base de données
### 2. Infrastructure de notifications
#### Broker MQTT
Le système utilise MQTT pour les notifications en temps réel :
- Broker Mosquitto hébergé dans un container Incus
- Connexion sécurisée via SSL/TLS (port 8883)
- Authentification par username/password
- QoS 1 (at least once) pour garantir la livraison
#### Module Go Chat Service
Un service externe en Go qui :
- Écoute les événements MQTT
- Enregistre les messages dans la base de données
- Applique des règles de modération configurables
- Synchronise les notifications avec le stockage
```go
type ChatService struct {
mqttClient mqtt.Client
db *sql.DB
moderator *Moderator
config *ChatConfig
}
type ChatConfig struct {
ApplicationID string
ModeratorEnabled bool
BadWords []string
FloodLimits int
SpamRules map[string]interface{}
Webhooks []string
}
```
### 3. Modèle de données
#### Entités principales
```
Conversation
├── id : Identifiant unique
├── type : Type de conversation (one_to_one, group, anonymous, broadcast, announcement)
├── title : Titre facultatif pour les groupes et obligatoire pour les annonces
├── reply_permission : Niveau de permission pour répondre (all, admins_only, sender_only, none)
├── created_at : Date de création
├── updated_at : Dernière mise à jour
├── is_pinned : Indique si la conversation est épinglée (pour annonces importantes)
├── expiry_date : Date d'expiration optionnelle (pour annonces temporaires)
└── participants : Liste des participants
Message
├── id : Identifiant unique
├── conversation_id : ID de la conversation
├── sender_id : ID de l'expéditeur (null pour anonyme)
├── sender_type : Type d'expéditeur (user, anonymous, system)
├── content : Contenu du message
├── content_type : Type de contenu (text, image, file)
├── created_at : Date d'envoi
├── delivered_at : Date de réception
├── read_at : Date de lecture
├── status : Statut du message (sent, delivered, read, error)
├── is_announcement : Indique s'il s'agit d'une annonce officielle
├── is_moderated : Indique si le message a été modéré
└── moderation_status : Statut de la modération (pending, approved, rejected)
Participant
├── id : Identifiant unique
├── conversation_id : ID de la conversation
├── user_id : ID de l'utilisateur (si authentifié)
├── anonymous_id : ID anonyme (pour Resalice)
├── role : Rôle (admin, member, read_only)
├── joined_at : Date d'ajout à la conversation
├── via_target : Indique si l'utilisateur est inclus via un AudienceTarget
├── can_reply : Possibilité explicite de répondre (override de reply_permission)
└── last_read_message_id : ID du dernier message lu
AudienceTarget
├── id : Identifiant unique
├── conversation_id : ID de la conversation
├── target_type : Type de cible (role, entity, all, combined)
├── target_id : ID du rôle ou de l'entité ciblée (pour compatibility)
├── role_filter : Filtre de rôle pour le ciblage combiné ('all', '1', '2', etc.)
├── entity_filter : Filtre d'entité pour le ciblage combiné ('all', 'id_entité')
└── created_at : Date de création
AnonymousUser (pour Resalice)
├── id : Identifiant unique
├── device_id : Identifiant du dispositif
├── name : Nom temporaire (si fourni)
├── email : Email (si fourni)
├── created_at : Date de création
├── converted_to_user_id : ID utilisateur après conversion
└── metadata : Informations supplémentaires
ChatNotification
├── id : Identifiant unique
├── user_id : ID de l'utilisateur destinataire
├── message_id : ID du message
├── conversation_id : ID de la conversation
├── type : Type de notification
├── status : Statut (sent, delivered, read)
├── sent_at : Date d'envoi
└── read_at : Date de lecture
```
### 4. Backend et API
#### Structure de l'API
L'API sera développée en PHP 8.3 pour s'intégrer avec vos systèmes existants :
```
/api/chat/conversations
GET - Liste des conversations de l'utilisateur
POST - Créer une nouvelle conversation
/api/chat/conversations/{id}
GET - Détails d'une conversation
PUT - Mettre à jour une conversation
DELETE - Supprimer une conversation
/api/chat/conversations/{id}/messages
GET - Messages d'une conversation (pagination) - uniquement pour l'historique
/api/chat/conversations/{id}/participants
GET - Liste des participants
POST - Ajouter un participant
DELETE - Retirer un participant
/api/chat/messages/{id}
PUT - Mettre à jour un message (ex: marquer comme lu)
DELETE - Supprimer un message
/api/chat/anonymous
POST - Démarrer une conversation anonyme
# Nouveaux endpoints pour les annonces
/api/chat/announcements
GET - Liste des annonces pour l'utilisateur
POST - Créer une nouvelle annonce
/api/chat/announcements/{id}/stats
GET - Obtenir les statistiques de lecture (qui a lu/non lu)
/api/chat/audience-targets
GET - Obtenir les cibles disponibles pour l'utilisateur actuel
/api/chat/conversations/{id}/pin
PUT - Épingler/désépingler une conversation
/api/chat/conversations/{id}/reply-permission
PUT - Modifier les permissions de réponse
/api/chat/moderation/rules
GET - Obtenir les règles de modération
PUT - Mettre à jour les règles de modération
```
#### Synchronisation
Le système supporte deux flux de données distincts :
1. **Temps réel via MQTT** :
- Envoi de messages en temps réel
- Notifications instantanées
- Gestion via le module Go
2. **Récupération historique via REST** :
- Chargement de l'historique des conversations
- Synchronisation des anciens messages
- Accès direct à la base de données
- Enregistrement local des messages avec Hive pour le fonctionnement hors ligne
### 5. Widgets Flutter
#### Widgets principaux
1. **ChatScreen** : Écran principal d'une conversation
```dart
ChatScreen({
required String conversationId,
String? title,
Widget? header,
Widget? footer,
bool enableAttachments = true,
bool showTypingIndicator = true,
bool enableReadReceipts = true,
bool isAnnouncement = false,
bool canReply = true,
})
```
2. **ConversationsList** : Liste des conversations
```dart
ConversationsList({
List<ConversationModel>? conversations,
bool loadFromHive = true,
Function(ConversationModel)? onConversationSelected,
bool showLastMessage = true,
bool showUnreadCount = true,
bool showAnnouncementBadge = true,
bool showPinnedFirst = true,
Widget? emptyStateWidget,
})
```
3. **MessageBubble** : Bulle de message
```dart
MessageBubble({
required MessageModel message,
bool showSenderInfo = true,
bool showTimestamp = true,
bool showStatus = true,
bool isAnnouncement = false,
double maxWidth = 300,
})
```
4. **ChatInput** : Zone de saisie de message
```dart
ChatInput({
required Function(String) onSendText,
Function(File)? onSendFile,
Function(File)? onSendImage,
bool enableAttachments = true,
bool enabled = true,
String hintText = 'Saisissez votre message...',
String? disabledMessage = 'Vous ne pouvez pas répondre à cette annonce',
int? maxLength,
})
```
5. **AnonymousChatStarter** : Widget pour démarrer un chat anonyme (Resalice)
```dart
AnonymousChatStarter({
required Function(String?) onChatStarted,
bool requireName = false,
bool requireEmail = false,
String buttonLabel = 'Démarrer une conversation',
Widget? customForm,
})
```
6. **AnnouncementComposer** : Widget pour créer des annonces (Geosector uniquement)
```dart
AnnouncementComposer({
required Function(Map<String, dynamic>) onSend,
List<Map<String, dynamic>>? availableTargets,
String? initialTitle,
String? initialMessage,
bool allowAttachments = true,
bool allowPinning = true,
List<String> replyPermissionOptions = const ['all', 'admins_only', 'sender_only', 'none'],
String defaultReplyPermission = 'none',
DateTime? expiryDate,
bool isGeosector = true, // Active la sélection des destinataires
})
```
### 6. Gestion des notifications MQTT
#### Service MQTT Flutter
```dart
class MqttNotificationService {
final String mqttHost;
final int mqttPort;
final String mqttUsername;
final String mqttPassword;
Future<void> initialize({required String userId}) async {
// Initialisation du client MQTT
await _initializeMqttClient();
// Abonnement aux topics de l'utilisateur
_subscribeToUserTopics(userId);
}
void _subscribeToUserTopics(String userId) {
// Topics pour les messages personnels
client.subscribe('chat/user/$userId/messages', MqttQos.atLeastOnce);
// Topics pour les annonces
client.subscribe('chat/announcement', MqttQos.atLeastOnce);
}
Future<void> _handleMessage(String topic, Map<String, dynamic> data) async {
// Traitement et affichage de la notification locale
await _showLocalNotification(data);
// Stockage local pour la synchronisation
await _syncWithHive(data);
}
// Pour envoyer un message en temps réel
Future<void> sendMessage(String conversationId, String content) async {
final message = {
'conversationId': conversationId,
'content': content,
'senderId': currentUserId,
'timestamp': DateTime.now().toIso8601String(),
};
await client.publishMessage(
'chat/message/send',
MqttQos.atLeastOnce,
MqttClientPayloadBuilder().addString(jsonEncode(message)).payload!,
);
}
}
```
#### Service REST Flutter
```dart
class ChatApiService {
Future<List<Message>> getHistoricalMessages(
String conversationId, {
int page = 1,
int limit = 50,
}) async {
final response = await get('/api/chat/conversations/$conversationId/messages');
return (response.data as List)
.map((json) => Message.fromJson(json))
.toList();
}
// Note: Pas de POST pour les messages - uniquement pour l'historique
}
```
#### Structure des topics MQTT
```
chat/user/{userId}/messages - Messages personnels
chat/conversation/{convId} - Messages de groupe
chat/announcement - Annonces générales
chat/moderation/{msgId} - Résultats de modération
chat/typing/{convId} - Indicateurs de frappe
```
### 7. Module Go Chat Service
Le module Go gère :
1. **Réception MQTT**
- Écoute les topics de chat
- Parse les messages JSON
- Valide le format
2. **Modération**
- Analyse du contenu
- Application des règles configurables
- Filtrage des mots interdits
- Détection de spam
- Notification des résultats
3. **Synchronisation base de données**
- Enregistrement des messages en base
- Création des notifications
- Mise à jour des statuts de livraison
- Gestion des acquittements
**Note importante** : Le module Go n'a aucune interaction avec l'API REST. Il est uniquement connecté au broker MQTT pour recevoir les messages et à la base de données pour les stocker.
4. **Configuration par application**
```yaml
applications:
geosector:
moderator_enabled: true
bad_words: ["liste", "des", "mots"]
flood_limit: 5
spam_rules:
url_limit: 2
repetition_threshold: 0.8
resalice:
moderator_enabled: false
# Configuration différente
```
### 8. Stockage des fichiers
Le système supportera le téléchargement et le partage de fichiers :
1. **Côté serveur** : Stockage dans un répertoire sécurisé avec restriction d'accès
2. **Côté client** : Mise en cache des fichiers pour éviter des téléchargements redondants
3. **Types supportés** : Images, documents, autres fichiers selon configuration
## Cas d'utilisation spécifiques
### 1. Geosector
- **Utilisateurs authentifiés uniquement**
- **Groupes par équipe** avec administrateurs pour les communications internes
- **Modération active** avec filtrage de contenu
- **Historique complet** des conversations
- **Intégration avec la structure existante** des amicales et équipes
- **Annonces et broadcasts**:
- Super admin → tous les admins d'entités
- Admin d'entité → tous les utilisateurs de son entité
- Communications descendantes sans possibilité de réponse
- Statistiques de lecture des annonces importantes
- **Ciblage flexible des destinataires** :
- Par entité (toutes ou une spécifique)
- Par rôle (tous, membres, administrateurs)
- Combinaison entité + rôle (ex: admins de l'entité 5)
- Sélection via le widget `AnnouncementTargetSelector`
### 2. Resalice
- **Chats initiés par des anonymes**
- **Conversation one-to-one uniquement** entre professionnel et client/prospect
- **Pas de modération active** par défaut
- **Conversion client** : Processus pour transformer un utilisateur anonyme en client référencé
- **Conservation des historiques** après conversion
- **Interface professionnelle** adaptée aux échanges client/professionnel
- **Pas de fonctionnalité d'annonce** - uniquement des conversations directes
## Adaptabilité et extensibilité
### 1. Options de personnalisation
- **Thèmes** : Adaptation aux couleurs et styles de l'application
- **Fonctionnalités** : Activation/désactivation de certaines fonctionnalités
- **Comportements** : Configuration des notifications, comportement hors ligne, etc.
- **Modération** : Configuration par application
### 2. Extensions possibles
- **Chatbot** : Possibilité d'intégrer des réponses automatiques
- **Transfert** : Transfert de conversations entre professionnels
- **Intégration CRM** : Liaison avec des systèmes CRM pour le suivi client
- **Analyse** : Statistiques sur les conversations, temps de réponse, etc.
- **Audio/Vidéo** : Support des messages vocaux et vidéo
## Étapes d'implémentation suggérées
1. **Phase 1 : Infrastructure de base** (4-5 semaines)
- Installation et configuration du broker MQTT
- Développement du module Go Chat Service
- Modèles de données et adaptateurs Hive
- Configuration de l'API backend
2. **Phase 2 : Fonctionnalités principales** (4-5 semaines)
- Widgets de base pour affichage/envoi de messages
- Gestion des notifications MQTT
- Système de modération
- Structure de base pour les annonces et broadcasts
3. **Phase 3 : Fonctionnalités avancées** (3-4 semaines)
- Gestion hors ligne et synchronisation
- Support des fichiers et images
- Indicateurs de lecture et d'écriture
- Système de ciblage d'audience pour les annonces
4. **Phase 4 : Cas spécifiques** (3-4 semaines)
- Support des conversations anonymes (Resalice)
- Groupes et permissions avancées (Geosector)
- Statistiques de lecture des annonces
- Interface administrateur pour les annonces globales
- Intégration web complète
Le temps total d'implémentation pour Geosector est estimé à 12-15 semaines pour un développeur expérimenté en Flutter, PHP et Go. L'adaptation ultérieure à Resalice devrait prendre environ 3-4 semaines supplémentaires grâce à la conception modulaire du système.
## Conclusion
Cette solution de chat personnalisée offre un équilibre entre robustesse et simplicité d'intégration. Elle répond aux besoins spécifiques de vos applications tout en restant suffisamment flexible pour s'adapter à d'autres contextes.
Le système prend en charge non seulement les conversations classiques (one-to-one, groupes) mais aussi les communications de type annonce/broadcast où un administrateur peut communiquer des informations importantes à des groupes d'utilisateurs définis par rôle ou entité, avec ou sans possibilité de réponse.
### Points clés de l'architecture
1. **Séparation des flux** :
- **Temps réel** : Via MQTT pour l'envoi de messages et les notifications
- **Historique** : Via REST pour la récupération des anciennes conversations
2. **Modération centrée** : Le module Go gère la modération sans interaction avec l'API REST
3. **Auto-hébergement** :
- Broker MQTT dans votre container Incus
- Module Go dédié pour la gestion des messages
- Contrôle total de l'infrastructure
4. **Configuration flexible** : Modération et comportement adaptables par application
En développant cette solution en interne, vous gardez un contrôle total sur les fonctionnalités et l'expérience utilisateur, tout en assurant une cohérence avec le reste de vos applications. La conception modulaire et réutilisable permettra également un déploiement efficace sur vos différentes plateformes et applications.

View File

@@ -1,51 +0,0 @@
/// Constantes spécifiques au module chat
library;
class ChatConstants {
// Types de conversations
static const String conversationTypeOneToOne = 'one_to_one';
static const String conversationTypeGroup = 'group';
static const String conversationTypeAnonymous = 'anonymous';
static const String conversationTypeBroadcast = 'broadcast';
static const String conversationTypeAnnouncement = 'announcement';
// Types de messages
static const String messageTypeText = 'text';
static const String messageTypeImage = 'image';
static const String messageTypeFile = 'file';
static const String messageTypeSystem = 'system';
// Types d'expéditeurs
static const String senderTypeUser = 'user';
static const String senderTypeAnonymous = 'anonymous';
static const String senderTypeSystem = 'system';
// Rôles des participants
static const String participantRoleAdmin = 'admin';
static const String participantRoleMember = 'member';
static const String participantRoleReadOnly = 'read_only';
// Permissions de réponse
static const String replyPermissionAll = 'all';
static const String replyPermissionAdminsOnly = 'admins_only';
static const String replyPermissionSenderOnly = 'sender_only';
static const String replyPermissionNone = 'none';
// Types de cibles d'audience
static const String targetTypeRole = 'role';
static const String targetTypeEntity = 'entity';
static const String targetTypeAll = 'all';
// Noms des boîtes Hive
static const String conversationsBoxName = 'chat_conversations';
static const String messagesBoxName = 'chat_messages';
static const String participantsBoxName = 'chat_participants';
static const String anonymousUsersBoxName = 'chat_anonymous_users';
static const String offlineQueueBoxName = 'chat_offline_queue';
// Configurations
static const int defaultMessagePageSize = 50;
static const int maxAttachmentSizeMB = 10;
static const int maxMessageLength = 5000;
static const Duration typingIndicatorTimeout = Duration(seconds: 3);
}

View File

@@ -1,166 +0,0 @@
import 'package:flutter/material.dart';
import '../chat.dart';
/// Exemple d'intégration du service MQTT dans l'application
///
/// Montre comment initialiser et utiliser le service de notifications MQTT
class MqttIntegrationExample extends StatefulWidget {
const MqttIntegrationExample({super.key});
@override
State<MqttIntegrationExample> createState() => _MqttIntegrationExampleState();
}
class _MqttIntegrationExampleState extends State<MqttIntegrationExample> {
late final MqttNotificationService _notificationService;
bool _isInitialized = false;
String _status = 'Non initialisé';
@override
void initState() {
super.initState();
_initializeMqttService();
}
Future<void> _initializeMqttService() async {
try {
// Initialiser le service avec la configuration
_notificationService = MqttNotificationService(
mqttHost: MqttConfig.host,
mqttPort: MqttConfig.port,
mqttUsername: MqttConfig.username,
mqttPassword: MqttConfig.password,
);
// Configurer les callbacks
_notificationService.onMessageTap = (messageId) {
debugPrint('Notification tapée : $messageId');
// Naviguer vers la conversation correspondante
_navigateToMessage(messageId);
};
_notificationService.onNotificationReceived = (data) {
debugPrint('Notification reçue : $data');
setState(() {
_status = 'Notification reçue : ${data['content']}';
});
};
// Initialiser avec l'ID utilisateur (récupéré du UserRepository)
final userId = _getCurrentUserId(); // À implémenter selon votre logique
await _notificationService.initialize(userId: userId);
setState(() {
_isInitialized = true;
_status = 'Service MQTT initialisé';
});
} catch (e) {
setState(() {
_status = 'Erreur : $e';
});
}
}
String _getCurrentUserId() {
// Dans votre application réelle, vous récupéreriez l'ID utilisateur
// depuis le UserRepository ou le contexte de l'application
return '123'; // Exemple
}
void _navigateToMessage(String messageId) {
// Implémenter la navigation vers le message
// Par exemple :
// Navigator.push(context, MaterialPageRoute(
// builder: (_) => ChatScreen(messageId: messageId),
// ));
}
@override
void dispose() {
_notificationService.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Test MQTT Notifications'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
_status,
style: Theme.of(context).textTheme.headlineSmall,
textAlign: TextAlign.center,
),
const SizedBox(height: 20),
if (_isInitialized) ...[
ElevatedButton(
onPressed: () {
_notificationService.pauseNotifications();
setState(() {
_status = 'Notifications en pause';
});
},
child: const Text('Pause Notifications'),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: () {
_notificationService.resumeNotifications();
setState(() {
_status = 'Notifications actives';
});
},
child: const Text('Reprendre Notifications'),
),
const SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
// Exemple de test en publiant un message
await _notificationService.publishMessage(
'chat/user/${_getCurrentUserId()}/messages',
{
'type': 'chat_message',
'messageId':
'test_${DateTime.now().millisecondsSinceEpoch}',
'content': 'Message de test',
'senderId': '999',
'senderName': 'Système',
},
);
setState(() {
_status = 'Message test envoyé';
});
},
child: const Text('Envoyer Message Test'),
),
] else ...[
const CircularProgressIndicator(),
],
],
),
),
);
}
}
/// Exemple d'intégration dans le main.dart de votre application
void mainExample() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: MqttIntegrationExample(),
);
}
}

View File

@@ -0,0 +1,118 @@
/// Exemple d'utilisation du module chat
///
/// Ce fichier montre comment intégrer le module chat dans votre application
import 'package:flutter/material.dart';
import 'chat_module.dart';
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Chat Module Example',
home: const HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool _isInitialized = false;
@override
void initState() {
super.initState();
_initChat();
}
Future<void> _initChat() async {
// Initialiser le module chat avec vos paramètres et rôle
await ChatModule.init(
apiUrl: 'https://api.votre-domaine.com',
userId: 123, // ID de l'utilisateur connecté
userName: 'Jean Dupont', // Nom de l'utilisateur
userRole: 2, // Rôle: 1=membre, 2=admin amicale, 9=superadmin
userEntite: 5, // ID de l'amicale/entité (optionnel)
authToken: 'votre-token-jwt', // Token d'authentification (optionnel)
);
setState(() => _isInitialized = true);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Application Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('Bienvenue dans votre application'),
const SizedBox(height: 20),
if (_isInitialized)
ElevatedButton(
onPressed: () {
// Ouvrir le chat
ChatModule.openChat(context);
},
child: const Text('Ouvrir le Chat'),
)
else
const CircularProgressIndicator(),
],
),
),
);
}
@override
void dispose() {
// Nettoyer les ressources du chat
ChatModule.dispose();
super.dispose();
}
}
/// Comment l'utiliser dans votre application :
///
/// 1. Copier le dossier lib/chat dans votre projet
///
/// 2. Ajouter les dépendances dans pubspec.yaml :
/// dependencies:
/// dio: ^5.4.0
/// hive: ^2.2.3
/// hive_flutter: ^1.1.0
/// dev_dependencies:
/// hive_generator: ^2.0.1
/// build_runner: ^2.4.8
///
/// 3. Initialiser le module au démarrage :
/// await ChatModule.init(
/// apiUrl: 'https://votre-api.com',
/// userId: currentUserId,
/// userName: currentUserName,
/// userRole: currentUserRole, // 1, 2 ou 9
/// userEntite: currentUserEntite, // ID amicale
/// authToken: authToken,
/// );
///
/// 4. Ouvrir le chat depuis n'importe où :
/// ChatModule.openChat(context);
///
/// 5. Ou naviguer directement vers une conversation :
/// Navigator.push(
/// context,
/// MaterialPageRoute(
/// builder: (_) => ChatModule.getChatPage(roomId, roomTitle),
/// ),
/// );

View File

@@ -1,104 +0,0 @@
import 'package:hive/hive.dart';
import 'package:equatable/equatable.dart';
part 'anonymous_user_model.g.dart';
/// Modèle d'utilisateur anonyme pour le système de chat
///
/// Ce modèle représente un utilisateur anonyme (pour le cas Resalice)
/// et permet de tracker sa conversion éventuelle en utilisateur authentifié
@HiveType(typeId: 23)
class AnonymousUserModel extends HiveObject with EquatableMixin {
@HiveField(0)
final String id;
@HiveField(1)
final String deviceId;
@HiveField(2)
final String? name;
@HiveField(3)
final String? email;
@HiveField(4)
final DateTime createdAt;
@HiveField(5)
final String? convertedToUserId;
@HiveField(6)
final Map<String, dynamic>? metadata;
AnonymousUserModel({
required this.id,
required this.deviceId,
this.name,
this.email,
required this.createdAt,
this.convertedToUserId,
this.metadata,
});
/// Crée une instance depuis le JSON
factory AnonymousUserModel.fromJson(Map<String, dynamic> json) {
return AnonymousUserModel(
id: json['id'] as String,
deviceId: json['device_id'] as String,
name: json['name'] as String?,
email: json['email'] as String?,
createdAt: DateTime.parse(json['created_at'] as String),
convertedToUserId: json['converted_to_user_id'] as String?,
metadata: json['metadata'] as Map<String, dynamic>?,
);
}
/// Convertit l'instance en JSON
Map<String, dynamic> toJson() {
return {
'id': id,
'device_id': deviceId,
'name': name,
'email': email,
'created_at': createdAt.toIso8601String(),
'converted_to_user_id': convertedToUserId,
'metadata': metadata,
};
}
/// Crée une copie modifiée de l'instance
AnonymousUserModel copyWith({
String? id,
String? deviceId,
String? name,
String? email,
DateTime? createdAt,
String? convertedToUserId,
Map<String, dynamic>? metadata,
}) {
return AnonymousUserModel(
id: id ?? this.id,
deviceId: deviceId ?? this.deviceId,
name: name ?? this.name,
email: email ?? this.email,
createdAt: createdAt ?? this.createdAt,
convertedToUserId: convertedToUserId ?? this.convertedToUserId,
metadata: metadata ?? this.metadata,
);
}
/// Vérifie si l'utilisateur a été converti en utilisateur authentifié
bool get isConverted => convertedToUserId != null;
@override
List<Object?> get props => [
id,
deviceId,
name,
email,
createdAt,
convertedToUserId,
metadata,
];
}

View File

@@ -1,138 +0,0 @@
import 'package:hive/hive.dart';
import 'package:equatable/equatable.dart';
part 'audience_target_model.g.dart';
/// Modèle de cible d'audience pour le système de chat
///
/// Ce modèle représente une cible d'audience pour les annonces et broadcasts
/// Il supporte maintenant le ciblage combiné avec les filtres de rôle et d'entité
@HiveType(typeId: 24)
class AudienceTargetModel extends HiveObject with EquatableMixin {
@HiveField(0)
final String id;
@HiveField(1)
final String conversationId;
@HiveField(2)
final String targetType;
@HiveField(3)
final String? targetId;
@HiveField(4)
final DateTime createdAt;
@HiveField(5)
final String? roleFilter;
@HiveField(6)
final String? entityFilter;
AudienceTargetModel({
required this.id,
required this.conversationId,
required this.targetType,
this.targetId,
required this.createdAt,
this.roleFilter,
this.entityFilter,
});
/// Crée une instance depuis le JSON
factory AudienceTargetModel.fromJson(Map<String, dynamic> json) {
return AudienceTargetModel(
id: json['id'] as String,
conversationId: json['conversation_id'] as String,
targetType: json['target_type'] as String,
targetId: json['target_id'] as String?,
createdAt: DateTime.parse(json['created_at'] as String),
roleFilter: json['role_filter'] as String?,
entityFilter: json['entity_filter'] as String?,
);
}
/// Convertit l'instance en JSON
Map<String, dynamic> toJson() {
return {
'id': id,
'conversation_id': conversationId,
'target_type': targetType,
'target_id': targetId,
'created_at': createdAt.toIso8601String(),
'role_filter': roleFilter,
'entity_filter': entityFilter,
};
}
/// Crée une copie modifiée de l'instance
AudienceTargetModel copyWith({
String? id,
String? conversationId,
String? targetType,
String? targetId,
DateTime? createdAt,
String? roleFilter,
String? entityFilter,
}) {
return AudienceTargetModel(
id: id ?? this.id,
conversationId: conversationId ?? this.conversationId,
targetType: targetType ?? this.targetType,
targetId: targetId ?? this.targetId,
createdAt: createdAt ?? this.createdAt,
roleFilter: roleFilter ?? this.roleFilter,
entityFilter: entityFilter ?? this.entityFilter,
);
}
/// Vérifie si l'utilisateur est ciblé par cette règle
bool targetsUser({
required String userId,
required int userRole,
required String userEntityId,
}) {
switch (targetType) {
case 'all':
return true;
case 'role':
if (roleFilter != null && roleFilter != 'all') {
return userRole.toString() == roleFilter;
}
return true;
case 'entity':
if (entityFilter != null && entityFilter != 'all') {
return userEntityId == entityFilter;
}
return true;
case 'combined':
bool matchesRole = true;
bool matchesEntity = true;
if (roleFilter != null && roleFilter != 'all') {
matchesRole = userRole.toString() == roleFilter;
}
if (entityFilter != null && entityFilter != 'all') {
matchesEntity = userEntityId == entityFilter;
}
return matchesRole && matchesEntity;
default:
return false;
}
}
@override
List<Object?> get props => [
id,
conversationId,
targetType,
targetId,
createdAt,
roleFilter,
entityFilter,
];
}

View File

@@ -1,15 +0,0 @@
// Fichier central pour regrouper tous les adaptateurs Hive du module chat
// Exports des modèles et leurs adaptateurs
export 'conversation_model.dart';
export 'message_model.dart';
export 'participant_model.dart';
export 'anonymous_user_model.dart';
export 'audience_target_model.dart';
export 'notification_settings.dart';
// Fonction pour enregistrer tous les adaptateurs Hive du chat
Future<void> registerChatHiveAdapters() async {
// Les adaptateurs sont déjà générés dans les fichiers .g.dart
// Ils sont automatiquement enregistrés lors de l'appel de registerAdapter
}

View File

@@ -1,104 +0,0 @@
import 'package:equatable/equatable.dart';
/// Configuration du module chat
///
/// Permet d'adapter le comportement du chat selon l'application
/// (Geosector ou Resalice)
class ChatConfig with EquatableMixin {
/// Active/désactive les annonces
final bool enableAnnouncements;
/// Active/désactive la sélection de cibles pour les annonces
final bool enableTargetSelection;
/// Active/désactive les statistiques des annonces
final bool showAnnouncementStats;
/// Permission de réponse par défaut
final String defaultReplyPermission;
/// Active/désactive les conversations anonymes
final bool enableAnonymousConversations;
/// Active/désactive les conversations de groupe
final bool enableGroupConversations;
/// Types de conversation autorisés
final List<String> allowedConversationTypes;
/// Taille maximale des fichiers en Mo
final int maxAttachmentSizeMB;
/// Nombre de messages par page
final int messagePageSize;
ChatConfig({
this.enableAnnouncements = true,
this.enableTargetSelection = true,
this.showAnnouncementStats = true,
this.defaultReplyPermission = 'none',
this.enableAnonymousConversations = false,
this.enableGroupConversations = true,
this.allowedConversationTypes = const [
'one_to_one',
'group',
'announcement',
'broadcast'
],
this.maxAttachmentSizeMB = 10,
this.messagePageSize = 50,
});
/// Configuration par défaut pour Geosector
factory ChatConfig.geosector() {
return ChatConfig(
enableAnnouncements: true,
enableTargetSelection: true,
showAnnouncementStats: true,
defaultReplyPermission: 'none',
enableAnonymousConversations: false,
enableGroupConversations: true,
allowedConversationTypes: const [
'one_to_one',
'group',
'announcement',
'broadcast'
],
);
}
/// Configuration par défaut pour Resalice
factory ChatConfig.resalice() {
return ChatConfig(
enableAnnouncements: false,
enableTargetSelection: false,
showAnnouncementStats: false,
defaultReplyPermission: 'all',
enableAnonymousConversations: true,
enableGroupConversations: false,
allowedConversationTypes: const [
'one_to_one',
'anonymous'
],
);
}
/// Vérifie si un type de conversation est autorisé
bool isConversationTypeAllowed(String type) {
return allowedConversationTypes.contains(type);
}
@override
List<Object?> get props => [
enableAnnouncements,
enableTargetSelection,
showAnnouncementStats,
defaultReplyPermission,
enableAnonymousConversations,
enableGroupConversations,
allowedConversationTypes,
maxAttachmentSizeMB,
messagePageSize,
];
}

View File

@@ -1,139 +0,0 @@
import 'package:hive/hive.dart';
import 'package:equatable/equatable.dart';
import 'participant_model.dart';
part 'conversation_model.g.dart';
/// Modèle de conversation pour le système de chat
///
/// Ce modèle représente une conversation entre utilisateurs
/// Il supporte différents types de conversations :
/// - one_to_one : conversation privée entre 2 utilisateurs
/// - group : groupe de plusieurs utilisateurs
/// - anonymous : conversation avec un utilisateur anonyme
/// - broadcast : message diffusé à plusieurs utilisateurs
/// - announcement : annonce officielle
@HiveType(typeId: 20)
class ConversationModel extends HiveObject with EquatableMixin {
@HiveField(0)
final String id;
@HiveField(1)
final String type;
@HiveField(2)
final String? title;
@HiveField(3)
final DateTime createdAt;
@HiveField(4)
final DateTime updatedAt;
@HiveField(5)
final List<ParticipantModel> participants;
@HiveField(6)
final bool isSynced;
@HiveField(7)
final String replyPermission;
@HiveField(8)
final bool isPinned;
@HiveField(9)
final DateTime? expiryDate;
ConversationModel({
required this.id,
required this.type,
this.title,
required this.createdAt,
required this.updatedAt,
required this.participants,
this.isSynced = false,
this.replyPermission = 'all',
this.isPinned = false,
this.expiryDate,
});
/// Crée une instance depuis le JSON
factory ConversationModel.fromJson(Map<String, dynamic> json) {
return ConversationModel(
id: json['id'] as String,
type: json['type'] as String,
title: json['title'] as String?,
createdAt: DateTime.parse(json['created_at'] as String),
updatedAt: DateTime.parse(json['updated_at'] as String),
participants: (json['participants'] as List?)
?.map((e) => ParticipantModel.fromJson(e as Map<String, dynamic>))
.toList() ??
[],
isSynced: json['is_synced'] as bool? ?? false,
replyPermission: json['reply_permission'] as String? ?? 'all',
isPinned: json['is_pinned'] as bool? ?? false,
expiryDate: json['expiry_date'] != null
? DateTime.parse(json['expiry_date'] as String)
: null,
);
}
/// Convertit l'instance en JSON
Map<String, dynamic> toJson() {
return {
'id': id,
'type': type,
'title': title,
'created_at': createdAt.toIso8601String(),
'updated_at': updatedAt.toIso8601String(),
'participants': participants.map((e) => e.toJson()).toList(),
'is_synced': isSynced,
'reply_permission': replyPermission,
'is_pinned': isPinned,
'expiry_date': expiryDate?.toIso8601String(),
};
}
/// Crée une copie modifiée de l'instance
ConversationModel copyWith({
String? id,
String? type,
String? title,
DateTime? createdAt,
DateTime? updatedAt,
List<ParticipantModel>? participants,
bool? isSynced,
String? replyPermission,
bool? isPinned,
DateTime? expiryDate,
}) {
return ConversationModel(
id: id ?? this.id,
type: type ?? this.type,
title: title ?? this.title,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
participants: participants ?? this.participants,
isSynced: isSynced ?? this.isSynced,
replyPermission: replyPermission ?? this.replyPermission,
isPinned: isPinned ?? this.isPinned,
expiryDate: expiryDate ?? this.expiryDate,
);
}
@override
List<Object?> get props => [
id,
type,
title,
createdAt,
updatedAt,
participants,
isSynced,
replyPermission,
isPinned,
expiryDate,
];
}

View File

@@ -1,68 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'conversation_model.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class ConversationModelAdapter extends TypeAdapter<ConversationModel> {
@override
final int typeId = 20;
@override
ConversationModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return ConversationModel(
id: fields[0] as String,
type: fields[1] as String,
title: fields[2] as String?,
createdAt: fields[3] as DateTime,
updatedAt: fields[4] as DateTime,
participants: (fields[5] as List).cast<ParticipantModel>(),
isSynced: fields[6] as bool,
replyPermission: fields[7] as String,
isPinned: fields[8] as bool,
expiryDate: fields[9] as DateTime?,
);
}
@override
void write(BinaryWriter writer, ConversationModel obj) {
writer
..writeByte(10)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.type)
..writeByte(2)
..write(obj.title)
..writeByte(3)
..write(obj.createdAt)
..writeByte(4)
..write(obj.updatedAt)
..writeByte(5)
..write(obj.participants)
..writeByte(6)
..write(obj.isSynced)
..writeByte(7)
..write(obj.replyPermission)
..writeByte(8)
..write(obj.isPinned)
..writeByte(9)
..write(obj.expiryDate);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is ConversationModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

Some files were not shown because too many files have changed in this diff Show More