From c3056adb0c74de61357f32a1ed5264e79b9cde3c Mon Sep 17 00:00:00 2001 From: Aditya <62930521+adityar224@users.noreply.github.com> Date: Sat, 3 Feb 2024 01:37:35 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fixed=20initial=20address=20and?= =?UTF-8?q?=20card=20addition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 101 +++--- SECURITY.md | 3 +- android/app/src/main/AndroidManifest.xml | 1 + assets/icons/cart_icon_grey.svg | 3 + assets/icons/favorite_icon_black.svg | 10 + assets/icons/logout_icon.svg | 8 +- assets/icons/search_icon_grey.svg | 3 + assets/icons/shopping_bag_icon_black.svg | 3 + lib/controllers/add_payment_controller.dart | 20 +- lib/controllers/address_controller.dart | 75 ++--- lib/controllers/auth_controller.dart | 47 ++- lib/controllers/card_details_controller.dart | 46 ++- lib/controllers/cart_controller.dart | 88 ++---- lib/controllers/favorites_controller.dart | 39 +-- lib/controllers/home_controller.dart | 13 +- lib/controllers/payment_controller.dart | 6 +- lib/controllers/user_controller.dart | 72 ++--- lib/main.dart | 1 + lib/screens/cart/order_success_screen.dart | 8 +- lib/screens/favorite_screen.dart | 10 +- lib/screens/home.dart | 11 +- lib/screens/input/edit_shipping_screen.dart | 3 +- lib/screens/notification_screen.dart | 5 +- lib/screens/product/product_screen.dart | 3 +- .../profile/edit_personal_info_screen.dart | 3 +- lib/screens/profile/profile_screen.dart | 6 +- lib/services/search_service.dart | 5 +- lib/widgets/tiles/favorite_list_tile.dart | 3 +- lib/wrapper.dart | 40 +-- pubspec.lock | 296 +++++++++++------- pubspec.yaml | 14 +- 31 files changed, 489 insertions(+), 457 deletions(-) create mode 100644 assets/icons/cart_icon_grey.svg create mode 100644 assets/icons/favorite_icon_black.svg create mode 100644 assets/icons/search_icon_grey.svg create mode 100644 assets/icons/shopping_bag_icon_black.svg diff --git a/README.md b/README.md index 5f9bcae..22db7f7 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,36 @@ -# πŸ›Œ Flutter Furniture App πŸͺ‘ +# πŸ›Œ Flutter Furniture App (Timberr) πŸͺ‘ -Timberr is a fully functional Furniture App Clone Developed using Flutter, Supabase and Getx State Management which is based on this [UI Design](https://www.figma.com/file/dTdGEtZoQd2uRZc8qS5xjr/Timberr?node-id=0%3A1). +Timberr is a robust and feature-rich furniture application clone meticulously crafted using Flutter, Supabase, and Getx State Management. This app seamlessly integrates a sophisticated UI design to provide users with an immersive and intuitive furniture shopping experience. -## πŸ—ƒοΈ Database Schema +This app is based on this [UI Design](https://www.figma.com/file/dTdGEtZoQd2uRZc8qS5xjr/Timberr?node-id=0%3A1). - +## ✨ Key Features: -## πŸ’» Installation links +- πŸ” Authentication: Timberr ensures a secure and personalized experience with a robust authentication system, allowing users to create accounts, log in securely, and manage their profiles effortlessly. -- [Android App](https://github.com/adityar224/FlutterFurnitureApp/releases/download/1.0.0/timberr-1.0.0.apk) -- [iOS App](https://github.com/adityar224/FlutterFurnitureApp/releases/download/1.0.0/timberr-1.0.0.ipa) +- πŸ›’ Cart: The app features a fully functional shopping cart, enabling users to add, remove, and manage items with ease. The cart ensures a smooth and efficient checkout process for a seamless shopping journey. -## ✨ Features +- πŸ’– Favorites: Timberr incorporates a favorites section, allowing users to curate a personalized list of preferred items. This feature enhances user engagement by providing a quick and convenient way to revisit and purchase favored products. -- [x] Authentication -- [x] Cart -- [x] Favorites -- [x] Address -- [x] Search -- [x] Filtering -- [x] Select Color -- [x] Change Quantity -- [x] Payment Methods -- [x] Razorpay Payment Gateway -- [x] Change User Profile Picture -- [x] Change Name/Password and other User Related Settings -- [x] Smooth Animations -- [x] Loading Screens -- [ ] Reviews (Only UI implemented) -- [ ] Orders (Only UI implemented) -- [ ] Notifications (Only UI implemented) -- [ ] Dark Mode -- [ ] Responsive Design +- πŸ—ΊοΈ Address: Users can effortlessly manage their delivery addresses, ensuring a hassle-free and customized shopping experience. The address feature enhances convenience by enabling users to save and update their preferred delivery locations. + +- πŸ” Search and Filtering: Timberr integrates a powerful search functionality and advanced filtering options, facilitating users in discovering desired furniture items efficiently. + +- 🌈 Select Color: Users can customize their furniture selection by choosing from a variety of colors, adding a touch of personalization to their shopping experience. + +- πŸ’³ Payment Methods: The app supports multiple payment methods, ensuring a secure and versatile checkout process for users. This feature includes integration with the Razorpay payment gateway for a seamless and reliable transaction experience. + +- πŸ‘€ User Profile Management: Timberr empowers users to personalize their profiles by enabling them to change profile pictures, update names, passwords, and other user-related settings, enhancing the overall user experience. + +- πŸ’« Smooth Animations: The app incorporates smooth and visually appealing animations, enhancing the overall user interface and providing a delightful interaction experience. + +- 🚧 Reviews, Orders, and Notifications: While currently implemented as UI elements, Timberr sets the foundation for future functionality, allowing users to access and view product reviews, order history, and notifications – enhancing user engagement and information accessibility. + +## πŸ’» Installation links + +[![Download Android Apk](https://img.shields.io/badge/Download-Android%20Apk-green)](https://github.com/adityar224/FlutterFurnitureApp/releases/download/2.0.0/timberr-2.0.0.apk) + +[![Download iOS ipa](https://img.shields.io/badge/Download-iOS%20App-black)](https://github.com/adityar224/FlutterFurnitureApp/releases/download/1.0.0/timberr-1.0.0.ipa) ## πŸ“Έ Screen Recordings @@ -93,18 +92,44 @@ Timberr is a fully functional Furniture App Clone Developed using Flutter, Supab Sign out
+## πŸ—ƒοΈ Database Schema + + + ## πŸ”Œ Plugins -|Name|Usage| -|-|-| -|[**get**](https://pub.dev/packages/get)|Dependency injection, State and Route management| -|[**supabase_flutter**](https://pub.dev/packages/supabase_flutter)|Authentication, Database and Storage| -|[**cached_network_image**](https://pub.dev/packages/cached_network_image)|Caching Product and user images| -|[**lottie**](https://pub.dev/packages/lottie)|Loading Animations| -|[**url_launcher**](https://pub.dev/packages/url_launcher)|To open FAQ in a browser| -|[**image_picker**](https://pub.dev/packages/image_picker)|To select user profile picture from their device| -|[**razorpay_flutter**](https://pub.dev/packages/razorpay_flutter)|Payment Gateway through Razorpay| -|[**flutter_lints**](https://pub.dev/packages/flutter_lints)|For linting| +| Name | Usage | +|---------------------------------------------------------------------------|--------------------------------------------------| +| [**get**](https://pub.dev/packages/get) | Dependency injection, State and Route management | +| [**supabase_flutter**](https://pub.dev/packages/supabase_flutter) | Authentication, Database and Storage | +| [**cached_network_image**](https://pub.dev/packages/cached_network_image) | Caching Product and user images | +| [**lottie**](https://pub.dev/packages/lottie) | Loading Animations | +| [**url_launcher**](https://pub.dev/packages/url_launcher) | To open FAQ in a browser | +| [**image_picker**](https://pub.dev/packages/image_picker) | To select user profile picture from their device | +| [**razorpay_flutter**](https://pub.dev/packages/razorpay_flutter) | Payment Gateway through Razorpay | +| [**flutter_lints**](https://pub.dev/packages/flutter_lints) | For linting | + +## πŸ“ƒ Feature Todo List + +- [x] Authentication +- [x] Cart +- [x] Favorites +- [x] Address +- [x] Search +- [x] Filtering +- [x] Select Color +- [x] Change Quantity +- [x] Payment Methods +- [x] Razorpay Payment Gateway +- [x] Change User Profile Picture +- [x] Change Name/Password and other User Related Settings +- [x] Smooth Animations +- [x] Loading Screens +- [ ] Reviews (Only UI implemented) +- [ ] Orders (Only UI implemented) +- [ ] Notifications (Only UI implemented) +- [ ] Dark Mode +- [ ] Responsive Design (Only Mobile version implemented) ## πŸ€“ Author @@ -112,4 +137,4 @@ Timberr is a fully functional Furniture App Clone Developed using Flutter, Supab ## πŸ”– LICENCE Copyright (c) 2022 Aditya R -[MIT LICENCE](https://github.com/adityar224/FlutterFurnitureApp/blob/master/LICENSE) +[MIT LICENCE](https://github.com/adityar224/FlutterFurnitureApp/blob/master/LICENSE) \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md index 7ee1f6f..06b2d81 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,7 +3,8 @@ ## Supported Versions | Version | Supported | -|---------| ------------------ | +|---------|--------------------| +| 2.0.0 | :white_check_mark: | | 1.0.0 | :white_check_mark: | ## Reporting a Vulnerability diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8727c04..41d60b9 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ + + + diff --git a/assets/icons/favorite_icon_black.svg b/assets/icons/favorite_icon_black.svg new file mode 100644 index 0000000..2e8bbc7 --- /dev/null +++ b/assets/icons/favorite_icon_black.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/icons/logout_icon.svg b/assets/icons/logout_icon.svg index f6222ec..bb38cb8 100644 --- a/assets/icons/logout_icon.svg +++ b/assets/icons/logout_icon.svg @@ -1,5 +1,5 @@ - - - - + + + + diff --git a/assets/icons/search_icon_grey.svg b/assets/icons/search_icon_grey.svg new file mode 100644 index 0000000..058272f --- /dev/null +++ b/assets/icons/search_icon_grey.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/shopping_bag_icon_black.svg b/assets/icons/shopping_bag_icon_black.svg new file mode 100644 index 0000000..1760ea8 --- /dev/null +++ b/assets/icons/shopping_bag_icon_black.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/controllers/add_payment_controller.dart b/lib/controllers/add_payment_controller.dart index d0c3726..591860e 100644 --- a/lib/controllers/add_payment_controller.dart +++ b/lib/controllers/add_payment_controller.dart @@ -11,29 +11,27 @@ class AddPaymentController extends GetxController { final _supabaseClient = Supabase.instance.client; final CardDetailsController _cardDetailsController = Get.find(); - Future addCardDetail() async { + Future addCardDetail() async { final insertData = await _supabaseClient.from("Card_Details").insert({ "cardholder_name": name.value, "card_number": cardNumber, "month": month, "year": year, - "user_id": _supabaseClient.auth.user()?.id - }).execute(); + "user_id": _supabaseClient.auth.currentUser!.id + }).select(); if (_cardDetailsController.cardDetailList.isEmpty) { _cardDetailsController.selectedIndex.value = 0; - //set default user Address Id in the database + //set default user Card Id in the database await _supabaseClient .from("Users") - .update({'default_card_detail_id': insertData.data[0]}) - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); + .update({'default_card_detail_id': insertData[0]['id']}).eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); } _cardDetailsController.cardDetailList.add( CardDetail( - id: insertData.data[0]['id'], + id: insertData[0]['id'], name: name.value, cardNumber: cardNumber, month: month, diff --git a/lib/controllers/address_controller.dart b/lib/controllers/address_controller.dart index 3d86114..0649e27 100644 --- a/lib/controllers/address_controller.dart +++ b/lib/controllers/address_controller.dart @@ -11,34 +11,27 @@ class AddressController extends GetxController { String name = "", address = "", country = "", city = "", district = ""; int pincode = 0; - Future fetchAddresses() async { + Future fetchAddresses() async { //get address list - final response = await _supabaseClient - .from("Addresses") - .select() - .eq( + final response = await _supabaseClient.from("Addresses").select().eq( "user_id", - _supabaseClient.auth.user()?.id, - ) - .execute(); - final responseList = response.data as List; + _supabaseClient.auth.currentUser!.id, + ); + final responseList = response; for (int i = 0; i < responseList.length; i++) { addressList.add(Address.fromJson(responseList[i])); } update(); } - Future getDefaultShippingAddress() async { + Future getDefaultShippingAddress() async { //get default shipping address - final defaultShippingResponse = await _supabaseClient - .from("Users") - .select('default_shipping_id') - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); - int? responseId = defaultShippingResponse.data[0]['default_shipping_id']; + final defaultShippingResponse = + await _supabaseClient.from("Users").select('default_shipping_id').eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); + int? responseId = defaultShippingResponse[0]['default_shipping_id']; await fetchAddresses(); if (responseId != null) { for (int i = 0; i < addressList.length; i++) { @@ -51,7 +44,7 @@ class AddressController extends GetxController { } } - Future setDefaultShippingAddress(int index) async { + Future setDefaultShippingAddress(int index) async { if (selectedIndex == index) { return; } @@ -59,15 +52,13 @@ class AddressController extends GetxController { update(); await _supabaseClient .from("Users") - .update({'default_shipping_id': addressList.elementAt(index).id}) - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); + .update({'default_shipping_id': addressList.elementAt(index).id}).eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); } - Future uploadAddress() async { + Future uploadAddress() async { final insertData = await _supabaseClient.from("Addresses").insert({ 'full_name': name, 'address': address, @@ -75,24 +66,22 @@ class AddressController extends GetxController { 'country': country, 'city': city, 'district': district, - 'user_id': _supabaseClient.auth.user()?.id, - }).execute(); + 'user_id': _supabaseClient.auth.currentUser!.id, + }).select(); if (addressList.isEmpty) { selectedIndex = 0; //set default user Address Id in the database await _supabaseClient .from("Users") - .update({'default_shipping_id': insertData.data[0]}) - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); + .update({'default_shipping_id': insertData[0]['id']}).eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); } //add to shipping address list addressList.add( Address( - id: insertData.data[0]['id'], + id: insertData[0]['id'], name: name, address: address, pincode: pincode, @@ -105,7 +94,7 @@ class AddressController extends GetxController { Get.back(); } - Future editAddress(int index, int addressId) async { + Future editAddress(int index, int addressId) async { Address newAddress = Address( id: addressId, name: name, @@ -118,15 +107,14 @@ class AddressController extends GetxController { await _supabaseClient .from("Addresses") .update(newAddress.toJson()) - .eq("id", addressId) - .execute(); + .eq("id", addressId); //update the value locally addressList[index] = newAddress; update(); Get.back(); } - Future deleteAddress(int index) async { + Future deleteAddress(int index) async { //check if it is the selected index if (index == selectedIndex) { if (addressList.length == 1) { @@ -135,15 +123,14 @@ class AddressController extends GetxController { return; } else { selectedIndex = 0; - setDefaultShippingAddress((index == 0) ? 1 : 0); + await setDefaultShippingAddress((index == 0) ? 1 : 0); } } //remove address from the database await _supabaseClient .from("Addresses") - .delete(returning: ReturningOption.minimal) - .eq("id", addressList.elementAt(index).id) - .execute(); + .delete() + .eq("id", addressList.elementAt(index).id); //remove from local list addressList.removeAt(index); //go back to previous page diff --git a/lib/controllers/auth_controller.dart b/lib/controllers/auth_controller.dart index 8f1148d..857ecbc 100644 --- a/lib/controllers/auth_controller.dart +++ b/lib/controllers/auth_controller.dart @@ -4,50 +4,45 @@ import 'package:timberr/constants.dart'; import 'package:timberr/wrapper.dart'; class AuthController extends GetxController { - final _authController = Supabase.instance; - User? get user => _authController.client.auth.currentUser; + final _supabaseInstance = Supabase.instance.client; + User? get user => _supabaseInstance.auth.currentUser; Future signIn(String email, String password) async { - final response = await _authController.client.auth - .signIn(email: email, password: password); - if (response.error != null) { - kDefaultDialog( - "Error", response.error?.message ?? 'Some Unknown Error occurred'); - } else { + try { + await _supabaseInstance.auth + .signInWithPassword(email: email, password: password); // Sign in with success Get.offAll(() => const Wrapper()); + } on AuthException catch (error) { + kDefaultDialog("Error", error.message); + } catch (error) { + kDefaultDialog("Error", 'Some Unknown Error occurred'); } } Future signUp(String name, String email, String password) async { - final response = await _authController.client.auth.signUp(email, password); - if (response.error != null && - response.error!.message != - 'Thanks for registering, now check your email to complete the process.') { - // Handle error - kDefaultDialog( - "Error", - response.error?.message ?? 'Some Unknown Error occurred', - ); - } else { - // check is session is null(user already exists) else sign in - if (response.data == null) { - kDefaultDialog("Error", "User already Exists"); - } else { - _authController.client.from('Users').insert({ + try { + final response = + await _supabaseInstance.auth.signUp(password: password, email: email); + if (response.session != null) { + await _supabaseInstance.from('Users').insert({ 'Name': name, 'Email': email, - 'Uid': response.user!.id, + 'Uid': response.session?.user.id, 'favoritesList': [], 'cartList': [], - }).execute(); + }); Get.offAll(() => const Wrapper()); } + } on AuthException catch (error) { + kDefaultDialog("Error", error.message); + } catch (error) { + kDefaultDialog("Error", 'Some Unknown Error occurred'); } } Future forgotPassword(String email) async { - await _authController.client.auth.api.resetPasswordForEmail(email); + await _supabaseInstance.auth.resetPasswordForEmail(email); Get.snackbar("Password reset", "Password reset request has been sent to your email successfully."); } diff --git a/lib/controllers/card_details_controller.dart b/lib/controllers/card_details_controller.dart index 07f534c..69206cd 100644 --- a/lib/controllers/card_details_controller.dart +++ b/lib/controllers/card_details_controller.dart @@ -18,33 +18,26 @@ class CardDetailsController extends GetxController { return "XXXX"; } - Future fetchCardDetails() async { + Future fetchCardDetails() async { //fetch Card Details - final response = await _supabaseClient - .from("Card_Details") - .select() - .eq( + final response = await _supabaseClient.from("Card_Details").select().eq( "user_id", - _supabaseClient.auth.user()?.id, - ) - .execute(); - final responseList = response.data as List; + _supabaseClient.auth.currentUser!.id, + ); + final responseList = response; for (int i = 0; i < responseList.length; i++) { cardDetailList.add(CardDetail.fromJson(responseList[i])); } } - Future getDefaultCardDetail() async { + Future getDefaultCardDetail() async { //get default card detail - final defaultShippingResponse = await _supabaseClient - .from("Users") - .select('default_card_detail_id') - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); - int? responseId = defaultShippingResponse.data[0]['default_card_detail_id']; + final defaultShippingResponse = + await _supabaseClient.from("Users").select('default_card_detail_id').eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); + int? responseId = defaultShippingResponse[0]['default_card_detail_id']; await fetchCardDetails(); if (responseId != null) { for (int i = 0; i < cardDetailList.length; i++) { @@ -56,18 +49,15 @@ class CardDetailsController extends GetxController { } } - Future setDefaultCardDetail(int index) async { + Future setDefaultCardDetail(int index) async { if (selectedIndex.value == index) { return; } selectedIndex.value = index; - await _supabaseClient - .from("Users") - .update({'default_card_detail_id': cardDetailList.elementAt(index).id}) - .eq( - "Uid", - _supabaseClient.auth.user()?.id, - ) - .execute(); + await _supabaseClient.from("Users").update( + {'default_card_detail_id': cardDetailList.elementAt(index).id}).eq( + "Uid", + _supabaseClient.auth.currentUser!.id, + ); } } diff --git a/lib/controllers/cart_controller.dart b/lib/controllers/cart_controller.dart index 2c2be4f..fdd00fa 100644 --- a/lib/controllers/cart_controller.dart +++ b/lib/controllers/cart_controller.dart @@ -10,26 +10,24 @@ class CartController extends GetxController { var cartList = {}.obs; var total = 0.obs; final _supabaseClient = Supabase.instance.client; - Future fetchCartItems() async { + + Future fetchCartItems() async { final response = await _supabaseClient .from('Users') .select() - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); - cartIdList = response.data[0]['cartList']; + .eq("Uid", _supabaseClient.auth.currentUser!.id); + cartIdList = response[0]['cartList']; for (int i = 0; i < cartIdList.length; i++) { final cartResponse = await _supabaseClient .from('Cart_Items') .select() - .eq("cart_id", cartIdList[i]) - .execute(); + .eq("cart_id", cartIdList[i]); final productResponse = await _supabaseClient .from('Products') .select() - .eq("product_id", cartResponse.data[0]['product_id']) - .execute(); - cartList.add(CartItem(cartIdList[i], cartResponse.data[0]['quantity'], - cartResponse.data[0]['color'], productResponse.data[0])); + .eq("product_id", cartResponse[0]['product_id']); + cartList.add(CartItem(cartIdList[i], cartResponse[0]['quantity'], + cartResponse[0]['color'], productResponse[0])); total.value = total.value + (cartList.elementAt(i).quantity * cartList.elementAt(i).price); } @@ -45,7 +43,7 @@ class CartController extends GetxController { return -1; } - Future addToCart(Product product, Color color, + Future addToCart(Product product, Color color, {int quantity = 1, bool showSnackbar = true}) async { int index = findProduct(product, color); if (index != -1) { @@ -55,9 +53,8 @@ class CartController extends GetxController { //update quantity in database await _supabaseClient .from('Cart_Items') - .update({'quantity': cartList.elementAt(index).quantity}) - .eq("cart_id", cartList.elementAt(index).cartId) - .execute(); + .update({'quantity': cartList.elementAt(index).quantity}).eq( + "cart_id", cartList.elementAt(index).cartId); } else { //product not there in cart //add item to cart_items database @@ -67,25 +64,20 @@ class CartController extends GetxController { 'quantity': quantity, 'color': colorToString(color), } - ]).execute(); + ]).select(); cartList.add( CartItem( - insertData.data[0]['cart_id'], + insertData[0]['cart_id'], quantity, - insertData.data[0]['color'], + insertData[0]['color'], product.toJson(), ), ); total.value = total.value + (quantity * product.price); //set cart_id in user cartlist - cartIdList.add(insertData.data[0]['cart_id']); - _supabaseClient - .from('Users') - .update({ - 'cartList': cartIdList, - }) - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); + cartIdList.add(insertData[0]['cart_id']); + await _supabaseClient.from('Users').update({'cartList': cartIdList}).eq( + "Uid", _supabaseClient.auth.currentUser!.id); } if (showSnackbar) { Get.snackbar( @@ -94,7 +86,7 @@ class CartController extends GetxController { onTap: (_) { Get.closeCurrentSnackbar(); Get.to( - CartScreen(), + () => CartScreen(), transition: Transition.fadeIn, duration: const Duration(milliseconds: 600), ); @@ -103,24 +95,19 @@ class CartController extends GetxController { } } - Future removeFromCart(CartItem item) async { + Future removeFromCart(CartItem item) async { cartList.remove(item); cartIdList.remove(item.cartId); total.value = total.value - (item.quantity * item.price); //remove cart_id from user cart list - _supabaseClient - .from('Users') - .update({ - 'cartList': cartIdList, - }) - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); + await _supabaseClient.from('Users').update({ + 'cartList': cartIdList, + }).eq("Uid", _supabaseClient.auth.currentUser!.id); //remove item from cart_items database await _supabaseClient .from('Cart_Items') - .delete(returning: ReturningOption.minimal) - .eq("cart_id", item.cartId) - .execute(); + .delete() + .eq("cart_id", item.cartId); } Future incrementQuantity(CartItem item) async { @@ -128,45 +115,36 @@ class CartController extends GetxController { total.value = total.value + item.price; await _supabaseClient .from('Cart_Items') - .update({'quantity': item.quantity}) - .eq("cart_id", item.cartId) - .execute(); + .update({'quantity': item.quantity}).eq("cart_id", item.cartId); update(); } Future decrementQuantity(CartItem item) async { if (item.quantity == 1) { - removeFromCart(item); + await removeFromCart(item); } else { item.removeQuantity(1); await _supabaseClient .from('Cart_Items') - .update({'quantity': item.quantity}) - .eq("cart_id", item.cartId) - .execute(); + .update({'quantity': item.quantity}).eq("cart_id", item.cartId); total.value = total.value - item.price; update(); } } - Future removeAllFromCart() async { + Future removeAllFromCart() async { cartList.clear(); //delete each cart entry from the database for (int i = 0; i < cartIdList.length; i++) { await _supabaseClient .from('Cart_Items') - .delete(returning: ReturningOption.minimal) - .eq("cart_id", cartIdList.elementAt(i)) - .execute(); + .delete() + .eq("cart_id", cartIdList.elementAt(i)); } cartIdList.clear(); //remove all the elements from the user cart - await _supabaseClient - .from('Users') - .update({ - 'cartList': [], - }) - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); + await _supabaseClient.from('Users').update({ + 'cartList': [], + }).eq("Uid", _supabaseClient.auth.currentUser!.id); } } diff --git a/lib/controllers/favorites_controller.dart b/lib/controllers/favorites_controller.dart index da6b6d9..1c12490 100644 --- a/lib/controllers/favorites_controller.dart +++ b/lib/controllers/favorites_controller.dart @@ -6,47 +6,40 @@ class FavoritesController extends GetxController { var favoritesList = [].obs; final _supabaseClient = Supabase.instance.client; - Future fetchFavorites() async { + Future fetchFavorites() async { final response = await _supabaseClient .from("Users") .select() - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); - List responseList = response.data[0]['favoritesList']; + .eq("Uid", _supabaseClient.auth.currentUser!.id); + List responseList = response[0]['favoritesList']; for (int i = 0; i < responseList.length; i++) { final productResponse = await _supabaseClient .from('Products') .select() - .eq("product_id", responseList[i]) - .execute(); - favoritesList.add(Product.fromJson(productResponse.data[0])); + .eq("product_id", responseList[i]); + favoritesList.add(Product.fromJson(productResponse[0])); } } - void updateDatabase() { - _supabaseClient - .from('Users') - .update({ - 'favoritesList': favoritesList - .map((favoriteItem) => favoriteItem.productId) - .toList() - }) - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); + Future updateDatabase() async { + await _supabaseClient.from('Users').update({ + 'favoritesList': + favoritesList.map((favoriteItem) => favoriteItem.productId).toList() + }).eq("Uid", _supabaseClient.auth.currentUser!.id); } - void addProduct(Product product) { + Future addProduct(Product product) async { favoritesList.add(product); - updateDatabase(); + await updateDatabase(); } - void removeProduct(Product product) { + Future removeProduct(Product product) async { favoritesList.remove(product); - updateDatabase(); + await updateDatabase(); } - void removeProductAt(int index) { + Future removeProductAt(int index) async { favoritesList.removeAt(index); - updateDatabase(); + await updateDatabase(); } } diff --git a/lib/controllers/home_controller.dart b/lib/controllers/home_controller.dart index 108367b..d938cbb 100644 --- a/lib/controllers/home_controller.dart +++ b/lib/controllers/home_controller.dart @@ -7,21 +7,20 @@ class HomeController extends GetxController { var selectedCategory = 0.obs; var productsList = [].obs; - void changeCategory(int categoryId) { + Future changeCategory(int categoryId) async { if (selectedCategory.value == categoryId) return; selectedCategory.value = categoryId; - getProducts(categoryId); + await getProducts(categoryId); } - Future getProducts(int categoryId) async { + Future getProducts(int categoryId) async { final response = (categoryId == 0) - ? await _supabaseInstance.client.from('Products').select().execute() + ? await _supabaseInstance.client.from('Products').select() : await _supabaseInstance.client .from('Products') .select() - .eq('categoryId', categoryId) - .execute(); - List responseList = response.data; + .eq('categoryId', categoryId); + List responseList = response; productsList.value = responseList .map((productResponse) => Product.fromJson(productResponse)) .toList(); diff --git a/lib/controllers/payment_controller.dart b/lib/controllers/payment_controller.dart index b30976f..375902f 100644 --- a/lib/controllers/payment_controller.dart +++ b/lib/controllers/payment_controller.dart @@ -16,7 +16,7 @@ class PaymentController extends GetxController { _razorpay.clear(); } - void openCheckout(int orderAmount) async { + void openCheckout(int orderAmount) { _razorpay = Razorpay(); _razorpay.on(Razorpay.EVENT_PAYMENT_SUCCESS, _handlePaymentSuccess); _razorpay.on(Razorpay.EVENT_PAYMENT_ERROR, _handlePaymentError); @@ -43,8 +43,8 @@ class PaymentController extends GetxController { } } - void _handlePaymentSuccess(PaymentSuccessResponse response) { - _cartController.removeAllFromCart(); + Future _handlePaymentSuccess(PaymentSuccessResponse response) async { + await _cartController.removeAllFromCart(); Get.off( () => const OrderSuccessScreen(), transition: Transition.cupertino, diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index cc86a76..6d43e66 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -3,19 +3,19 @@ import 'package:image_picker/image_picker.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import 'package:timberr/constants.dart'; import 'package:timberr/models/user_data.dart'; +import 'package:timberr/screens/authentication/onboarding_welcome.dart'; class UserController extends GetxController { final _supabaseClient = Supabase.instance.client; UserData userData = UserData(); - Future fetchUserData() async { + Future fetchUserData() async { final response = await _supabaseClient .from("Users") .select( "Name, Email, profile_picture_url, sales_notification, delivery_status_notification, new_arrivals_notification") - .eq("Uid", _supabaseClient.auth.user()?.id) - .execute(); - userData = UserData.fromJson(response.data[0]); + .eq("Uid", _supabaseClient.auth.currentUser!.id); + userData = UserData.fromJson(response[0]); update(); } @@ -23,14 +23,15 @@ class UserController extends GetxController { kDefaultDialog( "Sign out", "Are you sure you want to sign out?", - onYesPressed: () { - _supabaseClient.auth.signOut(); - Get.deleteAll(force: true); + onYesPressed: () async { + await _supabaseClient.auth.signOut(); + await Get.deleteAll(force: true); + Get.offAll(() => const OnBoardingWelcomeScreen()); }, ); } - Future uploadProfilePicture() async { + Future uploadProfilePicture() async { bool exit = true; await kDefaultDialog( "Change Picture", @@ -49,21 +50,18 @@ class UserController extends GetxController { } final bytes = await imageFile.readAsBytes(); final fileExt = imageFile.path.split('.').last; - final filePath = '${_supabaseClient.auth.currentUser?.id}.$fileExt'; - final response = - await _supabaseClient.storage.from('profile-pics').uploadBinary( - filePath, - bytes, - fileOptions: const FileOptions(upsert: true), - ); - if (response.hasError) { - return; - } + final filePath = '${_supabaseClient.auth.currentUser!.id}.$fileExt'; + await _supabaseClient.storage.from('profile-pics').uploadBinary( + filePath, + bytes, + fileOptions: const FileOptions(upsert: true), + ); + //TODO: Handle Upload Profile pic Error final imageUrlResponse = _supabaseClient.storage.from('profile-pics').getPublicUrl(filePath); //update profile picture url - userData.profilePictureUrl = imageUrlResponse.data; + userData.profilePictureUrl = imageUrlResponse; if (userData.profilePictureUrl != null) { userData.profilePictureUrl = "${userData.profilePictureUrl!}?v=${DateTime.now().toIso8601String()}"; @@ -71,49 +69,41 @@ class UserController extends GetxController { update(); await _supabaseClient .from("Users") - .update({"profile_picture_url": imageUrlResponse.data}) - .eq("Uid", _supabaseClient.auth.currentUser?.id) - .execute(); + .update({"profile_picture_url": imageUrlResponse}).eq( + "Uid", _supabaseClient.auth.currentUser!.id); } - Future setSalesNotification(bool val) async { + Future setSalesNotification(bool val) async { userData.salesNotification = val; update(); - await _supabaseClient - .from("Users") - .update({"sales_notification": val}) - .eq("Uid", _supabaseClient.auth.user()?.id) - .execute(); + await _supabaseClient.from("Users").update({"sales_notification": val}).eq( + "Uid", _supabaseClient.auth.currentUser!.id); } - Future setDeliveryStatusNotification(bool val) async { + Future setDeliveryStatusNotification(bool val) async { userData.deliveryStatusNotification = val; update(); await _supabaseClient .from("Users") - .update({"delivery_status_notification": val}) - .eq("Uid", _supabaseClient.auth.user()?.id) - .execute(); + .update({"delivery_status_notification": val}).eq( + "Uid", _supabaseClient.auth.currentUser!.id); } - Future setNewArrivalsNotification(bool val) async { + Future setNewArrivalsNotification(bool val) async { userData.newArrivalsNotification = val; update(); await _supabaseClient .from("Users") - .update({"new_arrivals_notification": val}) - .eq("Uid", _supabaseClient.auth.user()?.id) - .execute(); + .update({"new_arrivals_notification": val}).eq( + "Uid", _supabaseClient.auth.currentUser!.id); } - Future setName(String name) async { + Future setName(String name) async { userData.name = name; update(); await _supabaseClient .from("Users") - .update({"Name": name}) - .eq("Uid", _supabaseClient.auth.user()?.id) - .execute(); + .update({"Name": name}).eq("Uid", _supabaseClient.auth.currentUser!.id); Get.back(); } @@ -123,7 +113,7 @@ class UserController extends GetxController { "Are you sure do you want to change your password?", onYesPressed: () async { Get.back(); - await _supabaseClient.auth.api.resetPasswordForEmail(userData.email); + await _supabaseClient.auth.resetPasswordForEmail(userData.email); Get.snackbar("Reset Password", "Your Password reset request has been sent to your email successfully"); }, diff --git a/lib/main.dart b/lib/main.dart index 04662f3..83da7dc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -26,6 +26,7 @@ class TimberrApp extends StatelessWidget { return GetMaterialApp( debugShowCheckedModeBanner: false, theme: ThemeData( + useMaterial3: false, fontFamily: "NunitoSans", appBarTheme: const AppBarTheme(color: Colors.white, elevation: 0), scaffoldBackgroundColor: Colors.white, diff --git a/lib/screens/cart/order_success_screen.dart b/lib/screens/cart/order_success_screen.dart index fa08a7d..08d1715 100644 --- a/lib/screens/cart/order_success_screen.dart +++ b/lib/screens/cart/order_success_screen.dart @@ -26,8 +26,9 @@ class OrderSuccessScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: () async => false, + return PopScope( + canPop: false, + onPopInvoked: (_) => kOnExitConfirmation(), child: Scaffold( body: Center( child: Padding( @@ -86,7 +87,8 @@ class OrderSuccessScreen extends StatelessWidget { child: OutlinedButton( onPressed: _offToHome, style: OutlinedButton.styleFrom( - foregroundColor: kOffBlack, side: const BorderSide(color: kOffBlack), + foregroundColor: kOffBlack, + side: const BorderSide(color: kOffBlack), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), diff --git a/lib/screens/favorite_screen.dart b/lib/screens/favorite_screen.dart index ab710b8..91e5dce 100644 --- a/lib/screens/favorite_screen.dart +++ b/lib/screens/favorite_screen.dart @@ -33,7 +33,7 @@ class FavoriteScreen extends StatelessWidget { onTap: (_) { Get.closeCurrentSnackbar(); Get.to( - CartScreen(), + () => CartScreen(), transition: Transition.fadeIn, duration: const Duration(milliseconds: 600), ); @@ -43,8 +43,9 @@ class FavoriteScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: kOnExitConfirmation, + return PopScope( + canPop: false, + onPopInvoked: (_) => kOnExitConfirmation(), child: Scaffold( appBar: AppBar( leading: IconButton( @@ -100,7 +101,8 @@ class FavoriteScreen extends StatelessWidget { child: ElevatedButton( onPressed: _addAllToCart, style: ElevatedButton.styleFrom( - elevation: 8, backgroundColor: kOffBlack, + elevation: 8, + backgroundColor: kOffBlack, minimumSize: const Size(50, 50), shadowColor: kOffBlack, shape: RoundedRectangleBorder( diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 9cd4ae4..67f4cf9 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -21,8 +21,9 @@ class Home extends StatelessWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: kOnExitConfirmation, + return PopScope( + canPop: false, + onPopInvoked: (_) => kOnExitConfirmation(), child: Scaffold( bottomNavigationBar: const BottomNavBar( selectedPos: 0, @@ -37,8 +38,7 @@ class Home extends StatelessWidget { context: context, delegate: ProductSearchDelegate()); }, icon: SvgPicture.asset( - 'assets/icons/search_icon.svg', - color: kGrey, + 'assets/icons/search_icon_grey.svg', ), ), title: Column( @@ -63,8 +63,7 @@ class Home extends StatelessWidget { IconButton( onPressed: _onCartTap, icon: SvgPicture.asset( - 'assets/icons/cart_icon.svg', - color: kGrey, + 'assets/icons/cart_icon_grey.svg', ), ) ], diff --git a/lib/screens/input/edit_shipping_screen.dart b/lib/screens/input/edit_shipping_screen.dart index 4a6fa95..1e68aa7 100644 --- a/lib/screens/input/edit_shipping_screen.dart +++ b/lib/screens/input/edit_shipping_screen.dart @@ -204,7 +204,8 @@ class EditShippingScreen extends StatelessWidget { child: OutlinedButton( onPressed: _deleteAddress, style: OutlinedButton.styleFrom( - foregroundColor: kOffBlack, side: const BorderSide(color: kFireOpal), + foregroundColor: kOffBlack, + side: const BorderSide(color: kFireOpal), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), diff --git a/lib/screens/notification_screen.dart b/lib/screens/notification_screen.dart index 2982b00..6eba3a4 100644 --- a/lib/screens/notification_screen.dart +++ b/lib/screens/notification_screen.dart @@ -8,8 +8,9 @@ class NotificationScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: kOnExitConfirmation, + return PopScope( + canPop: false, + onPopInvoked: (_) => kOnExitConfirmation(), child: Scaffold( appBar: AppBar( title: const Text( diff --git a/lib/screens/product/product_screen.dart b/lib/screens/product/product_screen.dart index a96920d..373e9dd 100644 --- a/lib/screens/product/product_screen.dart +++ b/lib/screens/product/product_screen.dart @@ -224,12 +224,11 @@ class ProductScreen extends StatelessWidget { ), child: SvgPicture.asset( (index == -1) - ? 'assets/icons/favorite_icon.svg' + ? 'assets/icons/favorite_icon_black.svg' : 'assets/icons/favorite_selected_icon.svg', height: 24, width: 24, fit: BoxFit.scaleDown, - color: kOffBlack, ), ), ); diff --git a/lib/screens/profile/edit_personal_info_screen.dart b/lib/screens/profile/edit_personal_info_screen.dart index 906d99d..9b7b628 100644 --- a/lib/screens/profile/edit_personal_info_screen.dart +++ b/lib/screens/profile/edit_personal_info_screen.dart @@ -99,7 +99,8 @@ class _EditPersonalInformationScreenState Get.back(); }, style: OutlinedButton.styleFrom( - foregroundColor: kOffBlack, side: const BorderSide(color: kFireOpal), + foregroundColor: kOffBlack, + side: const BorderSide(color: kFireOpal), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), ), diff --git a/lib/screens/profile/profile_screen.dart b/lib/screens/profile/profile_screen.dart index 5333e09..abefabc 100644 --- a/lib/screens/profile/profile_screen.dart +++ b/lib/screens/profile/profile_screen.dart @@ -65,8 +65,9 @@ class ProfileScreen extends StatelessWidget { @override Widget build(BuildContext context) { - return WillPopScope( - onWillPop: kOnExitConfirmation, + return PopScope( + canPop: false, + onPopInvoked: (_) => kOnExitConfirmation(), child: Scaffold( appBar: AppBar( leading: IconButton( @@ -90,7 +91,6 @@ class ProfileScreen extends StatelessWidget { }, icon: SvgPicture.asset( "assets/icons/logout_icon.svg", - color: kGraniteGrey, ), ), ], diff --git a/lib/services/search_service.dart b/lib/services/search_service.dart index fe0fdfd..4b6049b 100644 --- a/lib/services/search_service.dart +++ b/lib/services/search_service.dart @@ -6,9 +6,8 @@ class SearchService { final response = await _supabaseClient .from('Products') .select() - .textSearch("name", "'$query'") - .execute(); - List responseList = response.data; + .textSearch("name", "'$query'"); + List responseList = response; return responseList; } } diff --git a/lib/widgets/tiles/favorite_list_tile.dart b/lib/widgets/tiles/favorite_list_tile.dart index 2c9edf5..fb38138 100644 --- a/lib/widgets/tiles/favorite_list_tile.dart +++ b/lib/widgets/tiles/favorite_list_tile.dart @@ -109,10 +109,9 @@ class FavoriteListTile extends StatelessWidget { borderRadius: BorderRadius.circular(10), ), child: SvgPicture.asset( - "assets/icons/shopping_bag_icon.svg", + "assets/icons/shopping_bag_icon_black.svg", height: 16, width: 16, - color: kOffBlack, ), ), ), diff --git a/lib/wrapper.dart b/lib/wrapper.dart index 318f36a..b8a7a44 100644 --- a/lib/wrapper.dart +++ b/lib/wrapper.dart @@ -18,34 +18,21 @@ class Wrapper extends StatefulWidget { State createState() => _WrapperState(); } -class _WrapperState extends AuthState { +class _WrapperState extends State { @override void initState() { - recoverSupabaseSession(); super.initState(); + _redirect(); } - @override - Widget build(BuildContext context) { - return const Scaffold( - body: Center( - child: CircularProgressIndicator(color: kOffBlack), - ), - ); - } -} - -class AuthState extends SupabaseAuthState { - @override - void onUnauthenticated() { - if (mounted) { - Get.off(() => const OnBoardingWelcomeScreen()); + Future _redirect() async { + await Future.delayed(Duration.zero); + if (!mounted) { + return; } - } - @override - void onAuthenticated(Session session) { - if (mounted) { + final session = Supabase.instance.client.auth.currentSession; + if (session != null) { Get.put(HomeController()); Get.put(FavoritesController()); Get.put(CartController()); @@ -53,14 +40,15 @@ class AuthState extends SupabaseAuthState { Get.put(AddressController()); Get.put(CardDetailsController()); Get.to(() => SplashScreen(), transition: Transition.fadeIn); + } else { + Get.off(() => const OnBoardingWelcomeScreen()); } } @override - void onPasswordRecovery(Session session) {} - - @override - void onErrorAuthenticating(String message) { - kDefaultDialog("Error", message); + Widget build(BuildContext context) { + return const Scaffold( + body: Center(child: CircularProgressIndicator(color: kOffBlack)), + ); } } diff --git a/pubspec.lock b/pubspec.lock index 73a9694..9fd2804 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,14 +1,22 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + app_links: + dependency: transitive + description: + name: app_links + sha256: "4e392b5eba997df356ca6021f28431ce1cfeb16758699553a94b13add874a3bb" + url: "https://pub.dev" + source: hosted + version: "3.5.0" archive: dependency: transitive description: name: archive - sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" + sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" url: "https://pub.dev" source: hosted - version: "3.4.9" + version: "3.4.10" args: dependency: transitive description: @@ -37,26 +45,26 @@ packages: dependency: "direct main" description: name: cached_network_image - sha256: f98972704692ba679db144261172a8e20feb145636c617af0eb4022132a6797f + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" cached_network_image_platform_interface: dependency: transitive description: name: cached_network_image_platform_interface - sha256: "56aa42a7a01e3c9db8456d9f3f999931f1e05535b5a424271e9a38cabf066613" + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" cached_network_image_web: dependency: transitive description: name: cached_network_image_web - sha256: "759b9a9f8f6ccbb66c185df805fac107f05730b1dab9c64626d1008cca532257" + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" characters: dependency: transitive description: @@ -157,10 +165,10 @@ packages: dependency: transitive description: name: file_selector_platform_interface - sha256: "0aa47a725c346825a2bd396343ce63ac00bda6eff2fbc43eabe99737dede8262" + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b url: "https://pub.dev" source: hosted - version: "2.6.1" + version: "2.6.2" file_selector_windows: dependency: transitive description: @@ -169,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.9.3+1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -228,10 +244,10 @@ packages: dependency: transitive description: name: functions_client - sha256: "6884036c71760ebcf3031273347522cf0ff0bc98d586455be56709b28b242c86" + sha256: "9a0ab83a525c8691a6724746e642de755a299afa04158807787364cd9e718001" url: "https://pub.dev" source: hosted - version: "0.0.1-dev.5" + version: "2.0.0" get: dependency: "direct main" description: @@ -244,10 +260,18 @@ packages: dependency: transitive description: name: gotrue - sha256: "56ffab7a8c63db55608dcade0f8113ecca7d2b0fbf0b1f52df731a6acedcb150" + sha256: f40610bacf1074723354b0856a4f586508ffb075b799f72466f34e843133deb9 + url: "https://pub.dev" + source: hosted + version: "2.5.0" + gtk: + dependency: transitive + description: + name: gtk + sha256: e8ce9ca4b1df106e4d72dad201d345ea1a036cc12c360f1a7d5a758f78ffa42c url: "https://pub.dev" source: hosted - version: "0.2.3" + version: "2.1.0" hive: dependency: transitive description: @@ -268,10 +292,10 @@ packages: dependency: transitive description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "1.2.0" http_parser: dependency: transitive description: @@ -284,34 +308,34 @@ packages: dependency: "direct main" description: name: image_picker - sha256: fc712337719239b0b6e41316aa133350b078fa39b6cbd706b61f3fd421b03c77 + sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" url: "https://pub.dev" source: hosted - version: "1.0.5" + version: "1.0.7" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: ecdc963d2aa67af5195e723a40580f802d4392e31457a12a562b3e2bd6a396fe + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" url: "https://pub.dev" source: hosted - version: "0.8.9+1" + version: "0.8.9+3" image_picker_for_web: dependency: transitive description: name: image_picker_for_web - sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7" + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" image_picker_ios: dependency: transitive description: name: image_picker_ios - sha256: eac0a62104fa12feed213596df0321f57ce5a572562f72a68c4ff81e9e4caacf + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 url: "https://pub.dev" source: hosted - version: "0.8.9" + version: "0.8.9+1" image_picker_linux: dependency: transitive description: @@ -332,10 +356,10 @@ packages: dependency: transitive description: name: image_picker_platform_interface - sha256: ed9b00e63977c93b0d2d2b343685bed9c324534ba5abafbb3dfbd6a780b1b514 + sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b url: "https://pub.dev" source: hosted - version: "2.9.1" + version: "2.9.3" image_picker_windows: dependency: transitive description: @@ -348,10 +372,10 @@ packages: dependency: transitive description: name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + sha256: "4186c61b32f99e60f011f7160e32c89a758ae9b1d0c6d28e2c02ef0382300e2b" url: "https://pub.dev" source: hosted - version: "0.6.7" + version: "0.7.0" jwt_decode: dependency: transitive description: @@ -372,10 +396,10 @@ packages: dependency: "direct main" description: name: lottie - sha256: a93542cc2d60a7057255405f62252533f8e8956e7e06754955669fd32fb4b216 + sha256: "1f0ce68112072d66ea271a9841994fa8d16442e23d8cf8996c9fa74174e58b4e" url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "3.0.0" matcher: dependency: transitive description: @@ -404,10 +428,10 @@ packages: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" octo_image: dependency: transitive description: @@ -452,26 +476,26 @@ packages: dependency: transitive description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.2" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.3.2" path_provider_linux: dependency: transitive description: @@ -484,10 +508,10 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: @@ -508,50 +532,58 @@ packages: dependency: transitive description: name: platform - sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.7" + version: "2.1.8" pointycastle: dependency: transitive description: name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" + sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" url: "https://pub.dev" source: hosted - version: "3.7.3" + version: "3.7.4" postgrest: dependency: transitive description: name: postgrest - sha256: f8af0d0d8945368e0b55e9973700597794dea53922d0c873aba8cf74682cfd36 + sha256: "748ebffffb60b4eaa270955dcf3742a19a2b315344c41ff1b4a0ebcd322b5181" url: "https://pub.dev" source: hosted - version: "0.1.11" + version: "2.1.0" razorpay_flutter: dependency: "direct main" description: name: razorpay_flutter - sha256: d73a536032f6939f0a6706cff958904d471eb1acb3dc957c8cc4e1628f0fbc28 + sha256: eadd633997183286e924157ce5033f3b3d953530632f3e3c6057dc7b1f605fb7 url: "https://pub.dev" source: hosted - version: "1.3.5" + version: "1.3.6" realtime_client: dependency: transitive description: name: realtime_client - sha256: "1612344aeae1d7db81725d0b8c044c13578ab563512a4cbd9ceec4ff130f002d" + sha256: "5831636c19802ba936093a35a7c5b745b130e268fa052e84b4b5290139d2ae03" url: "https://pub.dev" source: hosted - version: "0.1.15+1" + version: "2.0.0" + retry: + dependency: transitive + description: + name: retry + sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc" + url: "https://pub.dev" + source: hosted + version: "3.1.2" rxdart: dependency: transitive description: @@ -560,6 +592,62 @@ packages: url: "https://pub.dev" source: hosted version: "0.27.7" + shared_preferences: + dependency: transitive + description: + name: shared_preferences + sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" sky_engine: dependency: transitive description: flutter @@ -585,18 +673,18 @@ packages: dependency: transitive description: name: sqflite - sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" + sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.3.2" sqflite_common: dependency: transitive description: name: sqflite_common - sha256: bb4738f15b23352822f4c42a531677e5c6f522e079461fd240ead29d8d8a54a6 + sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" url: "https://pub.dev" source: hosted - version: "2.5.0+2" + version: "2.5.3" stack_trace: dependency: transitive description: @@ -609,10 +697,10 @@ packages: dependency: transitive description: name: storage_client - sha256: e1bf4d723834902682e6e85611a05ba96f7291bdd45b37245ae0e39b99cff093 + sha256: bf5589d5de61a2451edb1b8960a0e673d4bb5c42ecc4dddf7c051a93789ced34 url: "https://pub.dev" source: hosted - version: "0.0.6+2" + version: "2.0.1" stream_channel: dependency: transitive description: @@ -633,18 +721,18 @@ packages: dependency: transitive description: name: supabase - sha256: "8ede1cf6a3662abf7eda9330f4ee1f025329c110378df4282754d8cbdb03d89b" + sha256: "4bce9c49f264f4cd44b4ffc895647af2dca0c40125c169045be9f708fd2a2a40" url: "https://pub.dev" source: hosted - version: "0.3.6" + version: "2.0.7" supabase_flutter: dependency: "direct main" description: name: supabase_flutter - sha256: a1b0e0cc4a861b71c54c039cc04b9b46d14c797a8aaf68c1e252d273e5ef487c + sha256: "32597ffe9993bc47bc5a2020421b1940e634ea4293cff80385fa67fb9fff46d6" url: "https://pub.dev" source: hosted - version: "0.3.3" + version: "2.3.2" synchronized: dependency: transitive description: @@ -677,62 +765,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" - uni_links: - dependency: transitive - description: - name: uni_links - sha256: "051098acfc9e26a9fde03b487bef5d3d228ca8f67693480c6f33fd4fbb8e2b6e" - url: "https://pub.dev" - source: hosted - version: "0.5.1" - uni_links_platform_interface: - dependency: transitive - description: - name: uni_links_platform_interface - sha256: "929cf1a71b59e3b7c2d8a2605a9cf7e0b125b13bc858e55083d88c62722d4507" - url: "https://pub.dev" - source: hosted - version: "1.0.0" - uni_links_web: - dependency: transitive - description: - name: uni_links_web - sha256: "7539db908e25f67de2438e33cc1020b30ab94e66720b5677ba6763b25f6394df" - url: "https://pub.dev" - source: hosted - version: "0.1.0" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" - source: hosted - version: "2.2.2" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: e9aa5ea75c84cf46b3db4eea212523591211c3cf2e13099ee4ec147f54201c86 + sha256: c512655380d241a337521703af62d2c122bf7b77a46ff7dd750092aa9433499c url: "https://pub.dev" source: hosted - version: "6.2.2" + version: "6.2.4" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.2.2" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.2.4" url_launcher_linux: dependency: transitive description: @@ -753,18 +809,18 @@ packages: dependency: transitive description: name: url_launcher_platform_interface - sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + sha256: a932c3a8082e118f80a475ce692fde89dc20fddb24c57360b96bc56f7035de1f url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.1" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "7286aec002c8feecc338cc33269e96b73955ab227456e9fb2a91f7fab8a358e9" + sha256: fff0932192afeedf63cdd50ecbb1bc825d31aed259f02bb8dba0f3b729a5e88b url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.2.3" url_launcher_windows: dependency: transitive description: @@ -777,34 +833,34 @@ packages: dependency: transitive description: name: uuid - sha256: "22c94e5ad1e75f9934b766b53c742572ee2677c56bc871d850a57dad0f82127f" + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 url: "https://pub.dev" source: hosted - version: "4.2.2" + version: "4.3.3" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: "0f0c746dd2d6254a0057218ff980fc7f5670fd0fcf5e4db38a490d31eed4ad43" + sha256: "18f6690295af52d081f6808f2f7c69f0eed6d7e23a71539d75f4aeb8f0062172" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "0edf6d630d1bfd5589114138ed8fada3234deacc37966bec033d3047c29248b7" + sha256: "531d20465c10dfac7f5cd90b60bbe4dd9921f1ec4ca54c83ebb176dbacb7bb2d" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: d24333727332d9bd20990f1483af4e09abdb9b1fc7c3db940b56ab5c42790c26 + sha256: "03012b0a33775c5530576b70240308080e1d5050f0faf000118c20e6463bc0ad" url: "https://pub.dev" source: hosted - version: "1.1.9+1" + version: "1.1.9+2" vector_math: dependency: transitive description: @@ -833,18 +889,18 @@ packages: dependency: transitive description: name: win32 - sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "5.2.0" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.0.4" xml: dependency: transitive description: @@ -853,6 +909,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.5.0" + yet_another_json_isolate: + dependency: transitive + description: + name: yet_another_json_isolate + sha256: e727502a2640d65b4b8a8a6cb48af9dd0cbe644ba4b3ee667c7f4afa0c1d6069 + url: "https://pub.dev" + source: hosted + version: "2.0.0" sdks: dart: ">=3.2.3 <4.0.0" flutter: ">=3.16.0" diff --git a/pubspec.yaml b/pubspec.yaml index b509015..d20d61a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: A furniture shopping app made using Flutter, Firebase and Getx stat publish_to: 'none' -version: 1.0.0+1 +version: 2.0.0+2 environment: sdk: '>=3.2.3 <4.0.0' @@ -12,13 +12,13 @@ dependencies: flutter: sdk: flutter get: ^4.6.6 - supabase_flutter: ^0.3.1+2 + supabase_flutter: ^2.3.2 flutter_svg: ^2.0.9 - cached_network_image: ^3.3.0 - lottie: ^2.7.0 - url_launcher: ^6.2.2 - image_picker: ^1.0.5 - razorpay_flutter: ^1.3.5 + cached_network_image: ^3.3.1 + lottie: ^3.0.0 + url_launcher: ^6.2.4 + image_picker: ^1.0.7 + razorpay_flutter: ^1.3.6 dev_dependencies: flutter_test: