You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			235 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			235 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Dart
		
	
import 'dart:async';
 | 
						|
 | 
						|
import 'package:easy_localization/src/public_ext.dart';
 | 
						|
import 'package:flutter/material.dart';
 | 
						|
import 'package:flutter_svg/svg.dart';
 | 
						|
import 'package:mohem_flutter_app/classes/colors.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
 | 
						|
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
 | 
						|
import 'package:mohem_flutter_app/widgets/otp_widget.dart';
 | 
						|
 | 
						|
class OtpDialog {
 | 
						|
  final int type;
 | 
						|
  final int? mobileNo;
 | 
						|
  final Function(String) onSuccess;
 | 
						|
  final Function onFailure;
 | 
						|
  final BuildContext context;
 | 
						|
 | 
						|
  int remainingTime = 120;
 | 
						|
 | 
						|
  Future<Null>? timer;
 | 
						|
 | 
						|
  static BuildContext? _context;
 | 
						|
 | 
						|
  static bool? _loading;
 | 
						|
 | 
						|
  OtpDialog(
 | 
						|
    this.context,
 | 
						|
    this.type,
 | 
						|
    this.mobileNo,
 | 
						|
    this.onSuccess,
 | 
						|
    this.onFailure,
 | 
						|
  );
 | 
						|
 | 
						|
  GlobalKey? verifyAccountForm = GlobalKey<FormState>();
 | 
						|
 | 
						|
  final TextEditingController _pinPutController = TextEditingController();
 | 
						|
 | 
						|
  TextEditingController digit1 = TextEditingController(text: "");
 | 
						|
  TextEditingController digit2 = TextEditingController(text: "");
 | 
						|
  TextEditingController digit3 = TextEditingController(text: "");
 | 
						|
  TextEditingController digit4 = TextEditingController(text: "");
 | 
						|
 | 
						|
  Map verifyAccountFormValue = {
 | 
						|
    'digit1': '',
 | 
						|
    'digit2': '',
 | 
						|
    'digit3': '',
 | 
						|
    'digit4': '',
 | 
						|
  };
 | 
						|
  final focusD1 = FocusNode();
 | 
						|
  final focusD2 = FocusNode();
 | 
						|
  final focusD3 = FocusNode();
 | 
						|
  final focusD4 = FocusNode();
 | 
						|
  String? errorMsg;
 | 
						|
 | 
						|
  // ProjectViewModel projectProvider;
 | 
						|
  String displayTime = '';
 | 
						|
  String? _code;
 | 
						|
  dynamic setState;
 | 
						|
  bool stopTimer = false;
 | 
						|
 | 
						|
  // static String signature;
 | 
						|
 | 
						|
  void displayDialog(BuildContext context) async {
 | 
						|
    return showDialog(
 | 
						|
        context: context,
 | 
						|
        barrierColor: Colors.black.withOpacity(0.63),
 | 
						|
        builder: (context) {
 | 
						|
          // projectProvider = Provider.of(context);
 | 
						|
          return Dialog(
 | 
						|
            backgroundColor: Colors.white,
 | 
						|
            shape: const RoundedRectangleBorder(),
 | 
						|
            insetPadding: const EdgeInsets.only(left: 21, right: 21),
 | 
						|
            child: StatefulBuilder(builder: (context, setState) {
 | 
						|
              if (displayTime == '') {
 | 
						|
                startTimer(setState);
 | 
						|
              }
 | 
						|
 | 
						|
              return Container(
 | 
						|
                padding: EdgeInsets.only(left: 21, right: 18, top: 39, bottom: 59),
 | 
						|
                child: Column(
 | 
						|
                  mainAxisSize: MainAxisSize.min,
 | 
						|
                  crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                  children: [
 | 
						|
                    Row(
 | 
						|
                      crossAxisAlignment: CrossAxisAlignment.start,
 | 
						|
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
 | 
						|
                      children: [
 | 
						|
                        SvgPicture.asset(
 | 
						|
                          type == 1
 | 
						|
                              ? "assets/images/login/verify_sms.svg"
 | 
						|
                              : type == 2
 | 
						|
                                  ? "assets/images/login/verify_whatsapp.svg"
 | 
						|
                                  : type == 3
 | 
						|
                                      ? "assets/images/login/verify_face.svg"
 | 
						|
                                      : 'assets/images/login/verify_thumb.svg',
 | 
						|
                          height: 50,
 | 
						|
                          width: 50,
 | 
						|
                        ),
 | 
						|
                        IconButton(
 | 
						|
                            padding: EdgeInsets.zero,
 | 
						|
                            icon: const Icon(Icons.close),
 | 
						|
                            constraints: const BoxConstraints(),
 | 
						|
                            onPressed: () {
 | 
						|
                              stopTimer = true;
 | 
						|
                              onFailure();
 | 
						|
                            })
 | 
						|
                      ],
 | 
						|
                    ),
 | 
						|
                    22.height,
 | 
						|
                    (LocaleKeys.pleaseEnterTheVerificationCodeSentTo.tr() + ' xxxxxxxx' + mobileNo.toString().substring(mobileNo.toString().length - 3)).toText16(),
 | 
						|
                    18.height,
 | 
						|
                    Directionality(
 | 
						|
                      textDirection: TextDirection.ltr,
 | 
						|
                      child: Center(
 | 
						|
                        child: OTPWidget(
 | 
						|
                          autoFocus: true,
 | 
						|
                          controller: _pinPutController,
 | 
						|
                          defaultBorderColor: const Color(0xffD8D8D8),
 | 
						|
                          maxLength: 4,
 | 
						|
                          onTextChanged: (text) {},
 | 
						|
                          pinBoxColor: Colors.white,
 | 
						|
                          onDone: (code) => _onOtpCallBack(code, null),
 | 
						|
                          textBorderColor: const Color(0xffD8D8D8),
 | 
						|
                          pinBoxWidth: 60,
 | 
						|
                          pinBoxHeight: 60,
 | 
						|
                          pinTextStyle: const TextStyle(fontSize: 24.0, color: MyColors.darkTextColor),
 | 
						|
                          pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition,
 | 
						|
                          pinTextAnimatedSwitcherDuration: const Duration(milliseconds: 300),
 | 
						|
                          pinBoxRadius: 10,
 | 
						|
                          keyboardType: TextInputType.number,
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                    30.height,
 | 
						|
                    RichText(
 | 
						|
                      text: TextSpan(
 | 
						|
                        text: LocaleKeys.theVerificationCodeWillExpireIn.tr() + '\n',
 | 
						|
                        style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.darkTextColor, letterSpacing: -0.48),
 | 
						|
                        children: <TextSpan>[
 | 
						|
                          TextSpan(
 | 
						|
                            text: displayTime,
 | 
						|
                            style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.textMixColor, letterSpacing: -0.48),
 | 
						|
                          ),
 | 
						|
                        ],
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ],
 | 
						|
                ),
 | 
						|
              );
 | 
						|
            }),
 | 
						|
          );
 | 
						|
        });
 | 
						|
  }
 | 
						|
 | 
						|
  InputDecoration buildInputDecoration(BuildContext context) {
 | 
						|
    return InputDecoration(
 | 
						|
      counterText: " ",
 | 
						|
      enabledBorder: const OutlineInputBorder(
 | 
						|
        borderRadius: BorderRadius.all(Radius.circular(10)),
 | 
						|
        borderSide: BorderSide(color: Colors.black),
 | 
						|
      ),
 | 
						|
      focusedBorder: OutlineInputBorder(
 | 
						|
        borderRadius: const BorderRadius.all(Radius.circular(10.0)),
 | 
						|
        borderSide: BorderSide(color: Theme.of(context).primaryColor),
 | 
						|
      ),
 | 
						|
      errorBorder: OutlineInputBorder(
 | 
						|
        borderRadius: const BorderRadius.all(Radius.circular(10.0)),
 | 
						|
        borderSide: BorderSide(color: Theme.of(context).errorColor),
 | 
						|
      ),
 | 
						|
      focusedErrorBorder: OutlineInputBorder(
 | 
						|
        borderRadius: const BorderRadius.all(Radius.circular(10.0)),
 | 
						|
        borderSide: BorderSide(color: Theme.of(context).errorColor),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  // String validateCodeDigit(value) {
 | 
						|
  //   if (value.isEmpty) {
 | 
						|
  //     return ' ';
 | 
						|
  //   } else if (value.length == 3) {
 | 
						|
  //     print(value);
 | 
						|
  //   } else {
 | 
						|
  //     return null;
 | 
						|
  //   }
 | 
						|
  // }
 | 
						|
 | 
						|
  String getSecondsAsDigitalClock(int inputSeconds) {
 | 
						|
    int secNum = int.parse(inputSeconds.toString()); // don't forget the second param
 | 
						|
    int hours = (secNum / 3600).floor();
 | 
						|
    int minutes = ((secNum - hours * 3600) / 60).floor();
 | 
						|
    double seconds = secNum - hours * 3600 - minutes * 60;
 | 
						|
    String minutesString = "";
 | 
						|
    String secondsString = "";
 | 
						|
    minutesString = minutes < 10 ? "0" + minutes.toString() : minutes.toString();
 | 
						|
    secondsString = seconds < 10 ? "0" + seconds.toStringAsFixed(0) : seconds.toStringAsFixed(0);
 | 
						|
    return minutesString + ":" + secondsString;
 | 
						|
  }
 | 
						|
 | 
						|
  void startTimer(setState) {
 | 
						|
    remainingTime--;
 | 
						|
    if (stopTimer) return;
 | 
						|
    setState(() {
 | 
						|
      displayTime = getSecondsAsDigitalClock(remainingTime);
 | 
						|
    });
 | 
						|
 | 
						|
    timer = Future.delayed(const Duration(seconds: 1), () {
 | 
						|
      if (remainingTime > 0) {
 | 
						|
        startTimer(setState);
 | 
						|
      } else {
 | 
						|
        Navigator.pop(context);
 | 
						|
      }
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  static void hideSMSBox(context) {
 | 
						|
    Navigator.pop(context);
 | 
						|
  }
 | 
						|
 | 
						|
  void _onOtpCallBack(String otpCode, bool? isAutofill) {
 | 
						|
    if (otpCode.length == 4) {
 | 
						|
      stopTimer = true;
 | 
						|
      onSuccess(otpCode);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
// static getSignature() async {
 | 
						|
//   // if (Platform.isAndroid) {
 | 
						|
//   //   return await SmsRetriever.getAppSignature();
 | 
						|
//   // } else {
 | 
						|
//   //   return null;
 | 
						|
//   // }
 | 
						|
// }
 | 
						|
}
 |