V_callform function

Future<bool> V_callform(
  1. BuildContext context,
  2. String strfrm,
  3. String title,
  4. String cpName,
  5. String strparameter,
  6. String pagetype, {
  7. bool useHeroAnimation = false,
  8. bool clearAllStack = false,
})

Implementation

Future<bool> V_callform(
  BuildContext context,
  String strfrm,
  String title,
  String cpName,
  String strparameter,
  String pagetype, {
  bool useHeroAnimation = false,
  bool clearAllStack = false,
}) async {
  switch (pagetype.toLowerCase()) {
    case 'exe':
      ReturnData? retData = await context.callApi(
        functionName: cpName,
        parameter: strparameter,
        showError: true,
        showLoading: true,
      );
      if (!retData.isValid()) return false;
      break;
    case 'aq':
      var isQuerySuccess = await strfrm.V_MsgBox(
        context,
        type: CyberMsgBoxType.warning,
        confirmText: "Đồng ý",
        cancelText: "Huỷ bỏ",
      );
      if (!isQuerySuccess) return false;
      if (cpName == "") return false;
      // ignore: use_build_context_synchronously
      ReturnData? retData = await context.callApi(
        functionName: cpName,
        parameter: strparameter,
        showError: true,
        showLoading: true,
      );
      if (!retData.isValid()) return false;
      break;
    case "a":
      await strfrm.V_MsgBox(
        context,
        title: title,
        type: CyberMsgBoxType.defaultType,
        confirmText: "Đồng ý",
      );
      break;
    case "ae":
      await strfrm.V_MsgBox(context, title: title, type: CyberMsgBoxType.error);
      break;
    case "w":
    case "wb":
    case "web":
      Frmwebview wb = Frmwebview();
      wb.Url = strfrm;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title,
            formBuilder: () => wb,
            cp_name: "cp_name",
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;
    case "pdf":
    case "pdfview":
      FrmPdfView pdfViewer = FrmPdfView();

      // strfrm có thể là URL hoặc đường dẫn file local
      if (strfrm.startsWith('http://') || strfrm.startsWith('https://')) {
        pdfViewer.pdfUrl = strfrm; // URL
      } else {
        pdfViewer.pdfPath = strfrm; // Local path
      }

      pdfViewer.showToolbar = false;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title.isEmpty ? setText('Xem PDF', 'PDF Viewer') : title,
            formBuilder: () => pdfViewer,
            cp_name: cpName,
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;
    case "img":
    case "image":
      FrmImageView imageViewer = FrmImageView();
      imageViewer.text = strfrm; // base64, path, or URL
      imageViewer.showToolbar = false;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title.isEmpty ? setText('Xem ảnh', 'Image Viewer') : title,
            formBuilder: () => imageViewer,
            cp_name: cpName,
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;

    // ============================================================================
    // TEXT VIEWER
    // ============================================================================
    case "txt":
    case "text":
      FrmTextView textViewer = FrmTextView();
      textViewer.text = strfrm;
      textViewer.showToolbar = false;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title.isEmpty
                ? setText('Xem văn bản', 'Text Viewer')
                : title,
            formBuilder: () => textViewer,
            cp_name: cpName,
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;

    // ============================================================================
    // WORD DOCUMENT VIEWER
    // ============================================================================
    case "doc":
    case "docx":
    case "word":
      FrmDocView docViewer = FrmDocView();
      docViewer.text = strfrm;
      docViewer.showToolbar = false;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title.isEmpty
                ? setText('Xem tài liệu', 'Document Viewer')
                : title,
            formBuilder: () => docViewer,
            cp_name: cpName,
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;

    // ============================================================================
    // EXCEL VIEWER
    // ============================================================================
    case "xls":
    case "xlsx":
    case "excel":
      FrmExcelView excelViewer = FrmExcelView();
      excelViewer.text = strfrm;
      excelViewer.showToolbar = false;

      Navigator.push(
        context,
        _buildPageRoute(
          CyberFormView(
            title: title.isEmpty ? setText('Xem Excel', 'Excel Viewer') : title,
            formBuilder: () => excelViewer,
            cp_name: cpName,
            strparameter: strparameter,
          ),
          useHeroAnimation,
        ),
      );
      break;

    case "share":
      await FileHandler.shareFile(
        source: strfrm,
        fileExtension: cpName,
        fileName: title,
        subject: title,
        context: context,
      );
      break;
    case "download":
      await FileHandler.downloadFile(
        source: strfrm,
        fileExtension: cpName,
        customFileName: strparameter,
        context: context,
      );
      break;
    case "print":
      await FileHandler.printFile(
        source: strfrm,
        fileType: cpName == "pdf"
            ? "pdf"
            : (cpName == "text" ? "text" : "image"),
        documentName: title,
        context: context,
      );
      break;
    case "callconfirm":
      // Gọi điện thoại với dialog xác nhận
      await PhoneHandler.makePhoneCall(
        strfrm,
        context: context,
        showConfirmation: true,
      );
      break;

    case "sms":
    case "message":
      // Gửi SMS
      // strfrm = số điện thoại
      // strparameter = nội dung tin nhắn (optional)
      await PhoneHandler.sendSMS(
        strfrm,
        message: strparameter,
        context: context,
      );
      break;

    case "whatsapp":
    case "wa":
      // Mở WhatsApp chat
      // strfrm = số điện thoại
      // strparameter = tin nhắn mặc định (optional)
      await PhoneHandler.openWhatsApp(
        strfrm,
        message: strparameter,
        context: context,
      );
      break;

    case "telegram":
    case "tg":
      // Mở Telegram chat
      await PhoneHandler.openTelegram(strfrm, context: context);
      break;

    case "viber":
      // Mở Viber chat
      await PhoneHandler.openViber(strfrm, context: context);
      break;

    case "contacts":
    case "phonebook":
      // Mở ứng dụng Danh bạ
      await PhoneHandler.openContacts(context: context);
      break;

    case "savecontact":
      // Lưu số vào danh bạ
      // strfrm = số điện thoại
      // title = tên người (optional)
      // strparameter = email (optional)
      await PhoneHandler.saveToContacts(
        strfrm,
        name: title,
        email: strparameter,
        context: context,
      );
      break;
    case "zalo":
    case "zalochat":
      // Mở Zalo chat
      // strfrm = số điện thoại
      await PhoneHandler.openZaloChat(strfrm, context: context);
      break;

    case "zalocall":
      // Gọi điện qua Zalo
      // strfrm = số điện thoại
      await PhoneHandler.makeZaloCall(
        strfrm,
        context: context,
        showConfirmation: true,
      );
      break;

    case "zalocallconfirm":
      // Gọi Zalo với xác nhận
      await PhoneHandler.makeZaloCall(
        strfrm,
        context: context,
        showConfirmation: true,
      );
      break;

    case "zalomessage":
    case "zalomsg":
      // Gửi tin nhắn Zalo (thực chất là mở chat)
      // strfrm = số điện thoại
      // strparameter = tin nhắn gợi ý (chỉ hiện thông báo)
      await PhoneHandler.sendZaloMessage(
        strfrm,
        message: strparameter,
        context: context,
      );
      break;

    case "zalooa":
      // Mở Zalo Official Account
      // strfrm = OA ID
      await PhoneHandler.openZaloOA(strfrm, context: context);
      break;

    case "aw":
      await strfrm.V_MsgBox(context, title: title, type: CyberMsgBoxType.error);
      break;
    case "p":
    case "popup":
      await V_callViewPopup(
        context,
        strfrm,
        cpName: cpName,
        strParameter: strparameter,
      );
      break;
    case "pb":
    case "popupbotton":
    case "popup_botton":
      await V_callViewBottom(
        context,
        strfrm,
        cpName: cpName,
        strParameter: strparameter,
      );
      break;
    case "pd":
    case "popupdialog":
      await V_callViewDialog(
        context,
        strfrm,
        cpName: cpName,
        strParameter: strparameter,
      );
      break;
    default:
      final screen = V_getScreen(strfrm, title, cpName, strparameter);
      if (screen == null) {
        debugPrint('⚠️ Không tìm thấy màn hình: $strfrm');
        return false;
      }
      if (clearAllStack) {
        Navigator.of(context).pushAndRemoveUntil(
          _buildPageRoute(screen, useHeroAnimation),
          (route) => false,
        );
      } else {
        // Navigate bình thường
        Navigator.push(context, _buildPageRoute(screen, useHeroAnimation));
      }

      break;
  }
  return true;
}