diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..10db30f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "cmake.configureOnOpen": true, + "editor.stickyScroll.enabled": true +} \ No newline at end of file diff --git a/lib/add_book_page/add_book_page.dart b/lib/add_book_page/add_book_page.dart new file mode 100644 index 0000000..2c24adf --- /dev/null +++ b/lib/add_book_page/add_book_page.dart @@ -0,0 +1,49 @@ +import 'package:my_book_store_app/add_book_page/add_book_page_views/Add_book_button.dart'; +import 'package:my_book_store_app/add_book_page/add_book_page_views/reusable_text_button.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/top_bar.dart'; +import 'package:my_book_store_app/main.dart'; +import 'package:flutter/material.dart'; + +class AddBookPage extends StatelessWidget { + const AddBookPage({Key? key}) : super(key: key); + static TextEditingController bookName = TextEditingController(); + static TextEditingController authorName = TextEditingController(); + static TextEditingController price = TextEditingController(); + static TextEditingController imageLink = TextEditingController(); + static TextEditingController rating = TextEditingController(); + static TextEditingController description = TextEditingController(); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TopBar(), + Padding( + padding: const EdgeInsets.only(left: 27), + child: title('Add Book')), + Expanded( + child: ListView( + padding: const EdgeInsets.only(left: 20, top: 30, right: 20), + children: [ + reusableTextField( hintText: 'Book Name..', lines: 1, myControler: bookName), + reusableTextField( hintText: 'Author Name..', lines: 1, myControler: authorName), + reusableTextField( hintText: 'Price in \$..', lines: 1, myControler: price), + reusableTextField( hintText: 'Image Link..', lines: 1, myControler: imageLink), + reusableTextField( hintText: 'Rating..', lines: 1, myControler: rating), + Container( + height: 172, + margin: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom + 150), + child: reusableTextField( hintText: 'Description', lines: 6, myControler: description)), + ], + ), + ) + ], + ), + floatingActionButton: const AddBookButton()), + ); + } +} diff --git a/lib/add_book_page/add_book_page_views/Add_book_button.dart b/lib/add_book_page/add_book_page_views/Add_book_button.dart new file mode 100644 index 0000000..9614505 --- /dev/null +++ b/lib/add_book_page/add_book_page_views/Add_book_button.dart @@ -0,0 +1,65 @@ +import 'package:my_book_store_app/add_book_page/add_book_page.dart'; +import 'package:my_book_store_app/main.dart'; +import 'package:my_book_store_app/models/book_model.dart'; +import 'package:flutter/material.dart'; + +class AddBookButton extends StatelessWidget { + const AddBookButton({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20, left: 25, right: 5), + child: Container( + width: 350, + height: 70, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(13), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 4, + offset: const Offset(0, 9)) + ]), + child: TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + )), + child: const Text("Add", + style: TextStyle( + fontSize: 17, + fontWeight: FontWeight.w400, + color: Colors.white)), + onPressed: () { + BookModel.book.add(BookModel( + imageUrl: AddBookPage.imageLink.text, + rating: (double.parse(AddBookPage.rating.text)), + title: AddBookPage.bookName.text, + author: AddBookPage.authorName.text, + price: AddBookPage.price.text, + description: AddBookPage.description.text, + inCart: false)); + Navigator.push(context, + MaterialPageRoute(builder: (context) => const MyHomePage())); + AddBookPage.imageLink.clear(); + AddBookPage.rating.clear(); + AddBookPage.bookName.clear(); + AddBookPage.authorName.clear(); + AddBookPage.price.clear(); + AddBookPage.description.clear(); + }), + ), + ), + ], + ), + ); + } +} diff --git a/lib/add_book_page/add_book_page_views/reusable_text_button.dart b/lib/add_book_page/add_book_page_views/reusable_text_button.dart new file mode 100644 index 0000000..186c64b --- /dev/null +++ b/lib/add_book_page/add_book_page_views/reusable_text_button.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; + +Widget reusableTextField({required hintText, required int lines, required TextEditingController myControler}) { + return Container( + margin: const EdgeInsets.only(top: 17), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 2, + blurRadius: 6, + offset: const Offset(0, 6)) + ]), + child: TextField( + maxLines: 6, + minLines: lines, + textInputAction: TextInputAction.newline, + decoration: InputDecoration( + hintText: hintText, + hintStyle: const TextStyle(color: Colors.grey), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(15)), + enabledBorder: const OutlineInputBorder(borderSide: BorderSide.none), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 1, color: Colors.blue), + borderRadius: BorderRadius.circular(15))), + autofocus: false, + controller: myControler, + ), + ); +} diff --git a/lib/book_details_page/book_details_page.dart b/lib/book_details_page/book_details_page.dart new file mode 100644 index 0000000..dfd0f3a --- /dev/null +++ b/lib/book_details_page/book_details_page.dart @@ -0,0 +1,37 @@ +import 'package:my_book_store_app/book_details_page/book_details_views/book_author.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/book_cover.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/book_description.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/book_rating.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/book_title.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/bottom_buttons.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/top_bar.dart'; +import 'package:my_book_store_app/models/book_model.dart'; +import 'package:flutter/material.dart'; + +class BookDetailsPage extends StatelessWidget { + const BookDetailsPage({Key? key, required this.desiredBook,required this.desiredBookIndex}) + : super(key: key); + final BookModel desiredBook; + final int desiredBookIndex; + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const TopBar(), + Column( + children: [ + BookCover(url: desiredBook.imageUrl), + BookTitle(title: desiredBook.title), + BookAuthor(author: desiredBook.author), + const SizedBox(height: 5), + BookRating(rating: desiredBook.rating), + BookDescription(description: desiredBook.description), + ], + ) + ], + ), + floatingActionButton: BuyAndDetailsButtons(boughtBook: desiredBook, desiredBookIndex: desiredBookIndex)); + } +} diff --git a/lib/book_details_page/book_details_views/book_author.dart b/lib/book_details_page/book_details_views/book_author.dart new file mode 100644 index 0000000..7c1c500 --- /dev/null +++ b/lib/book_details_page/book_details_views/book_author.dart @@ -0,0 +1,16 @@ +import 'package:flutter/material.dart'; + +class BookAuthor extends StatelessWidget { + const BookAuthor({Key? key, required this.author}) : super(key: key); + final String author; + @override + Widget build(BuildContext context) { + return Text(author, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + height: 1, + color: Colors.grey, + )); + } +} diff --git a/lib/book_details_page/book_details_views/book_cover.dart b/lib/book_details_page/book_details_views/book_cover.dart new file mode 100644 index 0000000..1904b2a --- /dev/null +++ b/lib/book_details_page/book_details_views/book_cover.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +class BookCover extends StatelessWidget { + const BookCover({Key? key, required this.url}) : super(key: key); + final String url; + @override + Widget build(BuildContext context) { + return Container( + height: 300, + width: 220, + decoration: BoxDecoration( + image: DecorationImage( + image: NetworkImage(url), + alignment: Alignment.topCenter, + fit: BoxFit.cover), + borderRadius: BorderRadius.circular(7)), + ); + } +} diff --git a/lib/book_details_page/book_details_views/book_description.dart b/lib/book_details_page/book_details_views/book_description.dart new file mode 100644 index 0000000..3e06c4d --- /dev/null +++ b/lib/book_details_page/book_details_views/book_description.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +class BookDescription extends StatelessWidget { + const BookDescription({Key? key, required this.description}) : super(key: key); + final String description; + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(left: 10, right: 10, top: 2), + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + padding: const EdgeInsets.only(bottom: 100), + child: SizedBox( + width: 400, + height: 100, + child: Text(description, style: TextStyle(fontSize: 15, color: Colors.grey[700], height: 1.4))), + ), + ); + } +} diff --git a/lib/book_details_page/book_details_views/book_rating.dart b/lib/book_details_page/book_details_views/book_rating.dart new file mode 100644 index 0000000..28272bf --- /dev/null +++ b/lib/book_details_page/book_details_views/book_rating.dart @@ -0,0 +1,27 @@ +import 'package:flutter/material.dart'; + +class BookRating extends StatelessWidget { + const BookRating({Key? key, required this.rating}) : super(key: key); + final double rating; + @override + Widget build(BuildContext context) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [StarDisplay(value: rating), Text(" $rating/5")], + ); + } +} + +class StarDisplay extends StatelessWidget { + final double value; + const StarDisplay({Key? key, this.value = 0}) : super(key: key); + @override + Widget build(BuildContext context) { + return Row( + mainAxisSize: MainAxisSize.min, + children: List.generate(5, (index) { + return Icon(index < value.round() ? Icons.star : Icons.star_border, color: Colors.amber); + }), + ); + } +} diff --git a/lib/book_details_page/book_details_views/book_title.dart b/lib/book_details_page/book_details_views/book_title.dart new file mode 100644 index 0000000..07d36d3 --- /dev/null +++ b/lib/book_details_page/book_details_views/book_title.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class BookTitle extends StatelessWidget { + const BookTitle({Key? key, required this.title}) : super(key: key); + final String title; + @override + Widget build(BuildContext context) { + return Text(title, style: const TextStyle( fontSize: 30, fontWeight: FontWeight.bold, height: 2)); + } +} diff --git a/lib/book_details_page/book_details_views/bottom_buttons.dart b/lib/book_details_page/book_details_views/bottom_buttons.dart new file mode 100644 index 0000000..a1ef914 --- /dev/null +++ b/lib/book_details_page/book_details_views/bottom_buttons.dart @@ -0,0 +1,109 @@ +import 'package:my_book_store_app/cart_page/cart_page.dart'; +import 'package:my_book_store_app/models/book_model.dart'; +import 'package:flutter/material.dart'; + +class BuyAndDetailsButtons extends StatelessWidget { + const BuyAndDetailsButtons( + {Key? key, required this.boughtBook, required this.desiredBookIndex}) + : super(key: key); + final BookModel boughtBook; + final int desiredBookIndex; + + @override + Widget build(BuildContext context) { + String price = BookModel.book[desiredBookIndex].price; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 20, left: 25), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(flex: 2), + Container( + width: 150, + height: 45, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(13), + color: Colors.white, + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 4, + offset: const Offset(0, 9)) + ]), + child: TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + )), + child: const Icon(Icons.preview, color: Colors.black54), + onPressed: () => print('object'), + ), + ), + const Spacer(flex: 1), + Container( + width: 150, + height: 45, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(13), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 4, + offset: const Offset(0, 9)) + ]), + child: TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + )), + child: const Icon(Icons.reviews, color: Colors.black54), + onPressed: () => print('object'), + ), + ), + const Spacer(flex: 2) + ], + ), + ), + Padding( + padding: const EdgeInsets.only(right: 5), + child: Container( + width: 350, + height: 70, + decoration: BoxDecoration( + color: Colors.black, + borderRadius: BorderRadius.circular(13), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 4, + offset: const Offset(0, 9)) + ]), + child: TextButton( + style: TextButton.styleFrom( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + )), + child: Text("Buy now for $price\$", + style: const TextStyle(fontSize: 17,fontWeight: FontWeight.w400, color: Colors.white)), + onPressed: () { + BookModel.book[desiredBookIndex].inCart = true; + Future.delayed(Duration(milliseconds: 150), () {Navigator.push(context,MaterialPageRoute(builder: (context) => const CartPage())); + }); + }, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/book_details_page/book_details_views/top_bar.dart b/lib/book_details_page/book_details_views/top_bar.dart new file mode 100644 index 0000000..49f912c --- /dev/null +++ b/lib/book_details_page/book_details_views/top_bar.dart @@ -0,0 +1,24 @@ +import 'package:my_book_store_app/main.dart'; +import 'package:flutter/material.dart'; + +class TopBar extends StatelessWidget { + const TopBar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 5, top: 70, left: 5, right: 20), + child: Row( + children: [ + TextButton( + onPressed: () => Navigator.push(context, MaterialPageRoute(builder: (context) => const MyHomePage())), + child: const Icon(Icons.arrow_back_ios_new_rounded, color: Colors.black)), + const Spacer(), + TextButton( + onPressed: () => print('hi'), + child: const Icon(Icons.more_vert, color: Colors.black)) + ], + ), + ); + } +} diff --git a/lib/cart_page/cart_page.dart b/lib/cart_page/cart_page.dart new file mode 100644 index 0000000..007ce25 --- /dev/null +++ b/lib/cart_page/cart_page.dart @@ -0,0 +1,35 @@ +import 'package:my_book_store_app/book_details_page/book_details_views/top_bar.dart'; +import 'package:my_book_store_app/main.dart'; +import 'package:my_book_store_app/main_views/listed_books.dart'; +import 'package:my_book_store_app/main_views/navigators.dart'; +import 'package:flutter/material.dart'; + +class CartPage extends StatelessWidget { + const CartPage({Key? key}) : super(key: key); + static TextEditingController bookName = TextEditingController(); + static TextEditingController authorName = TextEditingController(); + static TextEditingController price = TextEditingController(); + static TextEditingController imageLink = TextEditingController(); + static TextEditingController rating = TextEditingController(); + static TextEditingController description = TextEditingController(); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const TopBar(), + Padding( + padding: const EdgeInsets.only(left: 27), child: title('Cart')), + const ListedBooks(paddingLeft: 20, paddingRight: 20, toggleCartFilter: true) + ], + ), + floatingActionButton: Navigators(currentPageCart: true), + floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, + ), + ); + } +} diff --git a/lib/main.dart b/lib/main.dart index bcc58f7..44799c6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,3 +1,7 @@ +import 'package:my_book_store_app/main_views/listed_books.dart'; +import 'package:my_book_store_app/main_views/navigators.dart'; +import 'package:my_book_store_app/main_views/profile.dart'; +import 'package:my_book_store_app/main_views/search_box.dart'; import 'package:flutter/material.dart'; void main() { @@ -6,15 +10,57 @@ void main() { class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: const MyHomePage()); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({Key? key}) : super(key: key); + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { @override Widget build(BuildContext context) { - return const MaterialApp( - home: Scaffold( - body: Center( - child: Text("Book Store App"), + return GestureDetector( + onTap: () => FocusManager.instance.primaryFocus?.unfocus(), + child: Scaffold( + body: Container( + color: Colors.grey[100], + child: Padding( + padding: const EdgeInsets.only(top: 20, left: 20, right: 20), + child: + Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + const SizedBox(height: 50), + const Profile(), + const SearchBox(), + title('Book List'), + const ListedBooks() + ]), + ), ), + floatingActionButton: Navigators(currentPageHome: true), + floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat, ), ); } } + +Padding title(String titles) { + return Padding( + padding: const EdgeInsets.only(top: 35), + child: Text( + titles, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 25), + ), + ); +} diff --git a/lib/main_views/listed_books.dart b/lib/main_views/listed_books.dart new file mode 100644 index 0000000..3f59984 --- /dev/null +++ b/lib/main_views/listed_books.dart @@ -0,0 +1,95 @@ +import 'package:my_book_store_app/book_details_page/book_details_page.dart'; +import 'package:my_book_store_app/book_details_page/book_details_views/book_rating.dart'; +import 'package:my_book_store_app/main_views/search_box.dart'; +import 'package:my_book_store_app/models/book_model.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +class ListedBooks extends StatelessWidget { + const ListedBooks({Key? key, this.paddingLeft, this.paddingRight, this.toggleCartFilter}): super(key: key); + final double? paddingLeft; + final double? paddingRight; + final bool? toggleCartFilter; + static ScrollController myScrollController = ScrollController(); + static int? desiredBookIndex; + + bool filterSearchFunction( + BookModel element, String searchWord, bool toggleCartFilter) { + if (toggleCartFilter == false && element.title.toLowerCase().contains(searchWord.toLowerCase())) { + return true; + } + if (element.inCart == true && toggleCartFilter == true) { + return true; + } else { + return false; + } + } + + @override + Widget build(BuildContext context) { + return Expanded( + child: Container( + margin: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom + 55), + child: Obx(() { + return ListView( + controller: myScrollController, + padding: EdgeInsets.only( bottom: 5, left: paddingLeft ?? 0, right: paddingRight ?? 0), + children: BookModel.book + .where((element) => filterSearchFunction(element, + SearchBox.searchWord.value, toggleCartFilter ?? false)) + .map((e) => TextButton( + style: TextButton.styleFrom(), + child: Container( + decoration: BoxDecoration( + color: Colors.grey[100], + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + height: 145, + width: 100, + decoration: BoxDecoration( + color: Colors.amber, + image: DecorationImage( + image: NetworkImage(e.imageUrl), + fit: BoxFit.cover, + alignment: Alignment.topCenter), + borderRadius: BorderRadius.circular(7))), + Padding( + padding: const EdgeInsets.only(left: 20, top: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + e.title, + style: const TextStyle( color: Colors.black, fontSize: 17, fontWeight: FontWeight.w600), + ), + Text( + e.author, + style: const TextStyle(color: Colors.grey, fontSize: 12, fontWeight: FontWeight.w600, height: 2), + ), + Text( + "\$${e.price}", + style: TextStyle(color: Colors.grey[800], fontSize: 17, fontWeight: FontWeight.w600, height: 2), + ), + Container( + padding: const EdgeInsets.only(top: 10), + child: StarDisplay(value: e.rating), + ) + ], + ), + ), + ], + ), + ), + onPressed: () { + Future.delayed(Duration(milliseconds: 170), (){Navigator.push(context, MaterialPageRoute( builder: (context) => BookDetailsPage(desiredBook: e, desiredBookIndex: BookModel.book.indexOf(e),)));}); + }, + )) + .toList(), + ); + }), + ), + ); + } +} diff --git a/lib/main_views/navigators.dart b/lib/main_views/navigators.dart new file mode 100644 index 0000000..56678e9 --- /dev/null +++ b/lib/main_views/navigators.dart @@ -0,0 +1,67 @@ +import 'package:my_book_store_app/add_book_page/add_book_page.dart'; +import 'package:my_book_store_app/cart_page/cart_page.dart'; +import 'package:my_book_store_app/main.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; + +class Navigators extends StatelessWidget { + Navigators({Key? key, this.currentPageCart, this.currentPageHome}) + : super(key: key); + bool? currentPageHome; + bool? currentPageCart; + Rx currentPageHomeRx = false.obs; + Rx currentPageCartRx = false.obs; + + @override + Widget build(BuildContext context) { + currentPageCartRx.value = currentPageCart ?? false; + currentPageHomeRx.value = currentPageHome ?? false; + return Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Container( + width: 250, + height: 60, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 1, + blurRadius: 4, + offset: const Offset(0, 9)) + ]), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + style: TextButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))), + onPressed: () { + currentPageCartRx.value = currentPageCart ?? false; + Future.delayed(Duration(milliseconds: 170), (){Navigator.push(context, MaterialPageRoute(builder: (context) => const MyHomePage()));}); + }, + child: Obx(() { + return Icon(Icons.home, + color: currentPageHomeRx == false.obs? Colors.grey: Colors.blue); + }), + ), + TextButton( + style: TextButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))), + onPressed: () {Future.delayed(Duration(milliseconds: 150), (){Navigator.push(context, MaterialPageRoute(builder: (context) => const CartPage()));});}, + child: Icon(Icons.shopping_cart_rounded, color: currentPageCartRx == false.obs? Colors.grey: Colors.blue), + ), + TextButton( + style: TextButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))), + onPressed: () {Future.delayed(Duration(milliseconds: 150), (){Navigator.push(context, MaterialPageRoute(builder: (context) => const AddBookPage()));});}, + child: Icon(Icons.add, color: Colors.grey[500]) + ), + ], + ), + ) + ], + ), + ); + } +} diff --git a/lib/main_views/profile.dart b/lib/main_views/profile.dart new file mode 100644 index 0000000..5c25c76 --- /dev/null +++ b/lib/main_views/profile.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +class Profile extends StatelessWidget { + const Profile({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(bottom: 40), + child: Row( + children: [ + Container( + width: 60, + height: 60, + decoration: BoxDecoration( + image: const DecorationImage( + image: NetworkImage('https://i.pinimg.com/564x/00/95/e0/0095e010d9d7e80fbe0d63f0459f5425.jpg'), + alignment: Alignment.topCenter, + fit: BoxFit.cover), + color: Colors.amber, + borderRadius: BorderRadius.circular(30))), + const Padding( + padding: EdgeInsets.only(left: 10), + child: Text("Hi, Haithem!", style: TextStyle(fontWeight: FontWeight.w300, fontSize: 20))), + const Spacer(), + TextButton( + onPressed: () => print('hi'), + child: const Icon(Icons.more_vert, color: Colors.black, )) + ], + ), + ); + } +} diff --git a/lib/main_views/search_box.dart b/lib/main_views/search_box.dart new file mode 100644 index 0000000..6bd0e3b --- /dev/null +++ b/lib/main_views/search_box.dart @@ -0,0 +1,50 @@ +import 'package:my_book_store_app/main_views/listed_books.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +class SearchBox extends StatelessWidget { + const SearchBox({ + Key? key, + }) : super(key: key); + static RxString searchWord = ''.obs; + + @override + Widget build(BuildContext context) { + return Container( + height: 47, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.1), + spreadRadius: 2, + blurRadius: 6, + offset: const Offset(0, 6)) + ]), + child: TextField( + onTap: () { + ListedBooks.myScrollController.jumpTo(0); + }, + onChanged: (c) { + searchWord.value = c; + }, + textAlignVertical: TextAlignVertical.bottom, + decoration: InputDecoration( + suffixIcon: + TextButton(style: TextButton.styleFrom(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15))), + child: Obx(() { + return Icon(Icons.search, color: searchWord.value.isEmpty? Colors.grey: Colors.blue); + }), + onPressed: () => print('object')), + hintText: 'Search...', + hintStyle: const TextStyle(color: Colors.grey), + border: OutlineInputBorder(borderRadius: BorderRadius.circular(15)), + enabledBorder: const OutlineInputBorder(borderSide: BorderSide.none), + focusedBorder: OutlineInputBorder( + borderSide: const BorderSide(width: 1, color: Colors.blue), + borderRadius: BorderRadius.circular(15))), + autofocus: false, + ), + ); + } +} diff --git a/lib/models/book_model.dart b/lib/models/book_model.dart new file mode 100644 index 0000000..c64ae23 --- /dev/null +++ b/lib/models/book_model.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; +class BookModel { + BookModel({ + Key? key, + required this.imageUrl, + required this.rating, + required this.title, + required this.author, + required this.price, + required this.description, + required this.inCart, + }); + final String imageUrl; + final double rating; + final String title; + final String author; + final String price; + final String description; + bool inCart; + static List book = [ + BookModel( + imageUrl: + 'https://i.pinimg.com/564x/00/95/e0/0095e010d9d7e80fbe0d63f0459f5425.jpg', + rating: 4, + title: 'Yves Saint Laurent', + author: 'Suzy Monkes', + description: 'idkjndlkdjfnv;kjn', + price: '5', + inCart: false + ), + BookModel( + imageUrl: + 'https://i.pinimg.com/564x/00/95/e0/0095e010d9d7e80fbe0d63f0459f5425.jpg', + rating: 5, + title: 'Yves Saint Laurent2', + author: 'Suzy Monkes2', + description: '2', + price: '12', + inCart: false + ), + ]; +} diff --git a/lib/tempCodeRunnerFile.dart b/lib/tempCodeRunnerFile.dart new file mode 100644 index 0000000..e69de29 diff --git a/pubspec.lock b/pubspec.lock index 7bc8bdd..62f34da 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -74,6 +74,13 @@ packages: description: flutter source: sdk version: "0.0.0" + get: + dependency: "direct main" + description: + name: get + url: "https://pub.dartlang.org" + source: hosted + version: "4.6.5" lints: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index cd0f457..5961e63 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,4 +1,4 @@ -name: book_store_app +name: my_book_store_app description: A new Flutter project. # The following line prevents the package from being accidentally published to @@ -29,12 +29,12 @@ environment: dependencies: flutter: sdk: flutter - - + get: any # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 + dev_dependencies: flutter_test: sdk: flutter diff --git a/test/widget_test.dart b/test/widget_test.dart index 7730be6..85c6761 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:book_store_app/main.dart'; +import 'package:my_book_store_app/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async {