Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions lib/core/routs.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@ import 'package:ecommerce/features/auth/presentation/pages/forgetPassowrd/forget
import 'package:ecommerce/features/auth/presentation/pages/login/login_view.dart';
import 'package:ecommerce/features/auth/presentation/pages/otp/otp_view.dart';
import 'package:ecommerce/features/auth/presentation/pages/registration/registeration_view.dart';
import 'package:ecommerce/features/cart/cart_view.dart';
import 'package:flutter/widgets.dart';
import '../features/home/home_view.dart';
import '../features/onBoarding/on_boarding_view.dart';
import '../features/productDetails/product_view.dart';
import '../features/splash/splash_view.dart';

final Map<String, WidgetBuilder> routes = {
'/': (ctx) => const SplashView(),
OnBoardingView.routName: (ctx) => const OnBoardingView(),
LoginView.routName: (ctx) => const LoginView(),
ForgetPasswordView.routName:(ctx)=> const ForgetPasswordView(),
RegistrationView.routName:(ctx)=>const RegistrationView(),
OtpView.routName:(ctx)=>const OtpView(),
ForgetPasswordView.routName: (ctx) => const ForgetPasswordView(),
RegistrationView.routName: (ctx) => const RegistrationView(),
OtpView.routName: (ctx) => const OtpView(),
HomeView.routName: (ctx) => const HomeView(),
ProductDetailsView.routName: (ctx) => const ProductDetailsView(),
CartView.routName: (ctx) => const CartView(),
};
32 changes: 32 additions & 0 deletions lib/core/widgets/Custom_search_field.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// ignore_for_file: file_names, use_key_in_widget_constructors

import 'package:flutter/material.dart';
import '../constants.dart';
import '../utils/size_config.dart';

class BuildSearchProduct extends StatelessWidget {
const BuildSearchProduct({Key? key}) ;

@override
Widget build(BuildContext context) {
return Container(
width: SizeConfig.screenWidth * 0.6,
decoration: BoxDecoration(
color: kSecondaryColor.withOpacity(0.1),
borderRadius: BorderRadius.circular(20)),
child: TextField(
onChanged: (value) {
//search value
},
decoration: InputDecoration(
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
hintText: "Search Product",
prefixIcon: const Icon(Icons.search),
contentPadding: EdgeInsets.symmetric(
horizontal: getProportionateScreenWidth(20),
vertical: getProportionateScreenWidth(10))),
),
);
}
}
73 changes: 73 additions & 0 deletions lib/core/widgets/custom_app_bar.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// ignore_for_file: prefer_const_constructors_in_immutables, use_key_in_widget_constructors

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

import '../constants.dart';
import '../utils/size_config.dart';

class CustomAppBar extends StatelessWidget {
final double rating;

CustomAppBar({required this.rating});

// AppBar().preferredSize.height provide us the height that appy on our app bar
Size get preferredSize => Size.fromHeight(AppBar().preferredSize.height);

@override
Widget build(BuildContext context) {
return SafeArea(
child: Padding(
padding:
EdgeInsets.symmetric(horizontal: getProportionateScreenWidth(20)),
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(top: 5),
child: SizedBox(
height: getProportionateScreenWidth(40),
width: getProportionateScreenWidth(40),
child: TextButton(
style: TextButton.styleFrom(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(60),
),
primary: kPrimaryColor,
backgroundColor: Colors.white,
padding: EdgeInsets.zero,
),
onPressed: () => Navigator.pop(context),
child: SvgPicture.asset(
"assets/icons/Back ICon.svg",
height: 15,
),
),
),
),
const Spacer(),
Container(
padding: const EdgeInsets.symmetric(horizontal: 14, vertical: 5),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(14),
),
child: Row(
children: [
Text(
"$rating",
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
),
),
const SizedBox(width: 5),
SvgPicture.asset("assets/icons/Star Icon.svg"),
],
),
)
],
),
),
);
}
}
2 changes: 2 additions & 0 deletions lib/core/widgets/custom_button.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:flutter/material.dart';

