import { Box, Button, ButtonGroup, Checkbox, Flex, HStack, Heading, Icon, IconButton, List, Menu, MenuButton, MenuDivider, MenuItem, MenuList, Text, Tooltip, } from '@chakra-ui/react'; import { useDispatch, useSelector } from 'react-redux'; import { qmc2AddKey, qmc2AllowFuzzyNameSearch, qmc2ClearKeys } from '../settingsSlice'; import { selectStagingQMCv2Settings } from '../settingsSelector'; import React, { useState } from 'react'; import { MdAdd, MdDeleteForever, MdExpandMore, MdFileUpload } from 'react-icons/md'; import { ImportFileModal } from './QMCv2/ImportFileModal'; import { KeyInput } from './QMCv2/KeyInput'; import { InfoOutlineIcon } from '@chakra-ui/icons'; export function PanelQMCv2Key() { const dispatch = useDispatch(); const { keys: qmc2Keys, allowFuzzyNameSearch } = useSelector(selectStagingQMCv2Settings); const [showImportModal, setShowImportModal] = useState(false); const addKey = () => dispatch(qmc2AddKey()); const clearAll = () => dispatch(qmc2ClearKeys()); const handleAllowFuzzyNameSearchCheckbox = (e: React.ChangeEvent) => { dispatch(qmc2AllowFuzzyNameSearch({ enable: e.target.checked })); }; return ( QMCv2 密钥 QQ 音乐目前采用的加密方案(QMCv2)。在使用「QQ 音乐」安卓、Mac 或 iOS 客户端的情况下,其「离线加密文件」对应的「密钥」储存在独立的数据库文件内。 }> setShowImportModal(true)} icon={}> 从文件导入密钥 }> 清空密钥 匹配相似文件名 若文件名匹配失败,则使用相似文件名的密钥。 使用「 莱文斯坦距离 ( Levenshtein distance ) 」算法计算相似程度。 若密钥数量过多,匹配时可能会造成浏览器卡顿或无响应一段时间。 } > {qmc2Keys.map(({ id, key, name }, i) => ( ))} {qmc2Keys.length === 0 && 还没有添加密钥。} setShowImportModal(false)} /> ); }