From 3b91e5132e179a7efd6e003ee1006892cb134d73 Mon Sep 17 00:00:00 2001 From: Byackee Date: Thu, 21 Nov 2024 22:38:57 +0100 Subject: [PATCH] V1.4.1 --- lib/api/data_manager.dart | 155 ++++++++++++++----------- lib/pages/Statistics/wallet_stats.dart | 113 +++++++++++++----- lib/settings/settings_page.dart | 5 +- lib/structure/drawer.dart | 33 +++--- pubspec.yaml | 2 +- 5 files changed, 189 insertions(+), 119 deletions(-) diff --git a/lib/api/data_manager.dart b/lib/api/data_manager.dart index d804d07..b4b0216 100644 --- a/lib/api/data_manager.dart +++ b/lib/api/data_manager.dart @@ -1415,90 +1415,111 @@ class DataManager extends ChangeNotifier { } Future archiveRoiValue(double roiValue) async { - var box = Hive.box('roiValueArchive'); // Ouvrir une nouvelle boîte dédiée + try { + var box = Hive.box('roiValueArchive'); // Ouvrir une nouvelle boîte dédiée + + // Charger l'historique existant depuis Hive + List? roiHistoryJson = box.get('roi_history'); + List roiHistory = + roiHistoryJson != null ? roiHistoryJson.map((recordJson) => RoiRecord.fromJson(Map.from(recordJson))).toList() : []; + + // Vérifier le dernier enregistrement + if (roiHistory.isNotEmpty) { + RoiRecord lastRecord = roiHistory.last; + DateTime lastTimestamp = lastRecord.timestamp; + + // Vérifier si la différence est inférieure à 1 heure + if (DateTime.now().difference(lastTimestamp).inHours < 1) { + // Si moins d'une heure, ne rien faire + logger.i('Dernière archive récente, aucun nouvel enregistrement ajouté.'); + return; // Sortir de la fonction sans ajouter d'enregistrement + } + } - // Charger l'historique existant depuis Hive - List? roiHistoryJson = box.get('roi_history'); - List roiHistory = - roiHistoryJson != null ? roiHistoryJson.map((recordJson) => RoiRecord.fromJson(Map.from(recordJson))).toList() : []; + // Ajouter le nouvel enregistrement à l'historique + RoiRecord newRecord = RoiRecord( + roi: double.parse(roiValue.toStringAsFixed(3)), // S'assurer que roi est un double + timestamp: DateTime.now(), + ); + roiHistory.add(newRecord); - // Vérifier le dernier enregistrement - if (roiHistory.isNotEmpty) { - RoiRecord lastRecord = roiHistory.last; - DateTime lastTimestamp = lastRecord.timestamp; + // Sauvegarder la liste mise à jour dans Hive + List> roiHistoryJsonToSave = roiHistory.map((record) => record.toJson()).toList(); - // Vérifier si la différence est inférieure à 1 heure - logger.w(DateTime.now().difference(lastTimestamp).inHours); - if (DateTime.now().difference(lastTimestamp).inHours < 1) { - // Si moins d'une heure, ne rien faire - return; // Sortir de la fonction sans ajouter d'enregistrement - } + await box.put('roi_history', roiHistoryJsonToSave); // Stocker dans la nouvelle boîte + logger.i('Nouvel enregistrement ROI ajouté et sauvegardé avec succès.'); + } catch (e) { + logger.w('Erreur lors de l\'archivage de la valeur ROI : $e'); } - - // Ajouter le nouvel enregistrement à l'historique - RoiRecord newRecord = RoiRecord( - roi: double.parse(roiValue.toStringAsFixed(3)), - timestamp: DateTime.now(), - ); - roiHistory.add(newRecord); - - // Sauvegarder la liste mise à jour dans Hive - List> roiHistoryJsonToSave = roiHistory.map((record) => record.toJson()).toList(); - await box.put('roi_history', roiHistoryJsonToSave); // Stocker dans la nouvelle boîte } Future archiveApyValue(double netApyValue, double grossApyValue) async { - var box = Hive.box('apyValueArchive'); // Ouvrir une nouvelle boîte dédiée + try { + var box = Hive.box('apyValueArchive'); // Ouvrir une nouvelle boîte dédiée + + // Charger l'historique existant depuis Hive + List? apyHistoryJson = box.get('apy_history'); + List apyHistory = + apyHistoryJson != null ? apyHistoryJson.map((recordJson) => ApyRecord.fromJson(Map.from(recordJson))).toList() : []; + + // Vérifier le dernier enregistrement + if (apyHistory.isNotEmpty) { + ApyRecord lastRecord = apyHistory.last; + DateTime lastTimestamp = lastRecord.timestamp; + + // Vérifier si la différence est inférieure à 1 heure + if (DateTime.now().difference(lastTimestamp).inHours < 1) { + // Si moins d'une heure, ne rien faire + logger.i('Dernier enregistrement récent, aucun nouvel enregistrement ajouté.'); + return; // Sortir de la fonction + } + } - // Charger l'historique existant depuis Hive - List? apyHistoryJson = box.get('apy_history'); - List apyHistory = - apyHistoryJson != null ? apyHistoryJson.map((recordJson) => ApyRecord.fromJson(Map.from(recordJson))).toList() : []; + // Ajouter un nouvel enregistrement avec des valeurs formatées en double + ApyRecord newRecord = ApyRecord( + netApy: double.parse(netApyValue.toStringAsFixed(3)), // Conversion en double avec précision + grossApy: double.parse(grossApyValue.toStringAsFixed(3)), // Conversion en double avec précision + timestamp: DateTime.now(), + ); + apyHistory.add(newRecord); - // Vérifier le dernier enregistrement - if (apyHistory.isNotEmpty) { - ApyRecord lastRecord = apyHistory.last; - DateTime lastTimestamp = lastRecord.timestamp; + // Sauvegarder dans Hive + List> apyHistoryJsonToSave = apyHistory.map((record) => record.toJson()).toList(); + await box.put('apy_history', apyHistoryJsonToSave); - // Vérifier si la différence est inférieure à 1 heure - if (DateTime.now().difference(lastTimestamp).inHours < 1) { - // Si moins d'une heure, ne rien faire - return; - } + logger.i('Nouvel enregistrement APY ajouté et sauvegardé avec succès.'); + } catch (e) { + logger.w('Erreur lors de l\'archivage des valeurs APY : $e'); } + } - // Ajouter un nouvel enregistrement - ApyRecord newRecord = ApyRecord( - netApy: double.parse(netApyValue.toStringAsFixed(3)), - grossApy: double.parse(grossApyValue.toStringAsFixed(3)), - timestamp: DateTime.now(), - ); - apyHistory.add(newRecord); + Future archiveBalance(String tokenType, double balance, String timestamp) async { + try { + var box = Hive.box('balanceHistory'); // Boîte Hive pour stocker les balances - // Sauvegarder dans Hive - List> apyHistoryJsonToSave = apyHistory.map((record) => record.toJson()).toList(); - await box.put('apy_history', apyHistoryJsonToSave); - } + // Charger l'historique existant depuis Hive + List? balanceHistoryJson = box.get('balanceHistory_$tokenType'); + List balanceHistory = + balanceHistoryJson != null ? balanceHistoryJson.map((recordJson) => BalanceRecord.fromJson(Map.from(recordJson))).toList() : []; - void archiveBalance(String tokenType, double balance, String timestamp) async { - var box = Hive.box('balanceHistory'); // Boîte Hive pour stocker les balances + // Créer un nouvel enregistrement avec une balance formatée + BalanceRecord newRecord = BalanceRecord( + tokenType: tokenType, + balance: double.parse(balance.toStringAsFixed(3)), // Garantir une balance au format double + timestamp: DateTime.parse(timestamp), + ); - // Charger l'historique existant depuis Hive - List? balanceHistoryJson = box.get('balanceHistory_$tokenType'); - List balanceHistory = - balanceHistoryJson != null ? balanceHistoryJson.map((recordJson) => BalanceRecord.fromJson(Map.from(recordJson))).toList() : []; + // Ajouter le nouvel enregistrement + balanceHistory.add(newRecord); - // Ajouter le nouvel enregistrement à l'historique - BalanceRecord newRecord = BalanceRecord( - tokenType: tokenType, - balance: balance, - timestamp: DateTime.parse(timestamp), - ); - balanceHistory.add(newRecord); + // Sauvegarder la liste mise à jour dans Hive + List> balanceHistoryJsonToSave = balanceHistory.map((record) => record.toJson()).toList(); + await box.put('balanceHistory_$tokenType', balanceHistoryJsonToSave); - // Sauvegarder la liste mise à jour dans Hive - List> balanceHistoryJsonToSave = balanceHistory.map((record) => record.toJson()).toList(); - await box.put('balanceHistory_$tokenType', balanceHistoryJsonToSave); // Stocker chaque type de token séparément + logger.i('Nouvelle balance ajoutée et sauvegardée avec succès pour $tokenType.'); + } catch (e) { + logger.w('Erreur lors de l\'archivage de la balance pour $tokenType : $e'); + } } Future calculateAPY(String tokenType) async { diff --git a/lib/pages/Statistics/wallet_stats.dart b/lib/pages/Statistics/wallet_stats.dart index 2d43983..a771b0b 100644 --- a/lib/pages/Statistics/wallet_stats.dart +++ b/lib/pages/Statistics/wallet_stats.dart @@ -269,11 +269,14 @@ class _WalletStats extends State { getTitlesWidget: (value, meta) { List labels = _buildDateLabels(convertedData); if (value.toInt() >= 0 && value.toInt() < labels.length) { - return Transform.rotate( - angle: -0.5, - child: Text( - labels[value.toInt()], - style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + return Padding( + padding: const EdgeInsets.only(top: 10.0), // Décalage vers le bas + child: Transform.rotate( + angle: -0.5, + child: Text( + labels[value.toInt()], + style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + ), ), ); } else { @@ -283,7 +286,15 @@ class _WalletStats extends State { ), ), ), - borderData: FlBorderData(show: false), + borderData: FlBorderData( + show: true, // Affiche les bordures + border: Border( + left: BorderSide(color: Colors.transparent), // Axe gauche + bottom: BorderSide(color: Colors.blueGrey.shade700, width: 0.5), // Axe bas + right: BorderSide(color: Colors.transparent), // Masque l'axe droit + top: BorderSide(color: Colors.transparent), // Masque l'axe supérieur + ), + ), minX: 0, maxX: (convertedData.length - 1).toDouble(), lineBarsData: [ @@ -414,11 +425,14 @@ class _WalletStats extends State { // Vérifie si l'indice est valide if (value.toInt() >= 0 && value.toInt() < labels.length) { - return Transform.rotate( - angle: -0.5, // Inclinaison optionnelle des étiquettes - child: Text( - labels[value.toInt()], - style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + return Padding( + padding: const EdgeInsets.only(top: 10.0), // Décalage vers le bas + child: Transform.rotate( + angle: -0.5, + child: Text( + labels[value.toInt()], + style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + ), ), ); } else { @@ -431,7 +445,15 @@ class _WalletStats extends State { sideTitles: SideTitles(showTitles: false), ), ), - borderData: FlBorderData(show: false), + borderData: FlBorderData( + show: true, // Affiche les bordures + border: Border( + left: BorderSide(color: Colors.transparent), // Axe gauche + bottom: BorderSide(color: Colors.blueGrey.shade700, width: 0.5), // Axe bas + right: BorderSide(color: Colors.transparent), // Masque l'axe droit + top: BorderSide(color: Colors.transparent), // Masque l'axe supérieur + ), + ), minX: 0, maxX: (walletBalanceData.length - 1).toDouble(), minY: 0, // Définit la valeur minimale de l'axe de gauche à 0 @@ -558,11 +580,14 @@ class _WalletStats extends State { // Vérifie si l'indice est valide if (value.toInt() >= 0 && value.toInt() < labels.length) { - return Transform.rotate( - angle: -0.5, // Optionnel : incliner les étiquettes si elles sont longues - child: Text( - labels[value.toInt()], - style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + return Padding( + padding: const EdgeInsets.only(top: 10.0), // Décalage vers le bas + child: Transform.rotate( + angle: -0.5, + child: Text( + labels[value.toInt()], + style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + ), ), ); } else { @@ -577,7 +602,15 @@ class _WalletStats extends State { sideTitles: SideTitles(showTitles: false), ), ), - borderData: FlBorderData(show: false), + borderData: FlBorderData( + show: true, // Affiche les bordures + border: Border( + left: BorderSide(color: Colors.transparent), // Axe gauche + bottom: BorderSide(color: Colors.blueGrey.shade700, width: 0.5), // Axe bas + right: BorderSide(color: Colors.transparent), // Masque l'axe droit + top: BorderSide(color: Colors.transparent), // Masque l'axe supérieur + ), + ), minX: 0, maxX: (roiHistoryData.length - 1).toDouble(), minY: 0, // Définit la valeur minimale de l'axe de gauche à 0 @@ -678,7 +711,7 @@ class _WalletStats extends State { titlesData: FlTitlesData( leftTitles: AxisTitles( sideTitles: SideTitles( - showTitles: true, + showTitles: true, // Afficher les titres à gauche reservedSize: 45, getTitlesWidget: (value, meta) { return Text( @@ -694,11 +727,14 @@ class _WalletStats extends State { getTitlesWidget: (value, meta) { List labels = _buildDateLabelsForApy(dataManager); if (value.toInt() >= 0 && value.toInt() < labels.length) { - return Transform.rotate( - angle: -0.5, - child: Text( - labels[value.toInt()], - style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + return Padding( + padding: const EdgeInsets.only(top: 10.0), // Décalage vers le bas + child: Transform.rotate( + angle: -0.5, + child: Text( + labels[value.toInt()], + style: TextStyle(fontSize: 10 + appState.getTextSizeOffset()), + ), ), ); } else { @@ -708,16 +744,24 @@ class _WalletStats extends State { ), ), topTitles: AxisTitles( - sideTitles: SideTitles(showTitles: false), + sideTitles: SideTitles(showTitles: false), // Masquer les titres en haut ), rightTitles: AxisTitles( - sideTitles: SideTitles(showTitles: false), + sideTitles: SideTitles(showTitles: false), // Masquer les titres à droite + ), + ), + borderData: FlBorderData( + show: true, // Affiche les bordures + border: Border( + left: BorderSide(color: Colors.transparent), // Axe gauche + bottom: BorderSide(color: Colors.blueGrey.shade700, width: 0.5), // Axe bas + right: BorderSide(color: Colors.transparent), // Masque l'axe droit + top: BorderSide(color: Colors.transparent), // Masque l'axe supérieur ), ), alignment: BarChartAlignment.center, - borderData: FlBorderData(show: false), barGroups: apyHistoryData, - maxY: 50, + maxY: 20, barTouchData: BarTouchData( touchTooltipData: BarTouchTooltipData( getTooltipItem: (group, groupIndex, rod, rodIndex) { @@ -768,14 +812,19 @@ class _WalletStats extends State { barGroups.add( BarChartGroupData( x: index, + barsSpace: 0, // Supprimer ou réduire l'espace entre les barres dans un groupe barRods: [ BarChartRodData( toY: values['gross']!, - width: 16, - borderRadius: BorderRadius.circular(0), - color: Colors.transparent, + width: 16, // Réduire la largeur des barres + borderRadius: BorderRadius.only( + topLeft: Radius.circular(6), // Rayon pour le haut gauche + topRight: Radius.circular(6), // Rayon pour le haut droit + bottomLeft: Radius.zero, // Pas de rayon pour le bas gauche + bottomRight: Radius.zero, // Pas de rayon pour le bas droit + ), rodStackItems: [ - BarChartRodStackItem(0, values['gross']!, Colors.blue.withOpacity(0.6)), + BarChartRodStackItem(0, values['gross']!, Colors.blue.withOpacity(0.8)), BarChartRodStackItem(0, values['net']!, Colors.green.withOpacity(0.8)), ], ), diff --git a/lib/settings/settings_page.dart b/lib/settings/settings_page.dart index ba640b9..60334b3 100644 --- a/lib/settings/settings_page.dart +++ b/lib/settings/settings_page.dart @@ -98,8 +98,9 @@ class _SettingsPageState extends State { return value.map((key, val) => MapEntry(key, sanitizeValue(val))); } else if (value is List) { return value.map(sanitizeValue).toList(); - } else if (value is num && value.isNaN) { - return 0; // Remplacer NaN par 0 + } else if (value is num) { + // Convertir en double (y compris NaN géré comme 0.0) + return value.isNaN ? 0.0 : value.toDouble(); } return value; } diff --git a/lib/structure/drawer.dart b/lib/structure/drawer.dart index ca6d4d1..bb2ba0f 100644 --- a/lib/structure/drawer.dart +++ b/lib/structure/drawer.dart @@ -77,23 +77,22 @@ class CustomDrawer extends StatelessWidget { ), ), ElevatedButton.icon( - onPressed: () { - Utils.launchURL('https://buymeacoffee.com/byackee'); - }, - icon: Image.asset( - 'assets/bmc.png', // Chemin de votre image dans les assets - height: 24, // Ajustez la taille de l'image - width: 24, - ), - label: Text( - 'buy coffee', - style: TextStyle(fontSize: 14 + textSizeOffset, color: Colors.white), - ), - style: ElevatedButton.styleFrom( - backgroundColor: Colors.blue, - ), -), - + onPressed: () { + Utils.launchURL('https://buymeacoffee.com/byackee'); + }, + icon: Image.asset( + 'assets/bmc.png', // Chemin de votre image dans les assets + height: 24, // Ajustez la taille de l'image + width: 24, + ), + label: Text( + 'buy coffee', + style: TextStyle(fontSize: 14 + textSizeOffset, color: Colors.white), + ), + style: ElevatedButton.styleFrom( + backgroundColor: Colors.blue, + ), + ), ElevatedButton.icon( onPressed: () { _showCryptoAddressDialog(context, textSizeOffset); diff --git a/pubspec.yaml b/pubspec.yaml index cab5941..c3d06bb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,7 +4,7 @@ description: "A community app for RealT" # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.4.0+33 +version: 1.4.1+34 environment: sdk: ^3.5.3