feat(app): clean architecture with typed repositories, DTO models and calendar event logos
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import '../network/api_client.dart';
|
||||
import '../theme/app_theme.dart';
|
||||
|
||||
@@ -24,7 +25,13 @@ class AssetLogoWidget extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
// Resolve relative URLs (e.g. /api/v1/logo/...) to include host and port (e.g. http://localhost:5000)
|
||||
String? resolveUrl(String? url) {
|
||||
if (url == null || url.isEmpty) return null;
|
||||
if (url == null || url.isEmpty) {
|
||||
final clean = symbolOrName.trim();
|
||||
if (RegExp(r'^[A-Z]{2}[A-Z0-9]{9}[0-9]$').hasMatch(clean)) {
|
||||
return '${ApiClient.baseUrl}/api/v1/logo/$clean';
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (url.startsWith('http://') || url.startsWith('https://')) return url;
|
||||
return url.startsWith('/') ? '${ApiClient.baseUrl}$url' : '${ApiClient.baseUrl}/$url';
|
||||
}
|
||||
@@ -65,12 +72,13 @@ class AssetLogoWidget extends StatelessWidget {
|
||||
return _buildFallback(initial, colors);
|
||||
},
|
||||
)
|
||||
: Image.network(
|
||||
image,
|
||||
: CachedNetworkImage(
|
||||
imageUrl: image,
|
||||
width: size,
|
||||
height: size,
|
||||
fit: BoxFit.contain,
|
||||
errorBuilder: (context, error, stackTrace) {
|
||||
placeholder: (context, url) => _buildFallback(initial, colors),
|
||||
errorWidget: (context, url, error) {
|
||||
_failedUrls.add(image);
|
||||
return _buildFallback(initial, colors);
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user