You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
238 lines
6.1 KiB
238 lines
6.1 KiB
import 'package:bookatanker/signup.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'common/settings.dart';
|
|
import 'createpassword.dart';
|
|
|
|
|
|
class OtpScreen extends StatefulWidget {
|
|
final String mobileNumber;
|
|
|
|
const OtpScreen({
|
|
Key? key,
|
|
required this.mobileNumber,
|
|
}) : super(key: key);
|
|
|
|
@override
|
|
State<OtpScreen> createState() => _OtpScreenState();
|
|
}
|
|
|
|
class _OtpScreenState extends State<OtpScreen> {
|
|
|
|
final List<TextEditingController> _controllers =
|
|
List.generate(6, (_) => TextEditingController());
|
|
|
|
@override
|
|
void dispose() {
|
|
for (var controller in _controllers) {
|
|
controller.dispose();
|
|
}
|
|
super.dispose();
|
|
}
|
|
|
|
String maskMobileNumber(String number) {
|
|
if (number.length < 3) return number;
|
|
final stars = '*' * (number.length - 3);
|
|
final lastThree = number.substring(number.length - 3);
|
|
return '$stars$lastThree';
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
backgroundColor: Colors.white,
|
|
|
|
body: SafeArea(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(24.0),
|
|
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
|
|
const SizedBox(height: 100),
|
|
|
|
/// Title
|
|
Text(
|
|
"Enter Confirmation Code",
|
|
style: fontTextStyle(
|
|
16,
|
|
const Color(0xFF101214),
|
|
FontWeight.w600),
|
|
),
|
|
|
|
const SizedBox(height: 8),
|
|
|
|
/// Mobile Text
|
|
Text(
|
|
'A 6-digit code was sent to\n+91 ${maskMobileNumber(widget.mobileNumber)}',
|
|
textAlign: TextAlign.center,
|
|
style: fontTextStyle(
|
|
12,
|
|
const Color(0xFF7E7F80),
|
|
FontWeight.w400),
|
|
),
|
|
|
|
const SizedBox(height: 30),
|
|
|
|
/// OTP Boxes
|
|
Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceEvenly,
|
|
children: List.generate(
|
|
6,
|
|
(index) => SizedBox(
|
|
width: 45,
|
|
|
|
child: TextField(
|
|
controller:
|
|
_controllers[index],
|
|
|
|
textAlign: TextAlign.center,
|
|
|
|
keyboardType:
|
|
TextInputType.number,
|
|
|
|
maxLength: 1,
|
|
|
|
style: fontTextStyle(
|
|
14,
|
|
const Color(0xFF2A2A2A),
|
|
FontWeight.w400),
|
|
|
|
decoration:
|
|
InputDecoration(
|
|
counterText: "",
|
|
|
|
border:
|
|
OutlineInputBorder(
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
8),
|
|
),
|
|
),
|
|
|
|
onChanged: (value) {
|
|
|
|
if (value.isNotEmpty &&
|
|
index < 5) {
|
|
|
|
FocusScope.of(context)
|
|
.nextFocus();
|
|
|
|
}
|
|
|
|
else if (value.isEmpty &&
|
|
index > 0) {
|
|
|
|
FocusScope.of(context)
|
|
.previousFocus();
|
|
|
|
}
|
|
},
|
|
),
|
|
),
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 40),
|
|
|
|
/// Resend Code
|
|
TextButton(
|
|
onPressed: () {
|
|
|
|
Navigator.push(
|
|
context,
|
|
MaterialPageRoute(
|
|
builder: (_) =>
|
|
const CreatePasswordScreen(),
|
|
),
|
|
);
|
|
|
|
},
|
|
|
|
child: Text(
|
|
"Resend Code",
|
|
|
|
style: fontTextStyle(
|
|
14,
|
|
const Color(0XFF1D7AFC),
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
|
|
const SizedBox(height: 20),
|
|
|
|
/// Continue Button
|
|
SizedBox(
|
|
width: double.infinity,
|
|
|
|
child: ElevatedButton(
|
|
onPressed: () {
|
|
|
|
final otp =
|
|
_controllers
|
|
.map((c) => c.text)
|
|
.join();
|
|
|
|
if (otp.length == 6) {
|
|
|
|
Navigator.pushReplacement(
|
|
context,
|
|
|
|
MaterialPageRoute(
|
|
builder: (_) =>
|
|
const SignUpScreen(),
|
|
),
|
|
);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ScaffoldMessenger.of(
|
|
context)
|
|
.showSnackBar(
|
|
const SnackBar(
|
|
content: Text(
|
|
"Please enter 6 digit OTP"),
|
|
),
|
|
);
|
|
}
|
|
},
|
|
|
|
style: ElevatedButton
|
|
.styleFrom(
|
|
backgroundColor:
|
|
const Color(
|
|
0XFF1D7AFC),
|
|
|
|
padding:
|
|
const EdgeInsets
|
|
.symmetric(
|
|
vertical: 16),
|
|
|
|
shape:
|
|
RoundedRectangleBorder(
|
|
borderRadius:
|
|
BorderRadius.circular(
|
|
30),
|
|
),
|
|
),
|
|
|
|
child: Text(
|
|
"Continue",
|
|
|
|
style: fontTextStyle(
|
|
14,
|
|
Colors.white,
|
|
FontWeight.w600),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
} |