feat(app): clean architecture with typed repositories, DTO models and calendar event logos

This commit is contained in:
2026-08-15 01:03:22 +02:00
parent f08fecde23
commit 15f8f7896e
34 changed files with 1435 additions and 1420 deletions
@@ -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);
},