refactor: save current workspace state including FinlyticAnalyzer fixes, FinlyticApp trade route alignment, and DTO audit documentation

This commit is contained in:
2026-08-12 18:30:42 +02:00
parent a9553e9fbf
commit 3d8af3940b
163 changed files with 3421 additions and 1751 deletions
@@ -3,7 +3,6 @@ import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../core/network/api_client.dart';
import '../../../core/network/signalr_service.dart';
import '../../../core/utils/asset_utils.dart';
import '../models/favorite_asset_model.dart';
class FavoritesState extends Equatable {
@@ -63,7 +62,8 @@ class FavoritesCubit extends Cubit<FavoritesState> {
Future<void> loadFavorites() async {
emit(state.copyWith(isLoading: true));
try {
final res = await apiClient.get('/api/v1/user/favorites');
final ts = DateTime.now().millisecondsSinceEpoch;
final res = await apiClient.get('/api/v1/user/favorites?_t=$ts');
if (res.statusCode == 200 && res.data is List) {
final rawList = res.data as List;
final set = <String>{};
@@ -71,7 +71,6 @@ class FavoritesCubit extends Cubit<FavoritesState> {
for (var item in rawList) {
final model = FavoriteAssetModel.fromJson(Map<String, dynamic>.from(item));
AssetUtils.registerAsset(model.isin, model.name, model.image);
final key = (model.isin.isNotEmpty ? model.isin : (model.symbol.isNotEmpty ? model.symbol : model.name)).toUpperCase();
if (!dedupMap.containsKey(key)) {
dedupMap[key] = model;
@@ -150,10 +149,21 @@ class FavoritesCubit extends Cubit<FavoritesState> {
Future<void> updateFavoriteTicker(String symbol, String ticker) async {
try {
// Optimistic UI update
final target = symbol.toUpperCase();
final updatedDetails = state.favoriteDetails.map((model) {
if (model.isin.toUpperCase() == target || model.symbol.toUpperCase() == target) {
return model.copyWith(symbol: ticker);
}
return model;
}).toList();
emit(state.copyWith(favoriteDetails: updatedDetails));
await apiClient.post('/api/v1/user/favorites/$symbol/ticker?ticker=$ticker');
await loadFavorites();
} catch (_) {
// Ignore gracefully
// Revert/refresh on error
await loadFavorites();
}
}
}