import React, { useState, useEffect } from "react"; import { View, Text, Textarea, Input, Picker } from "@tarojs/components"; import Taro from "@tarojs/taro"; import "./EditModal.scss"; import { useKeyboardHeight } from "@/store/keyboardStore"; interface EditModalProps { visible: boolean; title: string; type: string; placeholder: string; initialValue: string; maxLength: number; invalidCharacters: string; onSave: (value: string) => void; onCancel: () => void; validationMessage?: string; } const EditModal: React.FC = ({ visible, title, type, placeholder, initialValue, maxLength, invalidCharacters = "", onSave, onCancel, validationMessage, }) => { const [value, setValue] = useState(initialValue); const [isValid, setIsValid] = useState(true); const [isIllegal, setIsIllegal] = useState(false); // 使用全局键盘状态 const { keyboardHeight, isKeyboardVisible, addListener, initializeKeyboardListener, } = useKeyboardHeight(); // 使用全局键盘状态监听 useEffect(() => { // 初始化全局键盘监听器 initializeKeyboardListener(); // 添加本地监听器 const removeListener = addListener((height, visible) => { console.log("AiImportPopup 收到键盘变化:", height, visible); }); return () => { removeListener(); }; }, [initializeKeyboardListener, addListener]); useEffect(() => { if (visible) { setValue(initialValue); const valid = initialValue.length >= 2 && initialValue.length <= maxLength; setIsValid(valid); } }, [visible, initialValue]); const createExcludeRegex = (chars: string) => { // 转义正则表达式特殊字符 const escapedChars = chars.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // 构建负向字符类正则表达式 // ^[^...]*$ 匹配不包含任何指定字符的完整字符串 const pattern = `[${escapedChars}]`; return new RegExp(pattern); }; const handle_input_change = (e: any) => { const new_value = e.detail.value; setValue(new_value); const illegal = /\b(SELECT|INSERT|UPDATE|DELETE|DROP|UNION|ALTER|CREATE|EXEC|DECLARE)\b|('|--|\/\*|\*\/|;|#)|(=|'|"|`|\\|\|\|&&)|\bOR\s+['"]?[\w]+['"]?\s*=\s*['"]?[\w]+['"]?|\bUNION\s+SELECT\b|\bDROP\s+TABLE\b|\bINSERT\s+INTO\b|\bUPDATE\s+[\w]+\s+SET\b|\bDELETE\s+FROM\b/i.test( new_value ); setIsIllegal(illegal); // 验证输入 const valid = new_value.length >= 2 && new_value.length <= maxLength && !createExcludeRegex(invalidCharacters).test(new_value); setIsValid(valid); }; const handle_save = () => { if (!isValid) { Taro.showToast({ title: validationMessage || `请填写 2-${maxLength} 个字符`, icon: "none", duration: 2000, }); return; } if (isIllegal) { Taro.showToast({ title: "输入的字符非法", icon: "none", duration: 2000, }); return; } onSave(value); }; const handle_cancel = () => { setValue(initialValue); onCancel(); }; if (!visible) { return null; } return ( {/* 标题栏 */} {title} {/* 内容区域 */} {/* 文本输入区域 */} {type === "nickname" ? ( <> maxLength && "un-valid" }`} > {value.length}/{maxLength} ) : ( <>