1,新增自定义短信模版列表接口对接

2,新增获取默认短信模版接口对接及相应逻辑处理
3,新增电子钥匙、密码模版相关逻辑及布局处理
4,新增添加短信模版(电子钥匙、密码)接口对接
5,修复新建短信模版点击报错不能展示问题
This commit is contained in:
Daisy 2024-06-04 14:44:04 +08:00
parent 6114044991
commit caf62a7413
19 changed files with 1184 additions and 594 deletions

View File

@ -861,5 +861,9 @@
"四": "Thu",
"五": "Fri",
"六": "Sat",
"日": "Sun"
"日": "Sun",
"新建短信模版":"New SMS template",
"自定义短信模版":"Custom SMS template",
"自定义邮件模版":"Custom email template",
"名称":"Name"
}

View File

@ -893,5 +893,9 @@
"四":"四",
"五":"五",
"六":"六",
"日":"日"
"日":"日",
"新建短信模版":"新建短信模版",
"自定义短信模版":"自定义短信模版",
"自定义邮件模版":"自定义邮件模版",
"名称":"名称"
}

View File

@ -334,8 +334,6 @@
"emailBuyTip": "您可通过邮件将密码、电子钥匙信息发给接收人。",
"currentRemainingQuantity": "当前剩余数量",
"buy": "购买",
"customSMSTemplate": "自定义短信模版",
"customMailTemplate": "自定义邮件模版",
"record": "记录",
"buyRealNameTip": "给用户发送电子钥匙时,可以要求其开锁前先进行人脸识别,以保证是他本人在操作。人脸实名认证调用国家公安系统接口,为付费功能,请购买次数后再使用。",
"buyRealNameSelectYouWantBuyTip": "请选择你希望的实名认证频次",
@ -863,5 +861,9 @@
"四": "四",
"五": "五",
"六": "六",
"日": "日"
"日": "日",
"新建短信模版":"新建短信模版",
"自定义短信模版":"自定义短信模版",
"自定义邮件模版":"自定义邮件模版",
"名称":"名称"
}

View File

