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
+## ποΈ 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: