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>
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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.
|
||||
@@ -1 +0,0 @@
|
||||
{"version":2,"entries":[{"package":"geosector_app","rootUri":"../","packageUri":"lib/"}]}
|
||||
@@ -0,0 +1 @@
|
||||
/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/dart_build_result.json:
|
||||
@@ -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"]}
|
||||
@@ -0,0 +1 @@
|
||||
{"dependencies":[],"code_assets":[]}
|
||||
@@ -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"]}
|
||||
@@ -0,0 +1 @@
|
||||
{"inputs":[],"outputs":[]}
|
||||
@@ -0,0 +1 @@
|
||||
/home/pierre/dev/geosector/app/.dart_tool/flutter_build/9801dd92544a637fcb18c8ad3c09ddaa/native_assets.json:
|
||||
@@ -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"]}
|
||||
@@ -0,0 +1 @@
|
||||
{"format-version":[1,0,0],"native-assets":{}}
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
@@ -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();
|
||||
|
||||
@@ -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"]}
|
||||
372
app/.dart_tool/flutter_build/dart_plugin_registrant.dart
Normal 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'
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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",
|
||||
|
||||
@@ -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/
|
||||
|
||||
@@ -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",
|
||||
|
||||
339
app/ANDROID-GUIDE.md
Normal 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*
|
||||
@@ -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é
|
||||
|
||||
|
||||
657
app/TODO-APP.md
@@ -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,>
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 79 KiB |
@@ -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>
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 26 KiB |
4
app/android/app/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<color name="ic_launcher_background">#FFFFFF</color>
|
||||
</resources>
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"}}
|
||||
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 6.0 KiB |
|
After Width: | Height: | Size: 3.2 KiB |
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 4.1 KiB |
|
After Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 11 KiB |
@@ -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
@@ -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
|
||||
@@ -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';
|
||||
84
app/lib/chat/chat_config.yaml
Normal 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
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
118
app/lib/chat/example_usage.dart
Normal 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),
|
||||
/// ),
|
||||
/// );
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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,
|
||||
];
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||