@ -190,8 +190,8 @@ import 'mine/valueAddedServices/valueAddedServicesHighFunction/valueAddedService
import 'mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart';
import 'mine/valueAddedServices/valueAddedServicesNoteAndEmailDetail/valueAddedServicesNoteAndEmailDetail_page.dart';
import 'mine/valueAddedServices/valueAddedServicesRealName/value_added_services_real_name_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/valueAddedServicesAddSMSTemplate_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/valueAddedServicesListSMSTemplate_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_page.dart';
import 'mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_page.dart';
import 'mine/mineSet/authorizedAdministrator/authorizedAdministrator/authorizedAdministratorList_page.dart';
import 'starLockApplication/starLockApplication.dart';
import 'tools/seletKeyCyclicDate/seletKeyCyclicDate_page.dart';
@ -208,19 +208,25 @@ abstract class Routers {
static const String lockAddressGaoDePage = '/LockAddressGaoDePage'; // -
static const String saveLockPage = '/SaveLockPage'; //
static const String lockDetailMainPage = '/LockDetailMainPage'; //
static const String electronicKeyListPage = '/ElectronicKeyListPage'; //
static const String electronicKeyDetailPage = '/ElectronicKeyDetailPage'; //
static const String electronicKeyListPage =
'/ElectronicKeyListPage'; //
static const String electronicKeyDetailPage =
'/ElectronicKeyDetailPage'; //
static const String electronicKeyDetailChangeDate =
'/ElectronicKeyDetailChangeDate'; //
static const String sendElectronicKeyPage = '/SendElectronicKeyPage'; //
static const String sendElectronicKeyPage =
'/SendElectronicKeyPage'; //
static const String massSendElectronicKeyManagePage =
'/MassSendElectronicKeyManagePage'; //
static const String electronicKeyPeriodValidityPage =
'/ElectronicKeyPeriodValidityPage'; //
static const String sendEmailNotificationPage = '/SendEmailNotificationPage'; //
static const String sendEmailNotificationPage =
'/SendEmailNotificationPage'; //
static const String passwordKeyListPage = '/PasswordKeyListPage'; //
static const String passwordKeyPerpetualPage = '/PasswordKeyPerpetualPage'; //
static const String passwordKeyDetailPage = '/PasswordKeyDetailPage'; //
static const String passwordKeyPerpetualPage =
'/PasswordKeyPerpetualPage'; //
static const String passwordKeyDetailPage =
'/PasswordKeyDetailPage'; //
// static const otherTypeKeyListPage = '/OtherTypeKeyListPage'; //
// static const otherTypeKeyDetailPage = '/OtherTypeKeyDetailPage'; //
// static const otherTypeKeyManagePage = '/OtherTypeKeyManagePage'; //
@ -229,35 +235,41 @@ abstract class Routers {
static const String otherTypeKeyChangeValidityDatePage =
'/OtherTypeKeyChangeValidityDatePage'; //
static const String addFingerprintTipPage = '/AddFingerprintTipPage'; //
static const String addFingerprintTipPage =
'/AddFingerprintTipPage'; //
static const String addFingerprintPage = '/AddFingerprintPage'; //
static const String addICCardPage = '/AddICCardPage'; //
static const String authorizedAdminListPage = '/AuthorizedAdminListPage'; //
static const String authorizedAdminListPage =
'/AuthorizedAdminListPage'; //
static const String authorizedAdminDetailPage =
'/AuthorizedAdminDetailPage'; //
static const String authorizedAdminPage = '/AuthorizedAdminPage'; //
static const String volumeAuthorizationLockManagePage =
'/VolumeAuthorizationLockManagePage'; //
static const String lockOperatingRecordPage = '/LockOperatingRecordPage'; //
static const String lockOperatingRecordPage =
'/LockOperatingRecordPage'; //
static const String lockSetPage = '/LockSetPage'; //
static const String basicInformationPage = '/BasicInformationPage'; //
static const String uploadElectricQuantityPage =
'/UploadElectricQuantityPage'; //
static const String editLockNamePage = '/EditLockNamePage'; //
static const String lockSelectGroupingPage = '/LockSelectGroupingPage'; //
static const String lockSelectGroupingPage =
'/LockSelectGroupingPage'; //
static const String groupEditLockPage = '/GroupEditLockPage'; //
static const String adminOpenLockPasswordPage =
'/AdminOpenLockPasswordPage'; //
static const String wirelessKeyboardPage = '/WirelessKeyboardPage'; //
static const String addWirelessKeyboardPage = '/AddWirelessKeyboardPage'; //
static const String addWirelessKeyboardPage =
'/AddWirelessKeyboardPage'; //
static const String addWirelessKeyboardScreenNotLightOnPage =
'/AddWirelessKeyboardScreenNotLightOnPage'; //
static const String selectWirelessKeyboardPage =
'/SelectWirelessKeyboardPage'; //
static const String doorMagneticPage = '/DoorMagneticPage'; //
static const String addDoorMagneticPage = '/AddDoorMagneticPage'; //
static const String nearbyDoorMagneticPage = '/NearbyDoorMagneticPage'; //
static const String nearbyDoorMagneticPage =
'/NearbyDoorMagneticPage'; //
static const String remoteUnlockingPage = '/RemoteUnlockingPage'; //
static const String automaticBlockingPage = '/AutomaticBlockingPage'; //
static const String normallyOpenModePage = '/NormallyOpenModePage'; //
@ -270,21 +282,28 @@ abstract class Routers {
static const String lockTimePage = '/LockTimePage'; //
static const String diagnosePage = '/DiagnosePage'; //
static const String uploadDataPage = '/UploadDataPage'; //
static const String importOtherLockDataPage = '/ImportOtherLockDataPage'; //
static const String importOtherLockDataPage =
'/ImportOtherLockDataPage'; //
static const String lockEscalationPage = '/LockEscalationPage'; //
static const String markedHouseStatePage = '/MarkedHouseStatePage'; //
static const String checkInCreatCompanyPage = '/CheckInCreatCompanyPage'; //
static const String checkInCreatCompanyPage =
'/CheckInCreatCompanyPage'; //
static const String checkingInListPage = '/CheckingInListPage'; //
static const String checkingInSetPage = '/CheckingInSetPage'; //
static const String checkingInStaffManagePage = '/CheckingInStaffManagePage'; //
static const String checkingInAddStaffPage = '/CheckingInAddStaffPage'; //
static const String checkingInStaffDetailPage = '/CheckingInStaffDetailPage'; //
static const String checkingInStaffManagePage =
'/CheckingInStaffManagePage'; //
static const String checkingInAddStaffPage =
'/CheckingInAddStaffPage'; //
static const String checkingInStaffDetailPage =
'/CheckingInStaffDetailPage'; //
static const String checkingInSetWorkTimePage =
'/CheckingInSetWorkTimePage'; //
static const String checkingInSetWorkdaySet = '/CheckingInSetWorkdaySet'; //
static const String checkingInSetWorkdaySet =
'/CheckingInSetWorkdaySet'; //
static const String checkingInSetHolidaysPage =
'/CheckingInSetHolidaysPage'; //
static const String checkingInAddHolidaysPage = '/CheckingInAddHolidaysPage'; //
static const String checkingInAddHolidaysPage =
'/CheckingInAddHolidaysPage'; //
static const String checkingInDetailPage = '/CheckingInDetailPage'; //
static const String checkingInDeletHolidaysPage =
'/CheckingInDeletHolidaysPage'; //
@ -306,13 +325,15 @@ abstract class Routers {
'/MinePersonInfoSetSafetyProblemPage'; //
static const String minePersonInfoViewSafetyProblemPage =
'/MinePersonInfoViewSafetyProblemPage'; //
static const String mineBindPhoneOrEmailPage = '/MineBindPhoneOrEmailPage'; //-
static const String mineBindPhoneOrEmailPage =
'/MineBindPhoneOrEmailPage'; //-
static const String gatewayListPage = '/GatewayListPage'; // -
static const String gatewayDetailPage = '/GatewayDetailPage'; // -
static const String gatewayConnectionLockPage =
'/GatewayConnectionLockPage'; // -
static const String selectGatewayTypePage = '/SelectGatewayTypePage'; // -
static const String selectGatewayTypePage =
'/SelectGatewayTypePage'; // -
static const String selectGatewayTypeNextTipPage =
'/SelectGatewayTypeNextTipPage'; // -
static const String selectGatewayPage = '/SelectGatewayPage'; // -
@ -322,7 +343,8 @@ abstract class Routers {
static const String messageListPage = '/MessageListPage'; // -
static const String messageDetailPage = '/MessageDetailPage'; // -
static const String supportStaffPage = '/SupportStaffPage'; // -
static const String valueAddedServicesPage = '/ValueAddedServicesPage'; // -
static const String valueAddedServicesPage =
'/ValueAddedServicesPage'; // -
static const String aboutPage = '/AboutPage'; // -
static const String valueAddedServicesNoteAndEmailDetailPage =
@ -352,13 +374,15 @@ abstract class Routers {
static const String hideInvalidUnlockPermissionsPage =
'/HideInvalidUnlockPermissionsPage'; // -
static const String lockUserManageLisPage = '/LockUserManageLisPage'; //-
static const String lockUserManageLisPage =
'/LockUserManageLisPage'; //-
static const String authorizedAdministratorListPage =
'/AuthorizedAdministratorListPage'; //-
static const String lockGroupListPage = '/LockGroupListPage'; //-
static const String lockItemListPage = '/LockItemListPage'; //-
static const String transferSmartLockPage = '/transferSmartLockPage'; //
static const String recipientInformationPage = '/recipientInformationPage'; //
static const String recipientInformationPage =
'/recipientInformationPage'; //
static const String selectBranchPage = '/SelectBranchPage'; //
static const String selectGetewayListPage = '/selectGetewayListPage'; //
static const String addAuthorizedAdministratorPage =
@ -369,24 +393,30 @@ abstract class Routers {
static const String starLockRegisterPage = '/StarLockRegisterPage'; //
static const String starLockForgetPasswordPage =
'/StarLockForgetPasswordPage'; //
static const String selectCountryRegionPage = '/SelectCountryRegionPage'; //
static const String safetyVerificationPage = '/SafetyVerificationPage'; //
static const String selectCountryRegionPage =
'/SelectCountryRegionPage'; //
static const String safetyVerificationPage =
'/SafetyVerificationPage'; //
static const String getDeviceListPage = '/getDeviceListPage'; //
static const String getNameListPage = '/getNameListPage'; //
static const String authorityManagementPage = '/authorityManagementPage'; //
static const String authorityManagementPage =
'/authorityManagementPage'; //
static const String massSendLockGroupListPage =
'/massSendLockGroupListPage'; //
static const massSendReceiverPage = '/massSendReceiverPage'; //
static const lockUserListPage = '/lockUserListPage'; //
static const administratorDetailsPage = '/administratorDetailsPage'; //
static const expireLockManagePage = '/expireLockManagePage'; //
static const expireKeyChangeDatePage = '/ExpireKeyChangeDatePage'; //
static const adminDetailChangeDatePage = '/adminDetailChangeDatePage'; //
static const expireKeyChangeDatePage =
'/ExpireKeyChangeDatePage'; //
static const adminDetailChangeDatePage =
'/adminDetailChangeDatePage'; //
static const String adminLockListPage = '/adminLockListPage'; //
static const String safeVerifyPage = '/safeVerifyPage'; //
static const String webviewShowPage = '/webviewShowPage'; //
static const String demoModeLockDetailPage = '/DemoModeLockDetailPage'; //
static const String demoModeLockDetailPage =
'/DemoModeLockDetailPage'; //
static const String demoModeLockSetPage = '/DemoModeLockSetPage'; //
static const String addLockSelectCountryPage =
'/AddLockSelectCountryPage'; //
@ -404,8 +434,10 @@ abstract class Routers {
static const String catEyeSetPage = '/catEyeSetPage'; //
static const String coerceOpenDoorPage = '/coerceOpenDoorPage'; //
static const String coerceFingerprintPage = '/coerceFingerprintPage'; //
static const String lowBatteryReminderPage = '/lowBatteryReminderPage'; //
static const String coerceFingerprintListPage = '/coerceFingerprintListPage'; //
static const String lowBatteryReminderPage =
'/lowBatteryReminderPage'; //
static const String coerceFingerprintListPage =
'/coerceFingerprintListPage'; //
static const String lockMonitoringPage = '/LockMonitoringPage'; //
static const String monitoringRealTimeScreenPage =
'/MonitoringRealTimeScreenPage'; //
@ -422,7 +454,8 @@ abstract class Routers {
static const String addCardPage = '/AddCardPage'; //
static const String cardDetailPage = '/CardDetailPage'; //
static const String fingerprintListPage = '/FingerprintListPage'; //
static const String addFingerprintTypePage = '/AddFingerprintTypePage'; //
static const String addFingerprintTypePage =
'/AddFingerprintTypePage'; //
static const String fingerprintDetailPage = '/FingerprintDetailPage'; //
static const String faceListPage = '/FaceListPage'; //
static const String addFaceTypePage = '/AddFaceTypePage'; //
@ -447,7 +480,8 @@ abstract class Routers {
static const String accessoriesListPage = '/accessoriesListPage'; //
static const String seletKeyCyclicDatePage =
'/SeletKeyCyclicDatePage'; //
static const String advancedFeaturesWebPage = '/advancedFeaturesWebPage'; //
static const String advancedFeaturesWebPage =
'/advancedFeaturesWebPage'; //
static const String advancedFunctionRecordPage =
'/advancedFunctionRecordPage'; //
static const String administratorAssociationLockPage =
@ -834,11 +868,11 @@ abstract class AppRouters {
),
GetPage<dynamic>(
name: Routers.valueAddedServicesListSMSTemplatePage,
page: () => const ValueAddedServicesListSMSTemplatePage(),
page: () => const CustomSMSTemplateListPage(),
),
GetPage<dynamic>(
name: Routers.valueAddedServicesAddSMSTemplatePage,
page: () => const ValueAddedServicesAddSMSTemplatePage(),
page: () => const NewSMSTemplatePage(),
),
GetPage<dynamic>(
name: Routers.valueAddedServicesListEmailTemplatePage,
@ -902,7 +936,8 @@ abstract class AppRouters {
name: Routers.ownedKeyListPage, page: () => const OwnedKeyListPage()),
GetPage<dynamic>(
name: Routers.getDeviceListPage, page: () => const GetDeviceListPage()),
GetPage<dynamic>(name: Routers.getNameListPage, page: () => const GetNameListPage()),
GetPage<dynamic>(
name: Routers.getNameListPage, page: () => const GetNameListPage()),
GetPage<dynamic>(
name: Routers.authorityManagementPage,
page: () => const AuthorityManagementPage()),
@ -941,18 +976,21 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.otherTypeKeyChangeValidityDatePage,
page: () => const OtherTypeKeyChangeValidityDatePage()),
GetPage<dynamic>(name: Routers.addICCardPage, page: () => const AddICCardPage()),
GetPage<dynamic>(
name: Routers.addICCardPage, page: () => const AddICCardPage()),
GetPage<dynamic>(
name: Routers.adminDetailChangeDatePage,
page: () => const AdminDetailChangeDatePage()),
GetPage<dynamic>(
name: Routers.lockAddressGaoDePage,
page: () => const LockAddressGaoDePage()),
GetPage<dynamic>(name: Routers.safeVerifyPage, page: () => const SafeVerifyPage()),
GetPage<dynamic>(
name: Routers.safeVerifyPage, page: () => const SafeVerifyPage()),
GetPage<dynamic>(
name: Routers.minePersonInfoViewSafetyProblemPage,
page: () => const MinePersonInfoViewSafetyProblemPage()),
GetPage<dynamic>(name: Routers.webviewShowPage, page: () => const WebviewShowPage()),
GetPage<dynamic>(
name: Routers.webviewShowPage, page: () => const WebviewShowPage()),
GetPage<dynamic>(
name: Routers.demoModeLockSetPage,
page: () => const DemoModeLockSetPage()),
@ -962,8 +1000,10 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.addLockSelectCountryPage,
page: () => const AddLockSelectCountryPage()),
GetPage<dynamic>(name: Routers.faceUnlockPage, page: () => const FaceUnlockPage()),
GetPage<dynamic>(name: Routers.motorPowerPage, page: () => const MotorPowerPage()),
GetPage<dynamic>(
name: Routers.faceUnlockPage, page: () => const FaceUnlockPage()),
GetPage<dynamic>(
name: Routers.motorPowerPage, page: () => const MotorPowerPage()),
GetPage<dynamic>(
name: Routers.openDoorDirectionPage,
page: () => const OpenDoorDirectionPage()),
@ -973,7 +1013,8 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.msgNotificationPage,
page: () => const MsgNotificationPage()),
GetPage<dynamic>(name: Routers.addFacePage, page: () => const AddFacePage()),
GetPage<dynamic>(
name: Routers.addFacePage, page: () => const AddFacePage()),
GetPage<dynamic>(
name: Routers.nDaysUnopenedPage, page: () => const NDaysUnopenedPage()),
GetPage<dynamic>(
@ -982,9 +1023,12 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.openDoorNotifyPage,
page: () => const OpenDoorNotifyPage()),
GetPage<dynamic>(name: Routers.addFamilyPage, page: () => const AddFamilyPage()),
GetPage<dynamic>(name: Routers.lockUserPage, page: () => const LockUserPage()),
GetPage<dynamic>(name: Routers.catEyeSetPage, page: () => const CatEyeSetPage()),
GetPage<dynamic>(
name: Routers.addFamilyPage, page: () => const AddFamilyPage()),
GetPage<dynamic>(
name: Routers.lockUserPage, page: () => const LockUserPage()),
GetPage<dynamic>(
name: Routers.catEyeSetPage, page: () => const CatEyeSetPage()),
GetPage<dynamic>(
name: Routers.coerceOpenDoorPage,
page: () => const CoerceOpenDoorPage()),
@ -1003,7 +1047,8 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.monitoringRealTimeScreenPage,
page: () => const MonitoringRealTimeScreenPage()),
GetPage<dynamic>(name: Routers.videoLogPage, page: () => const VideoLogPage()),
GetPage<dynamic>(
name: Routers.videoLogPage, page: () => const VideoLogPage()),
GetPage<dynamic>(
name: Routers.editVideoLogPage, page: () => const EditVideoLogPage()),
GetPage<dynamic>(
@ -1018,12 +1063,15 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.addRemoteControlPage,
page: () => const AddRemoteControlPage()),
GetPage<dynamic>(name: Routers.cardListPage, page: () => const CardListPage()),
GetPage<dynamic>(
name: Routers.cardListPage, page: () => const CardListPage()),
// GetPage<dynamic>(
// name: Routers.addCardTypeManagePage,
// page: () => const AddCardTypeManagePage()),
GetPage<dynamic>(name: Routers.addCardPage, page: () => const AddCardPage()),
GetPage<dynamic>(name: Routers.cardDetailPage, page: () => const CardDetailPage()),
GetPage<dynamic>(
name: Routers.addCardPage, page: () => const AddCardPage()),
GetPage<dynamic>(
name: Routers.cardDetailPage, page: () => const CardDetailPage()),
GetPage<dynamic>(
name: Routers.fingerprintListPage,
page: () => const FingerprintListPage()),
@ -1033,41 +1081,51 @@ abstract class AppRouters {
GetPage<dynamic>(
name: Routers.fingerprintDetailPage,
page: () => const FingerprintDetailPage()),
GetPage<dynamic>(name: Routers.faceListPage, page: () => const FaceListPage()),
GetPage<dynamic>(name: Routers.addFaceTypePage, page: () => const AddFaceTypePage()),
GetPage<dynamic>(
name: Routers.faceListPage, page: () => const FaceListPage()),
GetPage<dynamic>(
name: Routers.addFaceTypePage, page: () => const AddFaceTypePage()),
GetPage<dynamic>(
name: Routers.passwordKeyDetailChangeDatePage,
page: () => const PasswordKeyDetailChangeDatePage()),
GetPage<dynamic>(
name: Routers.realTimePicturePage,
page: () => const RealTimePicturePage()),
GetPage<dynamic>(name: Routers.doorLockLogPage, page: () => const DoorLockLogPage()),
GetPage<dynamic>(
name: Routers.doorLockLogPage, page: () => const DoorLockLogPage()),
GetPage<dynamic>(
name: Routers.catEyeCustomModePage,
page: () => const CatEyeCustomModePage()),
GetPage<dynamic>(name: Routers.videoSlotPage, page: () => const VideoSlotPage()),
GetPage<dynamic>(name: Routers.liveVideoPage, page: () => const LiveVideoPage()),
GetPage<dynamic>(name: Routers.faceDetailPage, page: () => const FaceDetailPage()),
GetPage<dynamic>(
name: Routers.messageDetailPage,
page: () => const MessageDetailPage()),
name: Routers.videoSlotPage, page: () => const VideoSlotPage()),
GetPage<dynamic>(
name: Routers.liveVideoPage, page: () => const LiveVideoPage()),
GetPage<dynamic>(
name: Routers.faceDetailPage, page: () => const FaceDetailPage()),
GetPage<dynamic>(
name: Routers.messageDetailPage, page: () => const MessageDetailPage()),
GetPage<dynamic>(
name: Routers.accessoriesListPage,
page: () => const AccessoriesListPage()),
GetPage<dynamic>(name: Routers.wifiListPage, page: () => const WifiListPage()),
GetPage<dynamic>(
name: Routers.wifiListPage, page: () => const WifiListPage()),
GetPage<dynamic>(
name: Routers.seletKeyCyclicDatePage,
page: () => const SeletKeyCyclicDatePage()),
GetPage<dynamic>(name: Routers.irisListPage, page: () => const IrisListPage()),
GetPage<dynamic>(
name: Routers.irisListPage, page: () => const IrisListPage()),
GetPage<dynamic>(
name: Routers.addIrisTypeManagePage,
page: () => const AddIrisTypeManagePage()),
GetPage<dynamic>(name: Routers.addIrisPage, page: () => const AddIrisPage()),
GetPage<dynamic>(name: Routers.palmListPage, page: () => const PalmListPage()),
page: () => const AddIrisTypeManagePage()),
GetPage<dynamic>(
name: Routers.addIrisPage, page: () => const AddIrisPage()),
GetPage<dynamic>(
name: Routers.palmListPage, page: () => const PalmListPage()),
GetPage<dynamic>(
name: Routers.addPalmTypeManagePage,
page: () => const AddPalmTypeManagePage()),
GetPage<dynamic>(name: Routers.addPalmPage, page: () => const AddPalmPage()),
GetPage<dynamic>(
name: Routers.addPalmPage, page: () => const AddPalmPage()),
GetPage<dynamic>(
name: Routers.advancedFeaturesWebPage,
page: () => const AdvancedFeaturesWebPage()),

View File

@ -131,7 +131,7 @@ class _ValueAddedServicesNoteAndEmailDetailPageState
),
Text(
(type == 1)
? TranslationLoader.lanKeys!.customSMSTemplate!.tr
? '自定义短信模版'.tr
: TranslationLoader.lanKeys!.customMailTemplate!.tr,
style: TextStyle(fontSize: 24.sp),
),

View File

@ -0,0 +1,53 @@
class NewSMSTemplateEntity {
NewSMSTemplateEntity(
{this.errorCode, this.description, this.errorMsg, this.dataList});
NewSMSTemplateEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
if (json['data'] != null) {
dataList = <SMSTemplateData>[];
json['data'].forEach((v) {
dataList!.add(SMSTemplateData.fromJson(v));
});
}
}
int? errorCode;
String? description;
String? errorMsg;
List<SMSTemplateData>? dataList;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (dataList != null) {
data['data'] = dataList!.map((v) => v.toJson()).toList();
}
return data;
}
}
class SMSTemplateData {
SMSTemplateData({this.contentType, this.name, this.template, this.fixedKey});
SMSTemplateData.fromJson(Map<String, dynamic> json) {
contentType = json['content_type'];
name = json['name'];
template = json['template'];
fixedKey = json['fixed_key'];
}
int? contentType;
String? name;
String? template;
String? fixedKey;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['content_type'] = contentType;
data['name'] = name;
data['template'] = template;
data['fixed_key'] = fixedKey;
return data;
}
}

View File

@ -0,0 +1,192 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/login/login/entity/LoginEntity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_state.dart';
import 'package:star_lock/tools/regularExpression.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';
class NewSMSTemplateLogic extends BaseGetXController {
NewSMSTemplateState state = NewSMSTemplateState();
//-- 1: 2:
Future<void> getDefaultTemplate() async {
final NewSMSTemplateEntity entity =
await ApiRepository.to.getDefaultTemplate(type: 1);
if (entity.errorCode!.codeIsSuccessful) {
state.templateList.value = entity.dataList ?? <SMSTemplateData>[];
if (state.templateList.isNotEmpty) {
state.templateTypeText.value = state.templateList[0].name ?? '';
state.currentTemplate.value = state.templateList.firstWhere(
(SMSTemplateData element) =>
element.name == state.templateTypeText.value,
);
state.templateTypeText.refresh();
state.currentTemplate.refresh();
}
}
}
//-- 1: 2:
Future<void> addSMSTemplate() async {
if (state.templateNameTf.text.isEmpty) {
showToast('请输入模板名称');
return;
}
final LoginEntity entity = await ApiRepository.to.addSMSTemplate(
type: 1,
name: state.templateNameTf.text,
fixedKey: state.currentTemplate.value.fixedKey ?? '',
contentType: state.currentTemplate.value.contentType ?? 0,
regards: state.templateOneTf.text,
tips: state.templateTwoTf.text);
if (entity.errorCode!.codeIsSuccessful) {
showToast('添加成功');
Get.back();
}
}
List<TextSpan> buildElectronicKeySpan({required bool isPreview}) {
final List<TextSpan> textSpans = <TextSpan>[];
//
if (isPreview) {
textSpans.add(
TextSpan(
text: '${state.templateOneTf.text}\n',
style: state.defaultStyle,
),
);
}
//
final List<String> textFragments = state.currentTemplate.value.template
?.split(RegularExpression.urlRegExp) ??
[];
//
for (int i = 0; i < textFragments.length; i++) {
final String textFragment = textFragments[i];
//
textSpans.add(
TextSpan(
text: textFragment,
style: state.defaultStyle,
),
);
//
if (i < textFragments.length - 1) {
textSpans.add(
TextSpan(
text: '\n',
style: state.defaultStyle,
),
);
//
textSpans.add(
TextSpan(
text: RegularExpression.urlRegExp
.stringMatch(state.currentTemplate.value.template!) ??
'',
style: state.highStyle,
),
);
}
}
//
if (isPreview) {
textSpans.add(
TextSpan(
text: '\n${state.templateTwoTf.text}',
style: state.defaultStyle,
),
);
}
return textSpans;
}
List<TextSpan> buildPasswordSpan({required bool isPreview}) {
final List<TextSpan> textSpans = <TextSpan>[];
//
if (isPreview) {
textSpans.add(
TextSpan(
text: '${state.templateOneTf.text}\n',
style: state.defaultStyle,
),
);
}
// ${}
final RegExp variableRegExp = RegExp(r'\$\{([^}]+)\}');
final String template = state.currentTemplate.value.template ?? '';
//
int startIndex = 0;
for (final Match match in variableRegExp.allMatches(template)) {
//
final String nonVariableText =
template.substring(startIndex, match.start);
//
final String replacedNonVariableText =
nonVariableText.replaceAllMapped(RegExp(r'|。'), (Match match) {
return '${match.group(0)}\n';
});
textSpans.add(
TextSpan(
text: replacedNonVariableText,
style: state.defaultStyle,
),
);
//
final String variableText = match.group(0) ?? '';
textSpans.add(
TextSpan(
text: variableText,
style: state.highStyle,
),
);
//
startIndex = match.end;
}
//
final String remainingText = template.substring(startIndex);
//
final String replacedRemainingText =
remainingText.replaceAllMapped(RegExp(r'|。'), (Match match) {
return '${match.group(0)}\n';
});
textSpans.add(
TextSpan(
text: replacedRemainingText,
style: state.defaultStyle,
),
);
//
if (isPreview) {
textSpans.add(
TextSpan(
text: '\n${state.templateTwoTf.text}',
style: state.defaultStyle,
),
);
}
return textSpans;
}
@override
Future<void> onReady() async {
super.onReady();
}
}

View File

@ -0,0 +1,265 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_logic.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_state.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/showBottomSheetTool.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
class NewSMSTemplatePage extends StatefulWidget {
const NewSMSTemplatePage({Key? key}) : super(key: key);
@override
State<NewSMSTemplatePage> createState() => _NewSMSTemplatePageState();
}
class _NewSMSTemplatePageState extends State<NewSMSTemplatePage> {
final NewSMSTemplateLogic logic = Get.put(NewSMSTemplateLogic());
final NewSMSTemplateState state = Get.find<NewSMSTemplateLogic>().state;
@override
void initState() {
super.initState();
logic.getDefaultTemplate();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: '新建短信模版'.tr,
haveBack: true,
backgroundColor: AppColors.mainColor,
),
body: SingleChildScrollView(
child: Column(
children: <Widget>[
_buildEditTopInfo(),
SizedBox(height: 10.h),
_buildEditTemplate(),
SizedBox(height: 10.h),
_buildPreView(),
SizedBox(height: 42.h),
Container(
margin: EdgeInsets.symmetric(horizontal: 20.w),
child: SubmitBtn(
btnName: TranslationLoader.lanKeys!.save!.tr,
onClick: () {
logic.addSMSTemplate();
},
),
),
SizedBox(height: 40.h),
],
),
),
);
}
Widget _buildEditTopInfo() {
return Column(
children: <Widget>[
CommonItem(
leftTitel: '名称'.tr,
rightTitle: '',
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(
state.templateNameTf,
TranslationLoader.lanKeys!.pleaseEnter!.tr,
),
),
Obx(
() => CommonItem(
leftTitel: TranslationLoader.lanKeys!.type!.tr,
rightTitle: state.templateTypeText.value,
isHaveLine: false,
isHaveDirection: true,
action: _showSelectTemplateType,
),
),
],
);
}
Widget _buildEditTemplate() {
return Container(
color: Colors.white,
child: Column(
children: <Widget>[
Row(
children: <Widget>[
Padding(
padding: EdgeInsets.all(25.w),
child: Text(
TranslationLoader.lanKeys!.templateContent!.tr,
style:
TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600),
),
),
],
),
Container(
margin: EdgeInsets.symmetric(horizontal: 25.w, vertical: 25.h),
height: 100,
child: _buildTextField(state.templateOneTf),
),
Obx(() => _buildTemplateWithType(isPreview: false)),
SizedBox(height: 10.h),
Container(
margin: EdgeInsets.symmetric(horizontal: 25.w, vertical: 25.h),
height: 100,
child: Stack(
alignment: Alignment.bottomRight,
children: <Widget>[
_buildTextField(state.templateTwoTf),
],
),
),
],
),
);
}
Widget _buildPreView() {
return Container(
color: Colors.white,
margin: EdgeInsets.only(bottom: 20.h),
child: Column(
children: <Widget>[
Padding(
padding: EdgeInsets.only(top: 25.h, bottom: 25.h, left: 25.w),
child: Align(
alignment: Alignment.centerLeft,
child: Text(
TranslationLoader.lanKeys!.preview!.tr,
style: TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600),
textAlign: TextAlign.left,
),
),
),
Obx(() => Container(
margin: EdgeInsets.only(left: 25.w, right: 25.w),
decoration: BoxDecoration(
color: const Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(10.h),
),
child: _buildTemplateWithType(isPreview: true),
)),
Padding(
padding: EdgeInsets.only(
left: 25.w,
top: 25.h,
bottom: 25.h,
),
child: Text(
'预计产生短信条数2',
style: TextStyle(
color: Colors.grey,
fontSize: 20.sp,
),
),
),
],
),
);
}
Widget _buildTemplateWithType({required bool isPreview}) {
//
if (state.currentTemplate.value.template == null ||
state.currentTemplate.value.template!.isEmpty) {
return const SizedBox.shrink(); // SizedBox
} else {
return Row(
children: <Widget>[
Padding(
padding: EdgeInsets.symmetric(horizontal: 25.w, vertical: 10.h),
child: Obx(() => RichText(
text: TextSpan(
children: state.templateTypeText.value == '电子钥匙'
? logic.buildElectronicKeySpan(isPreview: isPreview)
: logic.buildPasswordSpan(isPreview: isPreview),
),
)),
),
],
);
}
}
Widget _buildTextField(TextEditingController controller) {
return TextField(
maxLines: 8,
textAlign: TextAlign.start,
controller: controller,
style: state.defaultStyle,
decoration: InputDecoration(
contentPadding: EdgeInsets.all(20.w),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(20.h),
borderSide: const BorderSide(color: Color(0xffB2B2B2), width: 0.5),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(20.h),
borderSide: const BorderSide(color: Color(0xffB2B2B2), width: 1),
),
),
onChanged: (String value) {
controller.text = value;
},
);
}
Widget getTFWidget(TextEditingController tfController, String tfStr) {
return SizedBox(
height: 50.h,
width: 300.w,
child: Row(
children: <Widget>[
Expanded(
child: TextField(
maxLines: 1,
controller: tfController,
autofocus: false,
textAlign: TextAlign.end,
decoration: InputDecoration(
contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
hintText: tfStr,
hintStyle: TextStyle(fontSize: 22.sp),
border: InputBorder.none,
),
),
),
],
),
);
}
void _showSelectTemplateType() {
final List<String> titleList = state.templateList
.map((SMSTemplateData template) => template.name ?? '')
.toList();
ShowBottomSheetTool().showSingleRowPicker(
context,
normalIndex: 0,
title: TranslationLoader.lanKeys!.type!.tr,
cancelTitle: TranslationLoader.lanKeys!.cancel!.tr,
sureTitle: TranslationLoader.lanKeys!.sure!.tr,
data: titleList,
clickCallBack: (int index, Object str) {
state.templateTypeText.value = str.toString();
state.templateTypeText.refresh();
state.currentTemplate.value = state.templateList[index];
state.currentTemplate.refresh();
},
);
}
}

