Files
app-hyggecraftery/lib/screens/home_screen.dart
2026-01-03 15:24:36 +01:00

428 lines
13 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../providers/cart_provider.dart';
import '../providers/user_provider.dart';
import 'products_screen.dart';
import 'product_detail_screen.dart';
import 'cart_screen.dart';
import 'login_screen.dart';
import 'orders_screen.dart';
import 'search_screen.dart';
import 'categories_screen.dart';
import '../widgets/product_card.dart';
import '../services/woocommerce_service.dart';
import '../services/analytics_service.dart';
import '../models/product.dart';
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
final WooCommerceService _wooCommerceService = WooCommerceService();
List<Product> _featuredProducts = [];
bool _isLoading = true;
String? _error;
@override
void initState() {
super.initState();
_loadFeaturedProducts();
}
Future<void> _loadFeaturedProducts() async {
try {
setState(() {
_isLoading = true;
_error = null;
});
final products = await _wooCommerceService.getFeaturedProducts(limit: 6);
// Falls keine Featured Products vorhanden sind, lade normale Produkte
if (products.isEmpty) {
final allProducts = await _wooCommerceService.getProducts(perPage: 6);
setState(() {
_featuredProducts = allProducts;
_isLoading = false;
});
} else {
setState(() {
_featuredProducts = products;
_isLoading = false;
});
}
} catch (e) {
setState(() {
_error = e.toString();
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('HyggeCraftery'),
actions: [
// Such-Button
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SearchScreen(),
),
);
},
),
// Kategorien-Button
IconButton(
icon: const Icon(Icons.category),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const CategoriesScreen(),
),
);
},
),
// Account-Button
Consumer<UserProvider>(
builder: (context, userProvider, child) {
return IconButton(
icon: Icon(
userProvider.isLoggedIn ? Icons.account_circle : Icons.login,
),
onPressed: () {
if (userProvider.isLoggedIn) {
_showAccountMenu(context, userProvider);
} else {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const LoginScreen(),
),
);
}
},
);
},
),
// Warenkorb-Button
Consumer<CartProvider>(
builder: (context, cart, child) {
return Stack(
children: [
IconButton(
icon: const Icon(Icons.shopping_cart),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const CartScreen(),
),
);
},
),
if (cart.itemCount > 0)
Positioned(
right: 8,
top: 8,
child: Container(
padding: const EdgeInsets.all(4),
decoration: const BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
),
constraints: const BoxConstraints(
minWidth: 16,
minHeight: 16,
),
child: Text(
'${cart.itemCount}',
style: const TextStyle(
color: Colors.white,
fontSize: 10,
),
textAlign: TextAlign.center,
),
),
),
],
);
},
),
],
),
body: _buildHomeTab(),
);
}
Widget _buildHomeTab() {
if (_isLoading) {
return const Center(child: CircularProgressIndicator());
}
if (_error != null) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Icon(Icons.error_outline, size: 64, color: Colors.red),
const SizedBox(height: 16),
Text(
'Fehler beim Laden der Produkte',
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 8),
Text(
_error!,
style: Theme.of(context).textTheme.bodyMedium,
textAlign: TextAlign.center,
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: _loadFeaturedProducts,
child: const Text('Erneut versuchen'),
),
],
),
);
}
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// Willkommensbereich
Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
const Color(0xFF8B6F47).withOpacity(0.8),
const Color(0xFFD4A574).withOpacity(0.8),
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Willkommen bei HyggeCraftery',
style: Theme.of(context).textTheme.headlineSmall?.copyWith(
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
Text(
'Entdecke unsere gemütlichen Handwerksprodukte',
style: Theme.of(context).textTheme.bodyLarge?.copyWith(
color: Colors.white.withOpacity(0.9),
),
),
],
),
),
const SizedBox(height: 32),
// Quick Actions
Row(
children: [
Expanded(
child: _buildQuickActionCard(
context,
icon: Icons.search,
title: 'Suchen',
color: Colors.blue,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const SearchScreen(),
),
);
},
),
),
const SizedBox(width: 12),
Expanded(
child: _buildQuickActionCard(
context,
icon: Icons.category,
title: 'Kategorien',
color: Colors.green,
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const CategoriesScreen(),
),
);
},
),
),
],
),
const SizedBox(height: 32),
// Featured Products
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'Ausgewählte Produkte',
style: Theme.of(context).textTheme.headlineSmall?.copyWith(
fontWeight: FontWeight.bold,
color: const Color(0xFF8B6F47),
),
),
TextButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const ProductsScreen(),
),
);
},
child: const Text('Alle anzeigen'),
),
],
),
const SizedBox(height: 16),
if (_featuredProducts.isEmpty)
const Center(
child: Padding(
padding: EdgeInsets.all(32.0),
child: Text('Keine Produkte verfügbar'),
),
)
else
GridView.builder(
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
childAspectRatio: 0.75,
),
itemCount: _featuredProducts.length,
itemBuilder: (context, index) {
return ProductCard(
product: _featuredProducts[index],
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ProductDetailScreen(
product: _featuredProducts[index],
),
),
);
},
);
},
),
],
),
);
}
void _showAccountMenu(BuildContext context, UserProvider userProvider) {
showModalBottomSheet(
context: context,
builder: (context) => Container(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (userProvider.user != null) ...[
ListTile(
leading: const Icon(Icons.person),
title: Text(userProvider.user!.fullName),
subtitle: Text(userProvider.user!.email),
),
const Divider(),
],
ListTile(
leading: const Icon(Icons.shopping_bag),
title: const Text('Meine Bestellungen'),
onTap: () {
Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const OrdersScreen(),
),
);
},
),
const Divider(),
ListTile(
leading: const Icon(Icons.logout, color: Colors.red),
title: const Text('Abmelden', style: TextStyle(color: Colors.red)),
onTap: () async {
await userProvider.logout();
Navigator.pop(context);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Erfolgreich abgemeldet'),
backgroundColor: Colors.green,
),
);
},
),
],
),
),
);
}
Widget _buildQuickActionCard(
BuildContext context, {
required IconData icon,
required String title,
required Color color,
required VoidCallback onTap,
}) {
return Card(
child: InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(12),
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
Icon(icon, size: 32, color: color),
const SizedBox(height: 8),
Text(
title,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.bold,
),
),
],
),
),
),
);
}
}