feat(App): update Finlytic Flutter app UI and blocs
This commit is contained in:
@@ -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,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user