feat(App): update Finlytic Flutter app UI and blocs

This commit is contained in:
2026-08-09 21:01:46 +02:00
parent e7427b7464
commit a708d2977c
591 changed files with 1095105 additions and 0 deletions
@@ -0,0 +1,107 @@
import 'package:flutter/material.dart';
import '../../../core/network/api_client.dart';
import '../../../core/theme/app_theme.dart';
import '../../../core/utils/asset_utils.dart';
import '../../../core/widgets/asset_logo_widget.dart';
import '../../../core/widgets/glass_container.dart';
import '../../../shared/widgets/favorite_star_button.dart';
import '../../asset_detail/views/asset_detail_screen.dart';
import '../models/favorite_asset_model.dart';
/// Watchlist Card item widget for favorited assets displaying brand logo and FavoriteStarButton.
class WatchlistCard extends StatelessWidget {
final FavoriteAssetModel asset;
final ApiClient apiClient;
const WatchlistCard({
super.key,
required this.asset,
required this.apiClient,
});
@override
Widget build(BuildContext context) {
final activeTheme = AppTheme.activePreset;
final symbol = asset.symbol;
final displayName = asset.name.isNotEmpty ? asset.name : AssetUtils.getAssetName(symbol);
final isPositive = asset.change24h >= 0;
return GlassContainer(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => AssetDetailScreen(
symbol: displayName,
apiClient: apiClient,
),
),
);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
AssetLogoWidget(
symbolOrName: asset.isin.isNotEmpty ? asset.isin : displayName,
imageUrl: asset.image.isNotEmpty ? asset.image : null,
size: 32,
),
const SizedBox(width: 10),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
displayName,
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14.5, color: activeTheme.textPrimary),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
if (symbol != displayName)
Text(symbol, style: TextStyle(color: activeTheme.textMuted, fontSize: 10)),
],
),
),
],
),
),
FavoriteStarButton(
identifier: symbol.isNotEmpty ? symbol : displayName,
symbol: displayName,
name: displayName,
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Live Kurs:', style: TextStyle(color: activeTheme.textMuted, fontSize: 12)),
Text('${asset.currentPrice > 0 ? asset.currentPrice.toStringAsFixed(2) : '--.--'}', style: TextStyle(fontWeight: FontWeight.bold, fontSize: 14, color: activeTheme.textPrimary)),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text('Tageswachstum:', style: TextStyle(color: activeTheme.textMuted, fontSize: 12)),
Text(
'${isPositive ? '+' : ''}${asset.change24h.toStringAsFixed(2)}%',
style: TextStyle(
color: isPositive ? AppTheme.primaryEmerald : AppTheme.accentRed,
fontWeight: FontWeight.bold,
fontSize: 13,
),
),
],
),
],
),
);
}
}