import 'package:flutter/material.dart';
import '../viewmodel/book_viewmodel.dart';
import 'package:provider/provider.dart';
import '../model/book.dart';
class HomePage extends StatelessWidget {
final TextEditingController titleController = TextEditingController();
final TextEditingController authorController = TextEditingController();
final ColorScheme _colorScheme = ColorScheme.fromSeed(seedColor: Colors.deepPurple);
void _showAddDialog(BuildContext context, BookViewModel vm) {
titleController.clear();
authorController.clear();
showDialog(
context: context,
builder: (_) => AlertDialog(
backgroundColor: _colorScheme.surface,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
title: Text('Ajouter un livre',
style: TextStyle(
fontWeight: FontWeight.bold,
color: _colorScheme.onSurface,
)),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: titleController,
decoration: InputDecoration(
labelText: 'Titre',
labelStyle: TextStyle(color: _colorScheme.onSurface.withOpacity(0.8)),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: _colorScheme.outline),
),
),
),
SizedBox(height: 16),
TextField(
controller: authorController,
decoration: InputDecoration(
labelText: 'Auteur',
labelStyle: TextStyle(color: _colorScheme.onSurface.withOpacity(0.8)),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: _colorScheme.outline),
),
),
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Annuler', style: TextStyle(color: _colorScheme.onSurface)),
),
ElevatedButton(
onPressed: () {
vm.addBook(titleController.text, authorController.text);
Navigator.pop(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: _colorScheme.primary,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12)),
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
),
child: Text('Enregistrer',
style: TextStyle(color: _colorScheme.onPrimary)),
),
],
),
);
}
void _showEditDialog(BuildContext context, BookViewModel vm, Book book) {
titleController.text = book.title;
authorController.text = book.author;
showDialog(
context: context,
builder: (_) => AlertDialog(
backgroundColor: _colorScheme.surface,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
title: Text('Modifier un livre',
style: TextStyle(
fontWeight: FontWeight.bold,
color: _colorScheme.onSurface,
)),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: titleController,
decoration: InputDecoration(
labelText: 'Titre',
labelStyle: TextStyle(color: _colorScheme.onSurface.withOpacity(0.8)),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: _colorScheme.outline),
),
),
),
SizedBox(height: 16),
TextField(
controller: authorController,
decoration: InputDecoration(
labelText: 'Auteur',
labelStyle: TextStyle(color: _colorScheme.onSurface.withOpacity(0.8)),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: _colorScheme.outline),
),
),
),
],
),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: Text('Annuler', style: TextStyle(color: _colorScheme.onSurface)),
),
ElevatedButton(
onPressed: () {
vm.updateBook(book.id, titleController.text, authorController.text);
Navigator.pop(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: _colorScheme.secondary,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12)),
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 12),
),
child: Text('Modifier',
style: TextStyle(color: _colorScheme.onSecondary)),
),
],
),
);
}
@override
Widget build(BuildContext context) {
final vm = Provider.of<BookViewModel>(context);
return Scaffold(
backgroundColor: _colorScheme.background,
appBar: AppBar(
title: Text('Flutter Firestore CRUD',
style: TextStyle(
color: _colorScheme.onPrimary,
fontWeight: FontWeight.w600,
)),
backgroundColor: _colorScheme.primary,
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(
bottom: Radius.circular(16),
),
),
),
body: StreamBuilder<List<Book>>(
stream: vm.books,
builder: (context, snapshot) {
if (snapshot.hasError) return Center(child: Text('Erreur'));
if (!snapshot.hasData) return Center(child: CircularProgressIndicator());
final books = snapshot.data!;
return ListView.builder(
padding: EdgeInsets.all(16),
itemCount: books.length,
itemBuilder: (_, i) {
final book = books[i];
return Container(
margin: EdgeInsets.only(bottom: 12),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.1),
blurRadius: 6,
offset: Offset(0, 2),
)
],
),
child: Card(
color: _colorScheme.surface,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16)),
child: ListTile(
title: Text(
book.title,
style: TextStyle(
fontWeight: FontWeight.w500,
color: _colorScheme.onSurface,
),
),
subtitle: Text(book.author,
style: TextStyle(
color: _colorScheme.onSurface.withOpacity(0.7))),
onTap: () => _showEditDialog(context, vm, book),
trailing: IconButton(
icon: Icon(Icons.delete_outline,
color: _colorScheme.error),
onPressed: () => vm.deleteBook(book.id),
),
contentPadding: EdgeInsets.symmetric(
horizontal: 24, vertical: 12),
),
),
);
},
);
},
),
floatingActionButton: FloatingActionButton(
onPressed: () => _showAddDialog(context, vm),
child: Icon(Icons.add, color: _colorScheme.onPrimary),
backgroundColor: _colorScheme.primary,
elevation: 4,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16)),
),
);
}
}