import '../constants.dart';
Expand Down
62 changes: 62 additions & 0 deletions lib/core/widgets/custom_icon_btn_with_counter.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';

import '../constants.dart';
import '../utils/size_config.dart';

class CustomIconBtnWithCounter extends StatelessWidget {
const CustomIconBtnWithCounter({
Key? key,required this.onTap,required this.iconPath,this.numOfItems = 0,
});
final GestureTapCallback? onTap;
final String? iconPath;
final int? numOfItems;

@override
Widget build(BuildContext context) {
return InkWell(
onTap: onTap,
borderRadius: BorderRadius.circular(50),
child: Stack(
children: [
Container(
padding: EdgeInsets.all(getProportionateScreenWidth(12)),
width: getProportionateScreenWidth(46),
height: getProportionateScreenWidth(46),
decoration: BoxDecoration(
color: kSecondaryColor.withOpacity(0.1),
shape: BoxShape.circle,
),
child: SvgPicture.asset(iconPath!),
),
if(numOfItems!=0)
Positioned(
top: -2,
right: -1,
child: Container(
width: getProportionateScreenWidth(16),
height: getProportionateScreenWidth(16),
decoration: BoxDecoration(
color: const Color(0xffff4848),
shape: BoxShape.circle,
border: Border.all(width: 1.5, color: Colors.white),
),
child: Text(
"$numOfItems",
style: TextStyle(
color: Colors.white,
height: 1.3,
fontSize: getProportionateScreenWidth(10),
fontWeight: FontWeight.bold
),
textAlign: TextAlign.center,
),
),
),
],
),
);
}
}
48 changes: 48 additions & 0 deletions lib/core/widgets/custom_icon_button.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:flutter/material.dart';

import '../../../../../core/utils/size_config.dart';
import '../constants.dart';

class CustomIconButton extends StatelessWidget {
const CustomIconButton(
{Key? key,
required this.icon,
required this.press,
this.showShadow = false,});

final IconData icon;
final GestureTapCancelCallback press;
final bool showShadow;

@override
Widget build(BuildContext context) {
return Container(
height: getProportionateScreenWidth(40),
width: getProportionateScreenWidth(40),
decoration: BoxDecoration(
shape: BoxShape.circle,
boxShadow: [
if (showShadow)
BoxShadow(
offset: const Offset(0, 6),
blurRadius: 10,
color: const Color(0xFFB0B0B0).withOpacity(0.2),
),
],
),
child: TextButton(
style: TextButton.styleFrom(
padding: EdgeInsets.zero,
primary: kPrimaryColor,
backgroundColor: Colors.white,
shape:
RoundedRectangleBorder(borderRadius: BorderRadius.circular(50)),
),
onPressed: press,
child: Icon(icon),
),
);
}
}
2 changes: 2 additions & 0 deletions lib/core/widgets/custom_soical_icon.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:ecommerce/core/utils/size_config.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
Expand Down
3 changes: 3 additions & 0 deletions lib/core/widgets/custom_text_form_field.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:ecommerce/core/utils/size_config.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
Expand Down Expand Up @@ -37,6 +39,7 @@ class _TextFormFieldContentState extends State<TextFormFieldContent> {
} else {
return null;
}
return null;
},
decoration: InputDecoration(
labelText: widget.labelTxt,
Expand Down
4 changes: 3 additions & 1 deletion lib/core/widgets/form_error.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
// ignore_for_file: use_key_in_widget_constructors

import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';

Expand All @@ -6,7 +8,7 @@ class FormError extends StatelessWidget {
const FormError({
Key? key,
required this.errors,
}) : super(key: key);
});

final List<String?> errors;

Expand Down
16 changes: 16 additions & 0 deletions lib/features/auth/presentation/manger/models/cart.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'Product.dart';

class Cart {
final Product product;
final int numOfItem;

Cart({required this.product, required this.numOfItem});
}

// Demo data for our cart

List<Cart> demoCarts = [
Cart(product: demoProducts[0], numOfItem: 2),
Cart(product: demoProducts[1], numOfItem: 1),
Cart(product: demoProducts[3], numOfItem: 1),
];
Loading