parent
e4d998cf43
commit
e054f2eb92
@ -1,94 +1,223 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:supplier_new/common/settings.dart';
|
||||
|
||||
class SearchOrderAppBar extends StatelessWidget implements PreferredSizeWidget {
|
||||
class SearchOrderAppBar extends StatefulWidget implements PreferredSizeWidget {
|
||||
|
||||
final TextEditingController controller;
|
||||
final VoidCallback onBack;
|
||||
final VoidCallback onHelp;
|
||||
final Function(String)? onSearch;
|
||||
|
||||
const SearchOrderAppBar({
|
||||
super.key,
|
||||
required this.controller,
|
||||
required this.onBack,
|
||||
required this.onHelp,
|
||||
required this.onSearch,
|
||||
});
|
||||
|
||||
@override
|
||||
State<SearchOrderAppBar> createState() => _SearchOrderAppBarState();
|
||||
|
||||
@override
|
||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
||||
|
||||
}
|
||||
|
||||
class _SearchOrderAppBarState extends State<SearchOrderAppBar>{
|
||||
|
||||
late VoidCallback _listener;
|
||||
|
||||
@override
|
||||
void initState(){
|
||||
|
||||
super.initState();
|
||||
|
||||
_listener = (){
|
||||
|
||||
if(!mounted) return;
|
||||
|
||||
setState((){});
|
||||
|
||||
};
|
||||
|
||||
widget.controller.addListener(_listener);
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose(){
|
||||
|
||||
widget.controller.removeListener(_listener);
|
||||
|
||||
super.dispose();
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
return AppBar(
|
||||
|
||||
backgroundColor: Colors.white,
|
||||
|
||||
scrolledUnderElevation: 0,
|
||||
|
||||
elevation: 0,
|
||||
|
||||
leading: GestureDetector(
|
||||
onTap: onBack, // 👉 Controlled by parent
|
||||
|
||||
onTap: widget.onBack,
|
||||
|
||||
child: Padding(
|
||||
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
|
||||
child: Image.asset(
|
||||
|
||||
'images/backbutton_appbar.png',
|
||||
|
||||
height: 24,
|
||||
|
||||
width: 24,
|
||||
|
||||
fit: BoxFit.contain,
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
titleSpacing: 0,
|
||||
|
||||
title: Container(
|
||||
|
||||
height: 40,
|
||||
|
||||
decoration: BoxDecoration(
|
||||
|
||||
color: Colors.white,
|
||||
|
||||
borderRadius: BorderRadius.circular(22),
|
||||
|
||||
border: Border.all(color: const Color(0XFF939495)),
|
||||
|
||||
),
|
||||
|
||||
child: TextField(
|
||||
controller: controller,
|
||||
|
||||
controller: widget.controller,
|
||||
|
||||
onChanged: widget.onSearch,
|
||||
|
||||
decoration: InputDecoration(
|
||||
|
||||
hintText: "Search order",
|
||||
|
||||
hintStyle: fontTextStyle(
|
||||
|
||||
16,
|
||||
|
||||
const Color(0XFF646566),
|
||||
|
||||
FontWeight.w400,
|
||||
|
||||
),
|
||||
|
||||
prefixIcon: SizedBox(
|
||||
|
||||
height: 20,
|
||||
|
||||
width: 20,
|
||||
|
||||
child: Padding(
|
||||
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
|
||||
child: Image.asset(
|
||||
|
||||
'images/search.png',
|
||||
|
||||
fit: BoxFit.contain,
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
/// ⭐ CLEAR BUTTON ADDED HERE
|
||||
suffixIcon: widget.controller.text.isNotEmpty
|
||||
|
||||
? IconButton(
|
||||
|
||||
icon: const Icon(
|
||||
Icons.close,
|
||||
size:18,
|
||||
color: Color(0XFF646566)
|
||||
),
|
||||
|
||||
onPressed: (){
|
||||
|
||||
widget.controller.clear();
|
||||
|
||||
},
|
||||
|
||||
)
|
||||
|
||||
: null,
|
||||
|
||||
border: InputBorder.none,
|
||||
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 0),
|
||||
|
||||
),
|
||||
|
||||
style: fontTextStyle(
|
||||
|
||||
16,
|
||||
|
||||
const Color(0XFF2A2A2A),
|
||||
|
||||
FontWeight.w400,
|
||||
|
||||
),
|
||||
onSubmitted: (value) {
|
||||
debugPrint("Search Orders: $value");
|
||||
},
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
actions: [
|
||||
|
||||
Padding(
|
||||
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
|
||||
child: GestureDetector(
|
||||
onTap: onHelp, // 👉 Controlled by parent
|
||||
|
||||
onTap: widget.onHelp,
|
||||
|
||||
child: Image.asset(
|
||||
|
||||
'images/help_appbar.png',
|
||||
|
||||
height: 24,
|
||||
|
||||
width: 24,
|
||||
|
||||
fit: BoxFit.contain,
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
],
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,76 @@
|
||||
class DriverTripsModel {
|
||||
|
||||
String id = '';
|
||||
String bookingId = '';
|
||||
String tankerName = '';
|
||||
String buildingName = '';
|
||||
String address = '';
|
||||
String date = '';
|
||||
String time = '';
|
||||
String waterType = '';
|
||||
String capacity = '';
|
||||
String price = '';
|
||||
String status = '';
|
||||
String customerName = '';
|
||||
String amountPaid = '';
|
||||
String amountDue = '';
|
||||
String paymentStatus = '';
|
||||
|
||||
DriverTripsModel();
|
||||
|
||||
factory DriverTripsModel.fromJson(
|
||||
Map<String,dynamic> json){
|
||||
|
||||
DriverTripsModel d =
|
||||
DriverTripsModel();
|
||||
|
||||
d.id =
|
||||
json['_id'] ?? '';
|
||||
|
||||
d.bookingId =
|
||||
json['bookingid'] ?? '';
|
||||
|
||||
d.tankerName =
|
||||
json['tankerName'] ?? '';
|
||||
|
||||
d.buildingName =
|
||||
json['buildingName'] ?? '';
|
||||
|
||||
d.address =
|
||||
json['address'] ?? '';
|
||||
|
||||
d.date =
|
||||
json['dateOfOrder'] ?? '';
|
||||
|
||||
d.time =
|
||||
json['time'] ?? '';
|
||||
|
||||
d.waterType =
|
||||
json['typeofwater'] ?? '';
|
||||
|
||||
d.capacity =
|
||||
json['capacity'] ?? '';
|
||||
|
||||
d.price =
|
||||
json['price'] ?? '';
|
||||
|
||||
d.status =
|
||||
json['orderStatus'] ?? '';
|
||||
|
||||
d.customerName =
|
||||
json['customerName'] ?? '';
|
||||
|
||||
d.amountPaid =
|
||||
json['amount_paid'] ?? '';
|
||||
|
||||
d.amountDue =
|
||||
json['amount_due'] ?? '';
|
||||
|
||||
d.paymentStatus =
|
||||
json['payment_status'] ?? '';
|
||||
|
||||
return d;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@ -1,29 +1,78 @@
|
||||
class TankerTripsModel {
|
||||
class TankerTripsModel {
|
||||
|
||||
String tanker_name = '';
|
||||
String address = '';
|
||||
String dbId = '';
|
||||
String driver_name = '';
|
||||
String status = '';
|
||||
String building_name = '';
|
||||
String water_source_location='';
|
||||
String deliveredDate='';
|
||||
String water_source_location = '';
|
||||
String deliveredDate = '';
|
||||
|
||||
/// ADD THESE
|
||||
String dateOfOrder = '';
|
||||
String time = '';
|
||||
String supplierName = '';
|
||||
String amount_paid = '';
|
||||
String amount_due = '';
|
||||
|
||||
TankerTripsModel();
|
||||
|
||||
factory TankerTripsModel.fromJson(Map<String, dynamic> json){
|
||||
TankerTripsModel rtvm = new TankerTripsModel();
|
||||
|
||||
rtvm.tanker_name = json['tankerName']?? '';
|
||||
rtvm.dbId = json['_id']?? '';
|
||||
rtvm.address = json['supplier_address']?? '';
|
||||
rtvm.driver_name = json['delivery_agent']?? '';
|
||||
rtvm.status = json['orderStatus']?? '';
|
||||
rtvm.building_name = json['buildingName']?? '';
|
||||
rtvm.water_source_location = json['water_source_location']?? '';
|
||||
rtvm.deliveredDate = json['deliveredDate']?? '';
|
||||
factory TankerTripsModel.fromJson(
|
||||
Map<String, dynamic> json){
|
||||
|
||||
TankerTripsModel rtvm =
|
||||
TankerTripsModel();
|
||||
|
||||
rtvm.tanker_name =
|
||||
json['tankerName'] ?? '';
|
||||
|
||||
rtvm.dbId =
|
||||
json['_id'] ?? '';
|
||||
|
||||
/// FIX (you used wrong key)
|
||||
rtvm.address =
|
||||
json['address'] ?? '';
|
||||
|
||||
rtvm.driver_name =
|
||||
json['delivery_agent'] ?? '';
|
||||
|
||||
rtvm.status =
|
||||
json['orderStatus'] ?? '';
|
||||
|
||||
rtvm.building_name =
|
||||
json['buildingName'] ?? '';
|
||||
|
||||
rtvm.water_source_location =
|
||||
json['water_source_location'] ?? '';
|
||||
|
||||
rtvm.deliveredDate =
|
||||
json['deliveredDate'] ?? '';
|
||||
|
||||
/// ADD THESE
|
||||
rtvm.dateOfOrder =
|
||||
json['dateOfOrder'] ?? '';
|
||||
|
||||
rtvm.time =
|
||||
json['time'] ?? '';
|
||||
|
||||
rtvm.supplierName =
|
||||
json['supplierName'] ?? '';
|
||||
|
||||
rtvm.amount_paid =
|
||||
json['amount_paid'] ?? '';
|
||||
|
||||
rtvm.amount_due =
|
||||
json['amount_due'] ?? '';
|
||||
|
||||
return rtvm;
|
||||
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"boreName":this.tanker_name,
|
||||
|
||||
"tankerName": tanker_name,
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@ -1,180 +1,372 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sms_autofill/sms_autofill.dart';
|
||||
import 'package:supplier_new/signup/password_textbox_screen.dart';
|
||||
|
||||
import '../common/settings.dart';
|
||||
|
||||
class Otpscreen extends StatefulWidget {
|
||||
var mobileNumber;
|
||||
Otpscreen({
|
||||
this.mobileNumber
|
||||
|
||||
final String mobileNumber;
|
||||
|
||||
const Otpscreen({
|
||||
super.key,
|
||||
required this.mobileNumber
|
||||
});
|
||||
|
||||
@override
|
||||
State<Otpscreen> createState() => _OtpscreenState();
|
||||
|
||||
}
|
||||
|
||||
class _OtpscreenState extends State<Otpscreen> {
|
||||
final List<TextEditingController> _controllers = List.generate(6, (index) => TextEditingController());
|
||||
final FocusNode _focusNode = FocusNode();
|
||||
class _OtpscreenState extends State<Otpscreen>
|
||||
with CodeAutoFill {
|
||||
|
||||
String otpCode = "";
|
||||
|
||||
bool isLoading = false;
|
||||
|
||||
int seconds = 30;
|
||||
|
||||
bool canResend = false;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
_controllers.forEach((controller) => controller.dispose());
|
||||
_focusNode.dispose();
|
||||
super.dispose();
|
||||
void initState(){
|
||||
|
||||
super.initState();
|
||||
|
||||
listenForCode();
|
||||
|
||||
startTimer();
|
||||
|
||||
}
|
||||
|
||||
void startTimer(){
|
||||
|
||||
Future.delayed(const Duration(seconds:1),(){
|
||||
|
||||
if(seconds>0){
|
||||
|
||||
setState(()=>seconds--);
|
||||
|
||||
startTimer();
|
||||
|
||||
}
|
||||
else{
|
||||
|
||||
setState(()=>canResend=true);
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
void codeUpdated(){
|
||||
|
||||
setState((){
|
||||
|
||||
otpCode = code!;
|
||||
|
||||
});
|
||||
|
||||
if(otpCode.length==6){
|
||||
|
||||
verifyOtp();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Future<void> verifyOtp() async{
|
||||
|
||||
if(isLoading) return;
|
||||
|
||||
if(otpCode.length!=6){
|
||||
|
||||
AppSettings.longFailedToast(
|
||||
"Enter 6 digit OTP");
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
setState(()=>isLoading=true);
|
||||
|
||||
AppSettings.preLoaderDialog(context);
|
||||
|
||||
bool isOnline =
|
||||
await AppSettings.internetConnectivity();
|
||||
|
||||
if(isOnline){
|
||||
|
||||
var payload={
|
||||
|
||||
"phoneVerificationCode":otpCode,
|
||||
|
||||
"phone":widget.mobileNumber
|
||||
|
||||
};
|
||||
|
||||
bool status =
|
||||
await AppSettings.verifyPhn(payload);
|
||||
|
||||
Navigator.pop(context);
|
||||
|
||||
if(status){
|
||||
|
||||
Navigator.pushReplacement(
|
||||
|
||||
context,
|
||||
|
||||
MaterialPageRoute(
|
||||
|
||||
builder:(_)=>
|
||||
PasswordTextBoxesScreen(
|
||||
mobileNumber:
|
||||
widget.mobileNumber),
|
||||
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
else{
|
||||
|
||||
AppSettings.longFailedToast(
|
||||
"Invalid OTP");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
else{
|
||||
|
||||
Navigator.pop(context);
|
||||
|
||||
AppSettings.longFailedToast(
|
||||
"Check internet");
|
||||
|
||||
}
|
||||
|
||||
setState(()=>isLoading=false);
|
||||
|
||||
}
|
||||
|
||||
void _submitOtp() {
|
||||
final otp = _controllers.map((controller) => controller.text).join();
|
||||
print("Entered OTP: $otp");
|
||||
// Add OTP validation or submission logic here
|
||||
String maskNumber(String number){
|
||||
|
||||
return "*******${number.substring(7)}";
|
||||
|
||||
}
|
||||
|
||||
Future<void> resendOtp() async{
|
||||
|
||||
if(!canResend) return;
|
||||
|
||||
var payload={
|
||||
|
||||
"mobileNumbers":
|
||||
widget.mobileNumber
|
||||
|
||||
};
|
||||
|
||||
await AppSettings.getOtp(payload);
|
||||
|
||||
setState((){
|
||||
|
||||
seconds=30;
|
||||
|
||||
canResend=false;
|
||||
|
||||
});
|
||||
|
||||
startTimer();
|
||||
|
||||
String maskMobileNumber(String number) {
|
||||
if (number.length < 3) return number; // Handle invalid numbers
|
||||
final stars = '*' * (number.length - 3);
|
||||
final lastThree = number.substring(number.length - 3);
|
||||
return '$stars$lastThree';
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose(){
|
||||
|
||||
cancel();
|
||||
|
||||
super.dispose();
|
||||
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Widget build(BuildContext context){
|
||||
|
||||
return Scaffold(
|
||||
body: Stack(children: <Widget>[
|
||||
/*Container(
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("images/backgroundimage.png"),
|
||||
fit: BoxFit.cover,
|
||||
|
||||
backgroundColor:Colors.white,
|
||||
|
||||
body:SafeArea(
|
||||
|
||||
child:Padding(
|
||||
|
||||
padding:
|
||||
const EdgeInsets.all(24),
|
||||
|
||||
child:Column(
|
||||
|
||||
children:[
|
||||
|
||||
const Spacer(),
|
||||
|
||||
Text(
|
||||
|
||||
"Enter OTP",
|
||||
|
||||
style:fontTextStyle(
|
||||
20,
|
||||
Color(0XFF101214),
|
||||
FontWeight.w700),
|
||||
|
||||
),
|
||||
|
||||
const SizedBox(height:10),
|
||||
|
||||
Text(
|
||||
|
||||
"Code sent to +91 ${maskNumber(widget.mobileNumber)}",
|
||||
|
||||
style:fontTextStyle(
|
||||
12,
|
||||
Color(0XFF7E7F80),
|
||||
FontWeight.w400),
|
||||
|
||||
),
|
||||
|
||||
const SizedBox(height:40),
|
||||
|
||||
/// OTP BOX
|
||||
PinFieldAutoFill(
|
||||
|
||||
codeLength:6,
|
||||
|
||||
currentCode:otpCode,
|
||||
|
||||
onCodeChanged:(code){
|
||||
|
||||
otpCode=code??"";
|
||||
|
||||
},
|
||||
|
||||
decoration:
|
||||
|
||||
BoxLooseDecoration(
|
||||
|
||||
radius:
|
||||
const Radius.circular(8),
|
||||
|
||||
strokeColorBuilder:
|
||||
|
||||
FixedColorBuilder(
|
||||
primaryColor),
|
||||
|
||||
textStyle:
|
||||
|
||||
fontTextStyle(
|
||||
18,
|
||||
Color(0XFF101214),
|
||||
FontWeight.w600),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
const SizedBox(height:30),
|
||||
|
||||
/// TIMER
|
||||
canResend
|
||||
|
||||
? GestureDetector(
|
||||
|
||||
onTap:resendOtp,
|
||||
|
||||
child:Text(
|
||||
|
||||
"Resend OTP",
|
||||
|
||||
style:fontTextStyle(
|
||||
14,
|
||||
primaryColor,
|
||||
FontWeight.w600),
|
||||
|
||||
),
|
||||
|
||||
)
|
||||
|
||||
: Text(
|
||||
|
||||
"Resend in 00:$seconds",
|
||||
|
||||
style:fontTextStyle(
|
||||
12,
|
||||
Color(0XFF7E7F80),
|
||||
FontWeight.w500),
|
||||
|
||||
),
|
||||
),
|
||||
),*/
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
FocusScope.of(context).requestFocus(new FocusNode());
|
||||
},
|
||||
child: SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
child: Padding(
|
||||
padding: EdgeInsets.fromLTRB(24, 0, 24, 0),
|
||||
child: Column(children: <Widget>[
|
||||
SizedBox(height:MediaQuery.of(context).size.height * .2,),
|
||||
|
||||
Container(
|
||||
|
||||
child: Text(
|
||||
'Enter confirmation code',
|
||||
style: fontTextStyle(16,Color(0XFF101214),FontWeight.w800),
|
||||
),
|
||||
),
|
||||
SizedBox(height:MediaQuery.of(context).size.height * .02,),
|
||||
Container(
|
||||
|
||||
child: Text(
|
||||
'A 6-digit code was sent to +91${maskMobileNumber(widget.mobileNumber)}',
|
||||
style: fontTextStyle(12,Color(0XFF7E7F80),FontWeight.w400),
|
||||
),
|
||||
),
|
||||
SizedBox(height:MediaQuery.of(context).size.height * .040,),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: List.generate(6, (index) {
|
||||
return SizedBox(
|
||||
width: 50,
|
||||
child: TextFormField(
|
||||
cursorColor:primaryColor,
|
||||
controller: _controllers[index],
|
||||
focusNode: index == 0 ? _focusNode : null,
|
||||
maxLength: 1,
|
||||
textAlign: TextAlign.center,
|
||||
style: fontTextStyle(14,Color(0XFF101214),FontWeight.w400),
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: textFormFieldDecoration(Icons.ice_skating, ''),
|
||||
onChanged: (value) {
|
||||
if (value.isNotEmpty && index < 5) {
|
||||
FocusScope.of(context).nextFocus();
|
||||
} else if (value.isEmpty && index > 0) {
|
||||
FocusScope.of(context).previousFocus();
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}),
|
||||
),
|
||||
|
||||
SizedBox(height:MediaQuery.of(context).size.height * .08,),
|
||||
GestureDetector(
|
||||
onTap: (){
|
||||
|
||||
},
|
||||
child: Text('Resend code',style:fontTextStyle(12,Color(0XFF1D7AFC),FontWeight.w600),),
|
||||
),
|
||||
SizedBox(height:MediaQuery.of(context).size.height * .024,),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
height: MediaQuery.of(context).size.height * .06,
|
||||
child: ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
foregroundColor: Colors.white,
|
||||
backgroundColor: primaryColor,
|
||||
),
|
||||
onPressed: () async{
|
||||
AppSettings.preLoaderDialog(context);
|
||||
|
||||
bool isOnline = await AppSettings.internetConnectivity();
|
||||
if(isOnline){
|
||||
final otp = _controllers.map((controller) => controller.text).join();
|
||||
|
||||
if(otp.length==6){
|
||||
var phoneVerifyPayload = new Map<String, dynamic>();
|
||||
|
||||
phoneVerifyPayload["phoneVerificationCode"] = otp.toString();
|
||||
phoneVerifyPayload["phone"] = widget.mobileNumber.toString();
|
||||
|
||||
bool verifyPhnStatus = await AppSettings.verifyPhn(phoneVerifyPayload);
|
||||
if (verifyPhnStatus) {
|
||||
Navigator.of(context, rootNavigator: true).pop();
|
||||
//AppSettings.longSuccessToast("User SignUp Successfully");
|
||||
Navigator.push(
|
||||
context,
|
||||
new MaterialPageRoute(
|
||||
builder: (__) => new PasswordTextBoxesScreen(mobileNumber: widget.mobileNumber,)));
|
||||
/* await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (context) => const Login()),
|
||||
);*/
|
||||
|
||||
} else {
|
||||
Navigator.of(context, rootNavigator: true).pop();
|
||||
AppSettings.longFailedToast("Phone verification failed");
|
||||
}
|
||||
}
|
||||
else{
|
||||
Navigator.of(context, rootNavigator: true).pop();
|
||||
AppSettings.longFailedToast("Please enter 6 digit otp code");
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else{
|
||||
Navigator.of(context,rootNavigator: true).pop();
|
||||
AppSettings.longFailedToast("Please Check internet");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
},
|
||||
child: Text('Continue',style:fontTextStyle(12,Color(0XFFFFFFFF),FontWeight.w600),),
|
||||
)),
|
||||
|
||||
]),
|
||||
)))),
|
||||
]));
|
||||
|
||||
const SizedBox(height:40),
|
||||
|
||||
/// BUTTON
|
||||
SizedBox(
|
||||
|
||||
width:double.infinity,
|
||||
|
||||
height:55,
|
||||
|
||||
child:ElevatedButton(
|
||||
|
||||
style:
|
||||
ElevatedButton.styleFrom(
|
||||
|
||||
backgroundColor:
|
||||
primaryColor,
|
||||
|
||||
shape:
|
||||
RoundedRectangleBorder(
|
||||
|
||||
borderRadius:
|
||||
BorderRadius.circular(24),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
onPressed:verifyOtp,
|
||||
|
||||
child:isLoading
|
||||
|
||||
? const CircularProgressIndicator(
|
||||
color:Colors.white)
|
||||
|
||||
:Text(
|
||||
|
||||
"Verify",
|
||||
|
||||
style:fontTextStyle(
|
||||
16,
|
||||
Colors.white,
|
||||
FontWeight.w600),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
const Spacer(),
|
||||
|
||||
],
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in new issue