refactor: save current workspace state including FinlyticAnalyzer fixes, FinlyticApp trade route alignment, and DTO audit documentation
This commit is contained in:
@@ -1,40 +0,0 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:finlytic_app/features/asset_detail/repositories/asset_repository.dart';
|
||||
import 'asset_detail_event.dart';
|
||||
import 'asset_detail_state.dart';
|
||||
|
||||
class AssetDetailBloc extends Bloc<AssetDetailEvent, AssetDetailState> {
|
||||
final AssetRepository repository;
|
||||
|
||||
AssetDetailBloc({required this.repository}) : super(AssetDetailInitial()) {
|
||||
on<LoadAssetData>(_onLoadAssetData);
|
||||
on<ForceRefreshAssetData>(_onForceRefreshAssetData);
|
||||
}
|
||||
|
||||
Future<void> _onLoadAssetData(LoadAssetData event, Emitter<AssetDetailState> emit) async {
|
||||
emit(AssetDetailLoading());
|
||||
try {
|
||||
final results = await Future.wait([
|
||||
repository.getFundamentalData(event.symbol),
|
||||
repository.getTechnicalAnalysis(event.symbol),
|
||||
]);
|
||||
|
||||
emit(AssetDetailLoaded(
|
||||
fundamentalData: results[0] as dynamic,
|
||||
technicalAnalysis: results[1] as dynamic,
|
||||
));
|
||||
} catch (e) {
|
||||
emit(AssetDetailError("Fehler beim Laden der Asset-Daten."));
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _onForceRefreshAssetData(ForceRefreshAssetData event, Emitter<AssetDetailState> emit) async {
|
||||
try {
|
||||
await repository.forceRefreshFundamentalData(event.symbol);
|
||||
// Optional: re-load after a delay, or rely on MQTT/SignalR to push the new data.
|
||||
} catch (e) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class AssetDetailEvent extends Equatable {
|
||||
const AssetDetailEvent();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class LoadAssetData extends AssetDetailEvent {
|
||||
final String symbol;
|
||||
|
||||
const LoadAssetData(this.symbol);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [symbol];
|
||||
}
|
||||
|
||||
class ForceRefreshAssetData extends AssetDetailEvent {
|
||||
final String symbol;
|
||||
|
||||
const ForceRefreshAssetData(this.symbol);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [symbol];
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:finlytic_app/features/asset_detail/models/fundamental_data_model.dart';
|
||||
import 'package:finlytic_app/features/asset_detail/models/technical_analysis_model.dart';
|
||||
|
||||
abstract class AssetDetailState extends Equatable {
|
||||
const AssetDetailState();
|
||||
|
||||
@override
|
||||
List<Object?> get props => [];
|
||||
}
|
||||
|
||||
class AssetDetailInitial extends AssetDetailState {}
|
||||
|
||||
class AssetDetailLoading extends AssetDetailState {}
|
||||
|
||||
class AssetDetailLoaded extends AssetDetailState {
|
||||
final FundamentalDataModel? fundamentalData;
|
||||
final TechnicalAnalysisModel? technicalAnalysis;
|
||||
|
||||
const AssetDetailLoaded({this.fundamentalData, this.technicalAnalysis});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [fundamentalData, technicalAnalysis];
|
||||
}
|
||||
|
||||
class AssetDetailError extends AssetDetailState {
|
||||
final String message;
|
||||
|
||||
const AssetDetailError(this.message);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [message];
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'asset_header_event.dart';
|
||||
import 'asset_header_state.dart';
|
||||
import '../../repositories/asset_repository.dart';
|
||||
import '../../models/asset_model.dart';
|
||||
|
||||
class AssetHeaderBloc extends Bloc<AssetHeaderEvent, AssetHeaderState> {
|
||||
final AssetRepository repository;
|
||||
@@ -10,8 +11,28 @@ class AssetHeaderBloc extends Bloc<AssetHeaderEvent, AssetHeaderState> {
|
||||
final prevData = state is AssetHeaderLoaded ? (state as AssetHeaderLoaded).data : (state is AssetHeaderLoading ? (state as AssetHeaderLoading).previousData : null);
|
||||
emit(AssetHeaderLoading(previousData: prevData));
|
||||
try {
|
||||
final data = await repository.getAssetHeader(event.isin, exchange: event.exchange, ticker: event.ticker);
|
||||
emit(AssetHeaderLoaded(data));
|
||||
final fundamentals = await repository.getAssetFundamentals(event.isin, event.forceRefresh, ticker: event.ticker);
|
||||
if (fundamentals != null) {
|
||||
final assetModel = AssetModel(
|
||||
isin: fundamentals.isin,
|
||||
symbol: fundamentals.primaryTicker.isNotEmpty ? fundamentals.primaryTicker : fundamentals.isin,
|
||||
name: fundamentals.companyName,
|
||||
currentPrice: fundamentals.currentPrice,
|
||||
currency: fundamentals.tradingCurrency ?? 'EUR',
|
||||
exchange: fundamentals.exchange ?? 'XETRA',
|
||||
exchanges: [], // Can be populated if needed
|
||||
tickers: fundamentals.availableTickers.map((t) => AssetTickerOption(
|
||||
ticker: t.ticker,
|
||||
exchange: t.exchange ?? 'Unknown',
|
||||
tradingCurrency: t.tradingCurrency ?? fundamentals.tradingCurrency ?? 'EUR',
|
||||
currentPrice: t.currentPrice,
|
||||
)).toList(),
|
||||
image: '/api/v1/logo/${fundamentals.isin}',
|
||||
);
|
||||
emit(AssetHeaderLoaded(assetModel));
|
||||
} else {
|
||||
emit(AssetHeaderError('Failed to load asset header data'));
|
||||
}
|
||||
} catch (e) {
|
||||
emit(AssetHeaderError(e.toString()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user