Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
  • Loading branch information
byackee committed Nov 22, 2024
2 parents 45d7e82 + 3b91e51 commit 38fb3f7
Show file tree
Hide file tree
Showing 5 changed files with 189 additions and 119 deletions.
155 changes: 88 additions & 67 deletions lib/api/data_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1415,90 +1415,111 @@ class DataManager extends ChangeNotifier {
}

Future<void> 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<dynamic>? roiHistoryJson = box.get('roi_history');
List<RoiRecord> roiHistory =
roiHistoryJson != null ? roiHistoryJson.map((recordJson) => RoiRecord.fromJson(Map<String, dynamic>.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<dynamic>? roiHistoryJson = box.get('roi_history');
List<RoiRecord> roiHistory =
roiHistoryJson != null ? roiHistoryJson.map((recordJson) => RoiRecord.fromJson(Map<String, dynamic>.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<Map<String, dynamic>> 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<Map<String, dynamic>> roiHistoryJsonToSave = roiHistory.map((record) => record.toJson()).toList();
await box.put('roi_history', roiHistoryJsonToSave); // Stocker dans la nouvelle boîte
}

Future<void> 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<dynamic>? apyHistoryJson = box.get('apy_history');
List<ApyRecord> apyHistory =
apyHistoryJson != null ? apyHistoryJson.map((recordJson) => ApyRecord.fromJson(Map<String, dynamic>.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<dynamic>? apyHistoryJson = box.get('apy_history');
List<ApyRecord> apyHistory =
apyHistoryJson != null ? apyHistoryJson.map((recordJson) => ApyRecord.fromJson(Map<String, dynamic>.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<Map<String, dynamic>> 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<void> 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<Map<String, dynamic>> apyHistoryJsonToSave = apyHistory.map((record) => record.toJson()).toList();
await box.put('apy_history', apyHistoryJsonToSave);
}
// Charger l'historique existant depuis Hive
List<dynamic>? balanceHistoryJson = box.get('balanceHistory_$tokenType');
List<BalanceRecord> balanceHistory =
balanceHistoryJson != null ? balanceHistoryJson.map((recordJson) => BalanceRecord.fromJson(Map<String, dynamic>.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<dynamic>? balanceHistoryJson = box.get('balanceHistory_$tokenType');
List<BalanceRecord> balanceHistory =
balanceHistoryJson != null ? balanceHistoryJson.map((recordJson) => BalanceRecord.fromJson(Map<String, dynamic>.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<Map<String, dynamic>> balanceHistoryJsonToSave = balanceHistory.map((record) => record.toJson()).toList();
await box.put('balanceHistory_$tokenType', balanceHistoryJsonToSave);

// Sauvegarder la liste mise à jour dans Hive
List<Map<String, dynamic>> 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<double> calculateAPY(String tokenType) async {
Expand Down
113 changes: 81 additions & 32 deletions lib/pages/Statistics/wallet_stats.dart
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,14 @@ class _WalletStats extends State<WalletStats> {
getTitlesWidget: (value, meta) {
List<String> 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 {
Expand All @@ -283,7 +286,15 @@ class _WalletStats extends State<WalletStats> {
),
),
),
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: [
Expand Down Expand Up @@ -414,11 +425,14 @@ class _WalletStats extends State<WalletStats> {

// 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 {
Expand All @@ -431,7 +445,15 @@ class _WalletStats extends State<WalletStats> {
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
Expand Down Expand Up @@ -558,11 +580,14 @@ class _WalletStats extends State<WalletStats> {

// 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 {
Expand All @@ -577,7 +602,15 @@ class _WalletStats extends State<WalletStats> {
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
Expand Down Expand Up @@ -678,7 +711,7 @@ class _WalletStats extends State<WalletStats> {
titlesData: FlTitlesData(
leftTitles: AxisTitles(
sideTitles: SideTitles(
showTitles: true,
showTitles: true, // Afficher les titres à gauche
reservedSize: 45,
getTitlesWidget: (value, meta) {
return Text(
Expand All @@ -694,11 +727,14 @@ class _WalletStats extends State<WalletStats> {
getTitlesWidget: (value, meta) {
List<String> 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 {
Expand All @@ -708,16 +744,24 @@ class _WalletStats extends State<WalletStats> {
),
),
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) {
Expand Down Expand Up @@ -768,14 +812,19 @@ class _WalletStats extends State<WalletStats> {
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)),
],
),
Expand Down
5 changes: 3 additions & 2 deletions lib/settings/settings_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ class _SettingsPageState extends State<SettingsPage> {
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;
}
Expand Down
Loading

0 comments on commit 38fb3f7

Please sign in to comment.