View File

@ -0,0 +1,57 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_entity.dart';
class NewSMSTemplateState {
//
final TextStyle highStyle =
TextStyle(color: const Color(0xFFEEDFA8), fontSize: 20.sp);
//
final TextStyle defaultStyle =
TextStyle(color: Colors.black, fontSize: 20.sp);
//-
// late InlineSpan passwardSpan = TextSpan(children: <InlineSpan>[
// TextSpan(
// text:
// '${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.yourRoomIs!.tr}',
// style: defaultStyle),
// TextSpan(text: '201', style: highStyle),
// TextSpan(
// text: ' ${TranslationLoader.lanKeys!.theCodeToOpenTheDoorIs!.tr} ',
// style: defaultStyle),
// TextSpan(text: '332211\n', style: highStyle),
// TextSpan(
// text: '${TranslationLoader.lanKeys!.periodValidity!.tr} ',
// style: defaultStyle),
// TextSpan(text: '2021.12.11 12:00 - 2021.12.12 13:00。\n', style: highStyle),
// TextSpan(
// text: TranslationLoader.lanKeys!.templateTip1!.tr, style: defaultStyle),
// ]);
//-
// late InlineSpan electronicKeySpan = TextSpan(children: <InlineSpan>[
// TextSpan(
// text:
// '${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.templateTip2!.tr}',
// style: defaultStyle),
// TextSpan(text: 'https://abc.com/bcd\n', style: highStyle),
// TextSpan(
// text: '${TranslationLoader.lanKeys!.templateTip3!.tr}\n',
// style: defaultStyle),
// TextSpan(text: 'https://abc.com/bcd', style: highStyle),
// ]);
final TextEditingController templateOneTf = TextEditingController();
final TextEditingController templateTwoTf = TextEditingController();
final TextEditingController templateNameTf = TextEditingController();
RxBool isVip = false.obs;
RxList<SMSTemplateData> templateList = <SMSTemplateData>[].obs;
RxString templateTypeText = '电子钥匙'.tr.obs;
RxString templateContentText = ''.obs; //
Rx<SMSTemplateData> currentTemplate = SMSTemplateData().obs;
RxBool isShowDate = false.obs;
}

View File

@ -1,489 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import '../../../../tools/commonItem.dart';
import '../../../../tools/showBottomSheetTool.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
//
final TextStyle highStyle =
TextStyle(color: const Color(0xFFEEDFA8), fontSize: 20.sp);
//
final TextStyle defaultStyle = TextStyle(color: Colors.black, fontSize: 20.sp);
//-
late InlineSpan passwardSpan = TextSpan(children: [
TextSpan(
text:
'${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.yourRoomIs!.tr}',
style: defaultStyle),
TextSpan(text: '201', style: highStyle),
TextSpan(
text: ' ${TranslationLoader.lanKeys!.theCodeToOpenTheDoorIs!.tr} ',
style: defaultStyle),
TextSpan(text: '332211\n', style: highStyle),
TextSpan(
text: '${TranslationLoader.lanKeys!.periodValidity!.tr} ',
style: defaultStyle),
TextSpan(text: '2021.12.11 12:00 - 2021.12.12 13:00。\n', style: highStyle),
TextSpan(
text: TranslationLoader.lanKeys!.templateTip1!.tr, style: defaultStyle),
]);
//-
late InlineSpan electronicKeySpan = TextSpan(children: [
TextSpan(
text:
'${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.templateTip2!.tr}',
style: defaultStyle),
TextSpan(text: 'https://abc.com/bcd\n', style: highStyle),
TextSpan(
text: '${TranslationLoader.lanKeys!.templateTip3!.tr}\n',
style: defaultStyle),
TextSpan(text: 'https://abc.com/bcd', style: highStyle),
]);
class ValueAddedServicesAddSMSTemplatePage extends StatefulWidget {
const ValueAddedServicesAddSMSTemplatePage({Key? key}) : super(key: key);
@override
State<ValueAddedServicesAddSMSTemplatePage> createState() =>
_ValueAddedServicesAddSMSTemplatePageState();
}
class _ValueAddedServicesAddSMSTemplatePageState
extends State<ValueAddedServicesAddSMSTemplatePage> {
final _templateOneTf = TextEditingController();
final _templateTwoTf = TextEditingController();
final _templateNameTf = TextEditingController();
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
_templateOneTf.text = TranslationLoader.lanKeys!.hello!.tr;
_templateTwoTf.text = TranslationLoader.lanKeys!.templateTip1!.tr;
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.customSMSTemplate!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
body: ListView(
children: [
_buildEditTopInfo(),
SizedBox(
height: 10.h,
),
_buildEditTemplate(),
SizedBox(
height: 10.h,
),
_buildpreview(),
SizedBox(height: 42.h),
Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w),
child: SubmitBtn(
btnName: TranslationLoader.lanKeys!.save!.tr,
borderRadius: 10.w,
margin: EdgeInsets.only(
left: 30.w, right: 30.w, top: 30.w, bottom: 30.w),
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
onClick: () {
// Navigator.pushNamed(context, Routers.sendElectronicKeyManagePage);
}),
),
SizedBox(
height: 40.h,
)
],
));
}
Widget _buildEditTopInfo() {
return Column(
children: [
CommonItem(
leftTitel: TranslationLoader.lanKeys!.name!.tr,
rightTitle: "",
isHaveLine: true,
isHaveRightWidget: true,
rightWidget: getTFWidget(
_templateNameTf, TranslationLoader.lanKeys!.pleaseEnter!.tr)),
CommonItem(
leftTitel: TranslationLoader.lanKeys!.type!.tr,
rightTitle: TranslationLoader.lanKeys!.password!.tr,
isHaveLine: false,
action: () {
_showSelectTemplateType();
}),
],
);
}
Widget _buildEditTemplate() {
return Container(
color: Colors.white,
child: Column(
children: [
Row(
children: [
Padding(
padding: EdgeInsets.only(
left: 25.w, top: 25.h, bottom: 25.h, right: 25.w),
child: Text(
TranslationLoader.lanKeys!.templateContent!.tr,
style:
TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w600),
),
),
],
),
Container(
margin: EdgeInsets.only(left: 25.w, right: 25.w, bottom: 25.h),
height: 100,
child: TextField(
maxLines: 8,
// maxLength:1000,
textAlign: TextAlign.start,
controller: _templateOneTf,
style: TextStyle(
color: Colors.black,
fontSize: 20.sp,
),
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
top: 20.h, left: 20.w, right: 20.w, bottom: 20.h),
border: OutlineInputBorder(
///
borderRadius: BorderRadius.all(Radius.circular(20.h)),
///
borderSide: const BorderSide(
///
color: Color(0xffB2B2B2),
///
width: 0.5,
),
),
///
focusedBorder: OutlineInputBorder(
///
borderRadius: BorderRadius.all(Radius.circular(20.h)),
///
borderSide: const BorderSide(
///
color: Color(0xffB2B2B2),
///
width: 1,
),
),
),
),
),
Visibility(
visible: true,
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
Padding(
padding:
EdgeInsets.only(left: 25.w, top: 10.h, right: 25.w),
child: RichText(
text: TextSpan(children: [
TextSpan(
text:
'${TranslationLoader.lanKeys!.yourRoomIs!.tr} ',
style: defaultStyle),
TextSpan(
text:
'{${TranslationLoader.lanKeys!.roomName!.tr}}',
style: highStyle),
TextSpan(
text:
' ${TranslationLoader.lanKeys!.theCodeToOpenTheDoorIs!.tr} ',
style: defaultStyle),
TextSpan(
text:
'{${TranslationLoader.lanKeys!.password!.tr}}',
style: highStyle),
]))),
],
),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: EdgeInsets.only(left: 25.w, top: 10.h),
child: RichText(
text: TextSpan(children: [
TextSpan(
text:
'${TranslationLoader.lanKeys!.periodValidity!.tr} ',
style: defaultStyle),
TextSpan(
text:
'{${TranslationLoader.lanKeys!.periodValidity!.tr}}',
style: highStyle),
]))),
SizedBox(
width: 10.w,
),
GestureDetector(
onTap: () {},
child: Row(
children: [
Image.asset(
'images/icon_round_unSelect.png',
width: 26.w,
height: 26.w,
),
],
),
)
],
),
],
),
),
Visibility(
visible: false,
child: Row(
children: [
Padding(
padding:
EdgeInsets.only(left: 25.w, top: 10.h, right: 25.w),
child: RichText(
text: TextSpan(children: [
TextSpan(
text:
'${TranslationLoader.lanKeys!.templateTip2!.tr}\n',
style: defaultStyle),
TextSpan(
text: 'https://abc.com/bcd\n',
style: TextStyle(
color: const Color(0xFFEEDFA8), fontSize: 20.sp)),
TextSpan(
text:
'${TranslationLoader.lanKeys!.templateTip3!.tr}\n',
style: defaultStyle),
TextSpan(
text: 'https://abc.com/bcd\n',
style: TextStyle(
color: const Color(0xFFEEDFA8), fontSize: 20.sp)),
]))),
],
),
),
SizedBox(height: 10.h),
Container(
margin: EdgeInsets.only(left: 25.w, right: 25.w, bottom: 25.h),
height: 100,
child: Stack(
alignment: Alignment.bottomRight,
children: [
TextField(
maxLines: 8,
// maxLength:1000,
textAlign: TextAlign.start,
controller: _templateTwoTf,
style: TextStyle(
color: Colors.black,
fontSize: 20.sp,
),
decoration: InputDecoration(
contentPadding: EdgeInsets.only(
top: 20.h, left: 20.w, right: 20.w, bottom: 20.h),
border: OutlineInputBorder(
///
borderRadius: BorderRadius.all(Radius.circular(20.h)),
///
borderSide: const BorderSide(
///
color: Color(0xffB2B2B2),
///
width: 0.5,
),
),
///
focusedBorder: OutlineInputBorder(
///
borderRadius: BorderRadius.all(Radius.circular(20.h)),
///
borderSide: const BorderSide(
///
color: Color(0xffB2B2B2),
///
width: 1,
),
),
),
)
],
),
),
],
),
);
}
Widget _buildpreview() {
return Column(
// mainAxisAlignment: MainAxisAlignment.start,
children: [
Container(
color: Colors.white,
margin: EdgeInsets.only(bottom: 20.h),
child: Column(
children: [
Column(
children: [
Row(
children: [
Padding(
padding: EdgeInsets.only(
left: 25.w,
top: 25.h,
bottom: 25.h,
right: 25.w),
child: Text(
TranslationLoader.lanKeys!.preview!.tr,
style: TextStyle(
fontSize: 20.sp, fontWeight: FontWeight.w600),
),
),
],
),
Container(
margin: EdgeInsets.only(left: 25.w, right: 25.w),
decoration: BoxDecoration(
color: const Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(10.h),
),
child: Padding(
padding: EdgeInsets.only(
left: 20.w,
top: 20.h,
right: 20.w,
bottom: 20.h),
child: RichText(text: passwardSpan)),
),
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
left: 25.w,
top: 25.h,
bottom: 25.h,
),
child: Text(
'${TranslationLoader.lanKeys!.expectedNotoCount!.tr}2',
style: TextStyle(
color: Colors.grey,
fontSize: 20.sp,
),
),
)
],
)
/*
Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
// left: 25.w,
top: 25.h,
bottom: 25.h,
),
child: Text(
'${TranslationLoader.lanKeys!.expectedNotoCount!.tr}2',
style: TextStyle(
color: Colors.grey,
fontSize: 20.sp,
),
),
),
],
),
*/
],
),
],
))
]);
}
Widget getTFWidget(TextEditingController tfController, String tfStr) {
return Container(
height: 50.h,
width: 300.w,
child: Row(
children: [
Expanded(
child: TextField(
//
maxLines: 1,
controller: tfController,
autofocus: false,
textAlign: TextAlign.end,
decoration: InputDecoration(
//
contentPadding: const EdgeInsets.only(top: 12.0, bottom: 8.0),
hintText: tfStr,
hintStyle: TextStyle(fontSize: 22.sp),
//线
border: InputBorder.none,
),
),
),
],
),
);
}
void _showSelectTemplateType() {
var list = [
TranslationLoader.lanKeys!.electronicKey!.tr,
TranslationLoader.lanKeys!.password!.tr
];
ShowBottomSheetTool().showSingleRowPicker(
//
context,
//
normalIndex: 0,
title: TranslationLoader.lanKeys!.type!.tr,
cancelTitle: TranslationLoader.lanKeys!.cancel!.tr,
sureTitle: TranslationLoader.lanKeys!.sure!.tr,
//
//
//adapter: PickerAdapter(),
data: list,
//
clickCallBack: (int index, var str) {});
}
}

