119 lines
4.0 KiB
Dart
119 lines
4.0 KiB
Dart
|
|
import 'package:base_project/utils/toast_messages/toast_message_util.dart';
|
||
|
|
import 'package:base_project/view/auth/admin_reg_view.dart';
|
||
|
|
import 'package:base_project/view_model/auth/auth_view_model.dart';
|
||
|
|
import 'package:flutter/material.dart';
|
||
|
|
import 'package:pinput/pinput.dart';
|
||
|
|
import 'package:base_project/commans/widgets/custome_elevated_button.dart';
|
||
|
|
import 'package:provider/provider.dart';
|
||
|
|
|
||
|
|
class VerifyOtpView extends StatefulWidget {
|
||
|
|
final String? email;
|
||
|
|
|
||
|
|
const VerifyOtpView({super.key, this.email});
|
||
|
|
|
||
|
|
@override
|
||
|
|
_VerifyOtpViewState createState() => _VerifyOtpViewState();
|
||
|
|
}
|
||
|
|
|
||
|
|
class _VerifyOtpViewState extends State<VerifyOtpView> {
|
||
|
|
// Create a TextEditingController for the Pinput field
|
||
|
|
final TextEditingController _otpController = TextEditingController();
|
||
|
|
|
||
|
|
@override
|
||
|
|
void dispose() {
|
||
|
|
// Dispose the controller when the widget is removed from the widget tree
|
||
|
|
_otpController.dispose();
|
||
|
|
super.dispose();
|
||
|
|
}
|
||
|
|
|
||
|
|
void _handleVerifyButtonPress() {
|
||
|
|
// Get the OTP value from the controller
|
||
|
|
final otp = _otpController.text;
|
||
|
|
|
||
|
|
// Validate OTP value
|
||
|
|
if (otp.isEmpty || otp.length < 6) {
|
||
|
|
// Handle invalid OTP
|
||
|
|
print("Invalid OTP: OTP must be 6 digits.");
|
||
|
|
ToastMessageUtil.showToast(
|
||
|
|
message: "Invalid OTP: OTP must be 6 digits.",
|
||
|
|
toastType: ToastType.error);
|
||
|
|
} else {}
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
Widget build(BuildContext context) {
|
||
|
|
return Scaffold(
|
||
|
|
appBar: AppBar(
|
||
|
|
leading: IconButton(
|
||
|
|
onPressed: () {
|
||
|
|
Navigator.pop(context);
|
||
|
|
},
|
||
|
|
icon: Icon(Icons.adaptive.arrow_back),
|
||
|
|
),
|
||
|
|
title: const Text("Verify Otp"),
|
||
|
|
),
|
||
|
|
body: Center(
|
||
|
|
child: Padding(
|
||
|
|
padding: const EdgeInsets.all(12.0),
|
||
|
|
child: Column(
|
||
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
||
|
|
children: [
|
||
|
|
const Text(
|
||
|
|
"An OTP has been sent to your email. Please enter the OTP."),
|
||
|
|
const SizedBox(height: 20),
|
||
|
|
Pinput(
|
||
|
|
length: 6, // Number of PIN digits
|
||
|
|
controller: _otpController,
|
||
|
|
pinAnimationType: PinAnimationType.fade,
|
||
|
|
defaultPinTheme: PinTheme(
|
||
|
|
width: 50,
|
||
|
|
height: 50,
|
||
|
|
textStyle: const TextStyle(fontSize: 20, color: Colors.black),
|
||
|
|
decoration: BoxDecoration(
|
||
|
|
border: Border.all(color: Colors.black),
|
||
|
|
borderRadius: BorderRadius.circular(10),
|
||
|
|
),
|
||
|
|
),
|
||
|
|
onCompleted: (pin) {
|
||
|
|
// Optionally handle OTP when completed
|
||
|
|
_handleVerifyButtonPress();
|
||
|
|
},
|
||
|
|
),
|
||
|
|
const SizedBox(height: 20),
|
||
|
|
Consumer<AuthViewModel>(
|
||
|
|
builder: (context, provider, child) {
|
||
|
|
return MyCustomElevatedButton(
|
||
|
|
isLoading: provider.isLoading,
|
||
|
|
onPressed: () {
|
||
|
|
if (_otpController.text.isEmpty ||
|
||
|
|
_otpController.text.length < 6) {
|
||
|
|
// Handle invalid OTP
|
||
|
|
print("Invalid OTP: OTP must be 6 digits.");
|
||
|
|
ToastMessageUtil.showToast(
|
||
|
|
message: "Invalid OTP: OTP must be 6 digits.",
|
||
|
|
toastType: ToastType.error);
|
||
|
|
} else {
|
||
|
|
final data = {
|
||
|
|
"email": widget.email,
|
||
|
|
"otp": _otpController.text
|
||
|
|
};
|
||
|
|
provider.verifyOtp(context, data);
|
||
|
|
Navigator.push(
|
||
|
|
context,
|
||
|
|
MaterialPageRoute(
|
||
|
|
builder: (context) => AdminRegView(),
|
||
|
|
));
|
||
|
|
}
|
||
|
|
},
|
||
|
|
child: const Text("Verify OTP"),
|
||
|
|
);
|
||
|
|
},
|
||
|
|
),
|
||
|
|
],
|
||
|
|
),
|
||
|
|
),
|
||
|
|
),
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|