Commit c145991a authored by Mahmoud Aglan's avatar Mahmoud Aglan

Fix event image field name and outstanding_balance type cast

- Use cover_url (API field) instead of image_url for events
- Add errorBuilder fallback for broken image URLs
- Parse outstanding_balance as int before comparison (API returns string)
Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
parent 9ebfaeab
description: This file stores settings for Dart & Flutter DevTools.
documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states
extensions:
...@@ -27,6 +27,12 @@ class AppTheme { ...@@ -27,6 +27,12 @@ class AppTheme {
useMaterial3: true, useMaterial3: true,
colorScheme: colorScheme, colorScheme: colorScheme,
fontFamily: 'Cairo', fontFamily: 'Cairo',
textTheme: const TextTheme().apply(fontFamily: 'Cairo').copyWith(
bodyLarge: const TextStyle(fontFamily: 'Cairo', height: 1.5),
bodyMedium: const TextStyle(fontFamily: 'Cairo', height: 1.5),
bodySmall: const TextStyle(fontFamily: 'Cairo', height: 1.5),
labelLarge: const TextStyle(fontFamily: 'Cairo', height: 1.4),
),
scaffoldBackgroundColor: const Color(0xFFF8FAFC), scaffoldBackgroundColor: const Color(0xFFF8FAFC),
appBarTheme: AppBarTheme( appBarTheme: AppBarTheme(
backgroundColor: Colors.white, backgroundColor: Colors.white,
...@@ -55,7 +61,8 @@ class AppTheme { ...@@ -55,7 +61,8 @@ class AppTheme {
backgroundColor: primaryColor, backgroundColor: primaryColor,
foregroundColor: Colors.white, foregroundColor: Colors.white,
elevation: 0, elevation: 0,
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 16), minimumSize: const Size(double.infinity, 52),
padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 14),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14), borderRadius: BorderRadius.circular(14),
), ),
...@@ -63,6 +70,7 @@ class AppTheme { ...@@ -63,6 +70,7 @@ class AppTheme {
fontFamily: 'Cairo', fontFamily: 'Cairo',
fontSize: 16, fontSize: 16,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
height: 1.4,
), ),
), ),
), ),
......
...@@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; ...@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_animate/flutter_animate.dart'; import 'package:flutter_animate/flutter_animate.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../core/api/api_service.dart'; import '../../core/api/api_service.dart';
import '../../core/auth/auth_store.dart';
import '../../core/l10n/app_localizations.dart'; import '../../core/l10n/app_localizations.dart';
import '../../core/theme/app_theme.dart'; import '../../core/theme/app_theme.dart';
import '../../core/widgets/loading_overlay.dart'; import '../../core/widgets/loading_overlay.dart';
...@@ -82,13 +83,16 @@ class _EventCard extends StatelessWidget { ...@@ -82,13 +83,16 @@ class _EventCard extends StatelessWidget {
color: AppTheme.primaryColor.withValues(alpha: 0.08), color: AppTheme.primaryColor.withValues(alpha: 0.08),
borderRadius: const BorderRadius.vertical(top: Radius.circular(18)), borderRadius: const BorderRadius.vertical(top: Radius.circular(18)),
), ),
child: event['image_url'] != null child: (event['cover_url'] ?? event['image_url']) != null
? ClipRRect( ? ClipRRect(
borderRadius: const BorderRadius.vertical(top: Radius.circular(18)), borderRadius: const BorderRadius.vertical(top: Radius.circular(18)),
child: Image.network( child: Image.network(
event['image_url'], event['cover_url'] ?? event['image_url'],
width: double.infinity, width: double.infinity,
fit: BoxFit.cover, fit: BoxFit.cover,
errorBuilder: (_, __, ___) => Center(
child: Icon(Icons.event, size: 48, color: AppTheme.primaryColor.withValues(alpha: 0.3)),
),
), ),
) )
: Center( : Center(
...@@ -143,8 +147,33 @@ class _EventCard extends StatelessWidget { ...@@ -143,8 +147,33 @@ class _EventCard extends StatelessWidget {
onPressed: isRegistered onPressed: isRegistered
? null ? null
: () async { : () async {
await ref.read(apiServiceProvider).registerForEvent(event['uuid'], ''); final participants = ref.read(authStoreProvider).participants;
if (participants.isEmpty) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('لا يوجد مشتركين مربوطين بحسابك')),
);
}
return;
}
try {
await ref.read(apiServiceProvider).registerForEvent(
event['uuid'],
participants.first['uuid'] ?? '',
);
ref.invalidate(eventsProvider); ref.invalidate(eventsProvider);
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('تم التسجيل بنجاح')),
);
}
} catch (_) {
if (context.mounted) {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(content: Text('حدث خطأ أثناء التسجيل')),
);
}
}
}, },
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: isRegistered ? Colors.grey.shade200 : AppTheme.primaryColor, backgroundColor: isRegistered ? Colors.grey.shade200 : AppTheme.primaryColor,
......
...@@ -233,7 +233,7 @@ class DashboardScreen extends ConsumerWidget { ...@@ -233,7 +233,7 @@ class DashboardScreen extends ConsumerWidget {
], ],
), ),
), ),
if ((child['outstanding_balance'] ?? 0) > 0) if ((int.tryParse(child['outstanding_balance']?.toString() ?? '0') ?? 0) > 0)
Container( Container(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 10, horizontal: 10,
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'core/l10n/app_localizations.dart'; import 'core/l10n/app_localizations.dart';
import 'core/l10n/locale_provider.dart'; import 'core/l10n/locale_provider.dart';
...@@ -34,8 +35,9 @@ class ElCaptainApp extends ConsumerWidget { ...@@ -34,8 +35,9 @@ class ElCaptainApp extends ConsumerWidget {
supportedLocales: const [Locale('ar'), Locale('en')], supportedLocales: const [Locale('ar'), Locale('en')],
localizationsDelegates: const [ localizationsDelegates: const [
AppLocalizations.delegate, AppLocalizations.delegate,
DefaultMaterialLocalizations.delegate, GlobalMaterialLocalizations.delegate,
DefaultWidgetsLocalizations.delegate, GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
], ],
routerConfig: router, routerConfig: router,
builder: (context, child) { builder: (context, child) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment