Commit ce45237a authored by Ilham Maulana's avatar Ilham Maulana 💻

fix: member loan selected book

parent 5d7d06d8
class Book { class Book {
int id;
String title; String title;
String author; String author;
String description; String description;
String? coverUrl; String? coverUrl;
String? category; String? category;
Book(this.title, this.author, this.description, this.coverUrl, this.category); Book(this.id, this.title, this.author, this.description, this.coverUrl,
this.category);
factory Book.fromJson(Map<String, dynamic> data) { factory Book.fromJson(Map<String, dynamic> data) {
return Book( return Book(
data['id'] as int,
data['title'] as String, data['title'] as String,
data['author'] as String, data['author'] as String,
data['description'] as String, data['description'] as String,
...@@ -20,6 +23,7 @@ class Book { ...@@ -20,6 +23,7 @@ class Book {
final initialBooks = [ final initialBooks = [
Book( Book(
1,
'The Doe in the Forest', 'The Doe in the Forest',
'Laurel Toven', 'Laurel Toven',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.',
...@@ -27,6 +31,7 @@ final initialBooks = [ ...@@ -27,6 +31,7 @@ final initialBooks = [
'Children', 'Children',
), ),
Book( Book(
1,
'Norse Mythology', 'Norse Mythology',
'Neil Gaiman', 'Neil Gaiman',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.',
...@@ -34,6 +39,7 @@ final initialBooks = [ ...@@ -34,6 +39,7 @@ final initialBooks = [
'Religion', 'Religion',
), ),
Book( Book(
1,
'The Sun, the Moon, the Stars', 'The Sun, the Moon, the Stars',
'Junot Diaz', 'Junot Diaz',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.',
...@@ -41,6 +47,7 @@ final initialBooks = [ ...@@ -41,6 +47,7 @@ final initialBooks = [
'Drama', 'Drama',
), ),
Book( Book(
1,
'Harry Potter', 'Harry Potter',
'JK Rowling', 'JK Rowling',
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed id mauris ligula. Mauris nec elit ultrices, gravida tortor ac, faucibus velit.',
......
...@@ -188,14 +188,18 @@ class AuthProvider with ChangeNotifier { ...@@ -188,14 +188,18 @@ class AuthProvider with ChangeNotifier {
final body = { final body = {
"book": bookId, "book": bookId,
"member": memberId, "member": memberId,
"loan_date": loanDate, "loan_date": loanDate.toString(),
"due_date": dueDate, "due_date": dueDate.toString(),
}; };
try { try {
final response = await http.post( final response = await http.post(
Uri.parse('$baseUrl/members/$memberId/loans/'), Uri.parse('$baseUrl/members/$memberId/loans/'),
body: jsonEncode(body), body: jsonEncode(body),
headers: {'Content-Type': 'application/json'}, headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token?.key}'
},
); );
if (response.statusCode == 200) { if (response.statusCode == 200) {
...@@ -203,12 +207,12 @@ class AuthProvider with ChangeNotifier { ...@@ -203,12 +207,12 @@ class AuthProvider with ChangeNotifier {
memberLoans = data["results"]; memberLoans = data["results"];
} else { } else {
debugPrint( debugPrint(
"Failed to get member loan. ${response.statusCode}: ${response.body}"); "Failed to create member loan. ${response.statusCode}: ${response.body}");
} }
notifyListeners(); notifyListeners();
} catch (error) { } catch (error) {
debugPrint("Failed to get member loan. $error"); debugPrint("Failed to create member loan. $error");
} }
} }
} }
...@@ -4,14 +4,14 @@ import 'package:library_app/src/widgets/forms/book_loan_form.dart'; ...@@ -4,14 +4,14 @@ import 'package:library_app/src/widgets/forms/book_loan_form.dart';
class DetailScreen extends StatefulWidget { class DetailScreen extends StatefulWidget {
final String? textSubmitButton; final String? textSubmitButton;
final String title; final String title;
final String confirmMessage; final int bookId;
final Widget body; final Widget body;
const DetailScreen({ const DetailScreen({
super.key, super.key,
required this.title, required this.title,
required this.body, required this.body,
required this.confirmMessage, required this.bookId,
this.textSubmitButton, this.textSubmitButton,
}); });
...@@ -24,6 +24,7 @@ class _DetailScreen extends State<DetailScreen> { ...@@ -24,6 +24,7 @@ class _DetailScreen extends State<DetailScreen> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final String title = widget.title; final String title = widget.title;
final Widget body = widget.body; final Widget body = widget.body;
final int bookId = widget.bookId;
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
...@@ -42,7 +43,9 @@ class _DetailScreen extends State<DetailScreen> { ...@@ -42,7 +43,9 @@ class _DetailScreen extends State<DetailScreen> {
) )
], ],
), ),
bottomNavigationBar: const LoanBookForm(), bottomNavigationBar: LoanBookForm(
bookId: bookId,
),
); );
} }
} }
...@@ -19,8 +19,8 @@ class _BookDetail extends State<BookDetail> { ...@@ -19,8 +19,8 @@ class _BookDetail extends State<BookDetail> {
final screenSize = MediaQuery.of(context).size; final screenSize = MediaQuery.of(context).size;
return DetailScreen( return DetailScreen(
bookId: book.id,
title: book.title, title: book.title,
confirmMessage: "Loans for how many days?",
textSubmitButton: "Borrow", textSubmitButton: "Borrow",
body: Column( body: Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
......
...@@ -27,6 +27,7 @@ class _BookList extends State<BookList> { ...@@ -27,6 +27,7 @@ class _BookList extends State<BookList> {
if (bookProvider.books != null) { if (bookProvider.books != null) {
final Iterable<Book> books = bookProvider.books!.map( final Iterable<Book> books = bookProvider.books!.map(
(book) => Book( (book) => Book(
book["id"],
book["title"], book["title"],
book["author"], book["author"],
book["description"], book["description"],
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:library_app/src/providers/auth_provider.dart';
import 'package:provider/provider.dart';
class LoanBookForm extends StatelessWidget { class LoanBookForm extends StatefulWidget {
const LoanBookForm({super.key}); final int bookId;
const LoanBookForm({super.key, required this.bookId});
@override
State<LoanBookForm> createState() => _LoanBookForm();
}
class _LoanBookForm extends State<LoanBookForm> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
final loanDayController = TextEditingController();
@override
void dispose() {
loanDayController.dispose();
super.dispose();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Container( return Consumer<AuthProvider>(builder: (context, authProvider, child) {
padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0), return Container(
child: FilledButton( padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 10.0),
onPressed: () { child: FilledButton(
showDialog( onPressed: () {
context: context, showDialog(
builder: (BuildContext context) { context: context,
return AlertDialog( builder: (BuildContext context) {
title: const Text('Loans for how many days?'), return AlertDialog(
content: Form( title: const Text(
child: TextFormField( 'Borrow for how many days?',
decoration: const InputDecoration( style: TextStyle(fontSize: 20.0),
hintText: "Input number",
labelText: "Days",
suffixIcon: Icon(Icons.date_range),
),
keyboardType: TextInputType.number,
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
),
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text('Cancel'),
), ),
ElevatedButton( content: Form(
onPressed: () { key: _formKey,
// Submit form data child: TextFormField(
Navigator.of(context).pop(); controller: loanDayController,
}, decoration: const InputDecoration(
child: const Text('Submit'), hintText: "Input day in number",
labelText: "Days",
suffixIcon: Icon(Icons.date_range),
),
keyboardType: TextInputType.number,
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
),
), ),
], actions: [
); TextButton(
}, onPressed: () {
); Navigator.of(context).pop();
}, },
child: const Text('borrow'), child: const Text('Cancel'),
), ),
); FilledButton(
onPressed: () {
authProvider.createMemberLoan(
authProvider.user!.accountId,
widget.bookId,
int.parse(loanDayController.text),
);
},
child: const Text('Submit'),
),
],
);
},
);
},
child: const Text('borrow'),
),
);
});
} }
} }
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