View File

@ -0,0 +1,130 @@
class CustomSMSTemplateListEntity {
CustomSMSTemplateListEntity(
{this.errorCode, this.description, this.errorMsg, this.data});
CustomSMSTemplateListEntity.fromJson(Map<String, dynamic> json) {
errorCode = json['errorCode'];
description = json['description'];
errorMsg = json['errorMsg'];
data = json['data'] != null
? CustomSMSTemplateListData.fromJson(json['data'])
: null;
}
int? errorCode;
String? description;
String? errorMsg;
CustomSMSTemplateListData? data;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['errorCode'] = errorCode;
data['description'] = description;
data['errorMsg'] = errorMsg;
if (this.data != null) {
data['data'] = this.data!.toJson();
}
return data;
}
}
class CustomSMSTemplateListData {
CustomSMSTemplateListData(
{this.type,
this.list,
this.pageNo,
this.pageSize,
this.pages,
this.total});
CustomSMSTemplateListData.fromJson(Map<String, dynamic> json) {
type = json['type'];
if (json['list'] != null) {
list = <CustomSMSTemplateItem>[];
json['list'].forEach((v) {
list!.add(CustomSMSTemplateItem.fromJson(v));
});
}
pageNo = json['pageNo'];
pageSize = json['pageSize'];
pages = json['pages'];
total = json['total'];
}
int? type;
List<CustomSMSTemplateItem>? list;
int? pageNo;
int? pageSize;
int? pages;
int? total;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['type'] = type;
if (list != null) {
data['list'] = list!.map((v) => v.toJson()).toList();
}
data['pageNo'] = pageNo;
data['pageSize'] = pageSize;
data['pages'] = pages;
data['total'] = total;
return data;
}
}
class CustomSMSTemplateItem {
CustomSMSTemplateItem(
{this.id,
this.userId,
this.type,
this.contentType,
this.name,
this.regards,
this.tips,
this.fixedKey,
this.createdAt,
this.updatedAt,
this.template,
this.fixedTemplate});
CustomSMSTemplateItem.fromJson(Map<String, dynamic> json) {
id = json['id'];
userId = json['user_id'];
type = json['type'];
contentType = json['content_type'];
name = json['name'];
regards = json['regards'];
tips = json['tips'];
fixedKey = json['fixed_key'];
createdAt = json['created_at'];
updatedAt = json['updated_at'];
template = json['template'];
fixedTemplate = json['fixed_template'];
}
int? id;
int? userId;
int? type;
int? contentType;
String? name;
String? regards;
String? tips;
String? fixedKey;
String? createdAt;
String? updatedAt;
String? template;
String? fixedTemplate;
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['id'] = id;
data['user_id'] = userId;
data['type'] = type;
data['content_type'] = contentType;
data['name'] = name;
data['regards'] = regards;
data['tips'] = tips;
data['fixed_key'] = fixedKey;
data['created_at'] = createdAt;
data['updated_at'] = updatedAt;
data['template'] = template;
data['fixed_template'] = fixedTemplate;
return data;
}
}

View File

@ -0,0 +1,155 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_state.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/storage.dart';
import '../../../../network/api_repository.dart';
import '../../../../tools/baseGetXController.dart';
class CustomSMSTemplateListLogic extends BaseGetXController {
CustomSMSTemplateListState state = CustomSMSTemplateListState();
//
Future<void> getSMSTemplateListRequest() async {
final CustomSMSTemplateListEntity entity = await ApiRepository.to
.getSMSTemplateList(type: 1, pageNo: 1, pageSize: 20);
if (entity.errorCode!.codeIsSuccessful) {
state.smsTemplateList.value =
entity.data?.list ?? <CustomSMSTemplateItem>[];
state.smsTemplateList.refresh();
}
}
List<TextSpan> buildElectronicKeySpan(
{required CustomSMSTemplateItem templateData}) {
final List<TextSpan> textSpans = <TextSpan>[];
textSpans.add(
TextSpan(
text: '${templateData.regards}\n',
style: state.defaultStyle,
),
);
//
final List<String> textFragments =
templateData.template?.split(RegularExpression.urlRegExp) ?? [];
//
for (int i = 0; i < textFragments.length; i++) {
final String textFragment = textFragments[i];
//
textSpans.add(
TextSpan(
text: textFragment,
style: state.defaultStyle,
),
);
//
if (i < textFragments.length - 1) {
textSpans.add(
TextSpan(
text: '\n',
style: state.defaultStyle,
),
);
//
textSpans.add(
TextSpan(
text: RegularExpression.urlRegExp
.stringMatch(templateData.template!) ??
'',
style: state.highStyle,
),
);
}
}
textSpans.add(
TextSpan(
text: '\n${templateData.tips}',
style: state.defaultStyle,
),
);
return textSpans;
}
List<TextSpan> buildPasswordSpan(
{required CustomSMSTemplateItem templateData}) {
final List<TextSpan> textSpans = <TextSpan>[];
textSpans.add(
TextSpan(
text: '${templateData.regards}\n',
style: state.defaultStyle,
),
);
// ${}
final RegExp variableRegExp = RegExp(r'\$\{([^}]+)\}');
final String template = templateData.template ?? '';
//
int startIndex = 0;
for (final Match match in variableRegExp.allMatches(template)) {
//
final String nonVariableText =
template.substring(startIndex, match.start);
//
final String replacedNonVariableText =
nonVariableText.replaceAllMapped(RegExp(r'|。'), (Match match) {
return '${match.group(0)}\n';
});
textSpans.add(
TextSpan(
text: replacedNonVariableText,
style: state.defaultStyle,
),
);
//
final String variableText = match.group(0) ?? '';
textSpans.add(
TextSpan(
text: variableText,
style: state.highStyle,
),
);
//
startIndex = match.end;
}
//
final String remainingText = template.substring(startIndex);
//
final String replacedRemainingText =
remainingText.replaceAllMapped(RegExp(r'|。'), (Match match) {
return '${match.group(0)}\n';
});
textSpans.add(
TextSpan(
text: replacedRemainingText,
style: state.defaultStyle,
),
);
textSpans.add(
TextSpan(
text: '\n${templateData.tips}',
style: state.defaultStyle,
),
);
return textSpans;
}
@override
onReady() async {
var isVip = await Storage.getBool(saveIsVip);
state.isVip.value = isVip ?? false;
}
}

View File

@ -1,36 +1,52 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_logic.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_state.dart';
import 'package:star_lock/tools/noData.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
import '../../../../tools/submitBtn.dart';
import '../../../../tools/titleAppBar.dart';
import '../../../../translations/trans_lib.dart';
import '../valueAddedServicesAddSMSTemplate/valueAddedServicesAddSMSTemplate_page.dart';
class ValueAddedServicesListSMSTemplatePage extends StatefulWidget {
const ValueAddedServicesListSMSTemplatePage({Key? key}) : super(key: key);
class CustomSMSTemplateListPage extends StatefulWidget {
const CustomSMSTemplateListPage({Key? key}) : super(key: key);
@override
State<ValueAddedServicesListSMSTemplatePage> createState() =>
_ValueAddedServicesListSMSTemplatePageState();
State<CustomSMSTemplateListPage> createState() =>
_CustomSMSTemplateListPageState();
}
class _ValueAddedServicesListSMSTemplatePageState
extends State<ValueAddedServicesListSMSTemplatePage> {
class _CustomSMSTemplateListPageState extends State<CustomSMSTemplateListPage> {
final CustomSMSTemplateListLogic logic =
Get.put(CustomSMSTemplateListLogic());
final CustomSMSTemplateListState state =
Get.find<CustomSMSTemplateListLogic>().state;
@override
void initState() {
super.initState();
logic.getSMSTemplateListRequest();
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: AppColors.mainBackgroundColor,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.customSMSTemplate!.tr,
barTitle: '自定义短信模版'.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
body: Column(
children: [
_topTipWidget(),
Expanded(child: _buildMainUI()),
children: <Widget>[
Obx(() => Visibility(
child: _topTipWidget(),
visible: !state.isVip.value,
)),
Expanded(child: Obx(buildMainUI)),
SubmitBtn(
btnName: TranslationLoader.lanKeys!.creatingANewTemplate!.tr,
borderRadius: 20.w,
@ -57,7 +73,7 @@ class _ValueAddedServicesListSMSTemplatePageState
decoration: BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.circular(5)),
child: Column(
children: [
children: <Widget>[
Text(
TranslationLoader.lanKeys!.customTemplatesTip!.tr,
style: TextStyle(
@ -76,15 +92,15 @@ class _ValueAddedServicesListSMSTemplatePageState
borderRadius: BorderRadius.circular(10.h)),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
children: <Widget>[
SizedBox(
width: 1.sw - 15.w * 2 - 40.w * 2 - 140.w,
// margin: EdgeInsets.only(top:15.h, left: 15.w, right: 15.w, bottom: 15.h),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
children: <Widget>[
Text(
"${TranslationLoader.lanKeys!.currentState!.tr}${TranslationLoader.lanKeys!.onTrial!.tr}",
'${TranslationLoader.lanKeys!.currentState!.tr}${TranslationLoader.lanKeys!.onTrial!.tr}',
style: TextStyle(
fontSize: 20.sp, fontWeight: FontWeight.w600),
),
@ -119,21 +135,25 @@ class _ValueAddedServicesListSMSTemplatePageState
));
}
Widget _buildMainUI() {
return ListView.builder(
itemCount: 10,
itemBuilder: (c, index) {
return _valueAddedServicesListSMSTemplateItem(
'images/icon_lock.png', "张三", () {
// Navigator.pushNamed(context, Routers.valueAddedServicesAddSMSTemplatePage);
});
});
Widget buildMainUI() {
return state.smsTemplateList.isNotEmpty
? ListView.builder(
itemCount: state.smsTemplateList.length,
itemBuilder: (BuildContext c, int index) {
final CustomSMSTemplateItem itemData =
state.smsTemplateList[index];
return _valueAddedServicesListSMSTemplateItem(itemData);
})
: NoData();
}
Widget _valueAddedServicesListSMSTemplateItem(
String title, String content, Function() action) {
CustomSMSTemplateItem itemData) {
return GestureDetector(
onTap: action,
onTap: () {
Navigator.pushNamed(
context, Routers.valueAddedServicesAddSMSTemplatePage);
},
child: Container(
// height: 100.h,
margin: EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w),
@ -143,24 +163,31 @@ class _ValueAddedServicesListSMSTemplatePageState
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 30.h, top: 30.h, bottom: 20.h),
child: Text(
"101",
itemData.name ?? '',
style: TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w600),
),
),
Container(
width: 1.sw - 20.w * 2 - 30.w * 2,
margin: EdgeInsets.only(left: 25.w, right: 25.w, bottom: 25.h),
decoration: BoxDecoration(
color: const Color(0xFFF5F5F5),
borderRadius: BorderRadius.circular(10.h),
),
child: Padding(
padding: EdgeInsets.only(
left: 20.w, top: 20.h, right: 20.w, bottom: 20.h),
child: RichText(text: electronicKeySpan)),
padding: EdgeInsets.only(left: 20.w, top: 20.h, bottom: 20.h),
child: RichText(
text: TextSpan(
children: itemData.contentType == 1
? logic.buildElectronicKeySpan(templateData: itemData)
: logic.buildPasswordSpan(templateData: itemData),
),
),
),
),
],
),

View File

@ -0,0 +1,55 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/translations/trans_lib.dart';
class CustomSMSTemplateListState {
//
final TextStyle highStyle =
TextStyle(color: const Color(0xFFEEDFA8), fontSize: 20.sp);
//
final TextStyle defaultStyle =
TextStyle(color: Colors.black, fontSize: 20.sp);
// //-
// late InlineSpan passwardSpan = TextSpan(children: <InlineSpan>[
// TextSpan(
// text:
// '${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.yourRoomIs!.tr}',
// style: defaultStyle),
// TextSpan(text: '201', style: highStyle),
// TextSpan(
// text: ' ${TranslationLoader.lanKeys!.theCodeToOpenTheDoorIs!.tr} ',
// style: defaultStyle),
// TextSpan(text: '332211\n', style: highStyle),
// TextSpan(
// text: '${TranslationLoader.lanKeys!.periodValidity!.tr} ',
// style: defaultStyle),
// TextSpan(text: '2021.12.11 12:00 - 2021.12.12 13:00。\n', style: highStyle),
// TextSpan(
// text: TranslationLoader.lanKeys!.templateTip1!.tr, style: defaultStyle),
// ]);
// //-
// late InlineSpan electronicKeySpan = TextSpan(children: <InlineSpan>[
// TextSpan(
// text:
// '${TranslationLoader.lanKeys!.hello!.tr}\n${TranslationLoader.lanKeys!.templateTip2!.tr}',
// style: defaultStyle),
// TextSpan(text: 'https://abc.com/bcd\n', style: highStyle),
// TextSpan(
// text: '${TranslationLoader.lanKeys!.templateTip3!.tr}\n',
// style: defaultStyle),
// TextSpan(text: 'https://abc.com/bcd', style: highStyle),
// ]);
// final TextEditingController templateOneTf = TextEditingController();
// final TextEditingController templateTwoTf = TextEditingController();
// final TextEditingController templateNameTf = TextEditingController();
RxBool isVip = false.obs;
RxList smsTemplateList = [].obs;
}

View File

@ -241,4 +241,10 @@ abstract class Api {
final String getNoticeTemplateURL = '/key/getNoticeTemplate'; //
final String appGetAppInfoURL = '/app/getAppInfo'; //APP基本信息
final String appGetFwVersionURL = '/app/getFwVersion'; //
final String smsTemplateListURL = '/v2/service/listSmsTemplate'; //
final String emailTemplateListURL =
'/v2/service/listEmailTemplate'; //
final String getDefaultTemplateURL =
'/v2/service/getDefaultTemplate'; //
final String addSMSTemplateURL = '/v2/service/addSmsTemplate'; //
}

View File

@ -2141,6 +2141,42 @@ class ApiProvider extends BaseProvider {
}),
isUnShowLoading: true,
);
//
Future<Response<dynamic>> getDefaultTemplate(int type) => post(
getDefaultTemplateURL.toUrl,
jsonEncode(<String, dynamic>{'type': type}),
isUnShowLoading: true,
);
//
Future<Response<dynamic>> getSMSTemplateList(
int type, int pageNo, int pageSize) =>
post(
smsTemplateListURL.toUrl,
jsonEncode(<String, dynamic>{
'type': type,
'pageNo': pageNo,
'pageSize': pageSize
}),
isUnShowLoading: true,
);
//
Future<Response<dynamic>> addSMSTemplate(int type, String name,
int contentType, String regards, String tips, String fixedKey) =>
post(
addSMSTemplateURL.toUrl,
jsonEncode(<String, dynamic>{
'type': type,
'name': name,
'content_type': contentType,
'regards': regards,
'tips': tips,
'fixed_key': fixedKey
}),
isUnShowLoading: true,
);
}
extension ExtensionString on String {

View File

@ -36,6 +36,8 @@ import 'package:star_lock/mine/valueAddedServices/valueAddedServicesHighFunction
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRealName/face_authentication_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/buy_record_list_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesRecord/use_record_list_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesAddSMSTemplate/newSMSTemplate_entity.dart';
import 'package:star_lock/mine/valueAddedServices/valueAddedServicesSMSTemplate/valueAddedServicesListSMSTemplate/customSMSTemplateList_entity.dart';
import 'package:star_lock/tools/aliyunRealNameAuth/realNameVertify_entity.dart';
import 'package:star_lock/tools/aliyunRealNameAuth/serviceAuthResult_entity.dart';
import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart';
@ -2168,4 +2170,31 @@ class ApiRepository {
await apiProvider.getFwVersion(model, currentVersion);
return FwVersionEntity.fromJson(res.body);
}
//
Future<NewSMSTemplateEntity> getDefaultTemplate({required int type}) async {
final Response<dynamic> res = await apiProvider.getDefaultTemplate(type);
return NewSMSTemplateEntity.fromJson(res.body);
}
//
Future<CustomSMSTemplateListEntity> getSMSTemplateList(
{required int type, required int pageNo, required int pageSize}) async {
final Response<dynamic> res =
await apiProvider.getSMSTemplateList(type, pageNo, pageSize);
return CustomSMSTemplateListEntity.fromJson(res.body);
}
//
Future<LoginEntity> addSMSTemplate(
{required int type,
required String name,
required int contentType,
required String regards,
required String tips,
required String fixedKey}) async {
final Response<dynamic> res = await apiProvider.addSMSTemplate(
type, name, contentType, regards, tips, fixedKey);
return LoginEntity.fromJson(res.body);
}
}

View File

@ -176,7 +176,8 @@ class DateTool {
String dateToYMDString(String timestamp) {
final int time = int.parse(timestamp);
final DateTime nowDate = DateTime.fromMillisecondsSinceEpoch(time);
final String appointmentDate = formatDate(nowDate, <String>[yyyy, '-', mm, '-', dd]);
final String appointmentDate =
formatDate(nowDate, <String>[yyyy, '-', mm, '-', dd]);
return appointmentDate;
}

View File

@ -11,4 +11,9 @@ class RegularExpression {
RegExp(r'^[\w-]+(\.[\w-]+)*@([\w-]+\.)+[a-zA-Z]{2,7}$');
return emailRegExp.hasMatch(input);
}
static RegExp urlRegExp = RegExp(
r'https?:\/\/\S+',
caseSensitive: false,
);
}