From 53bf67db05948340d91511141715b562944c6464 Mon Sep 17 00:00:00 2001 From: ljt990218 <2511590093@qq.com> Date: Wed, 9 Oct 2024 18:00:50 +0800 Subject: [PATCH 1/5] feat: Export the wrong question book --- src/pages/ErrorBook/index.tsx | 26 +++++++++++++++++++++++++- yarn.lock | 4 ++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/pages/ErrorBook/index.tsx b/src/pages/ErrorBook/index.tsx index 2f2c14ae2e..f8e81e14e9 100644 --- a/src/pages/ErrorBook/index.tsx +++ b/src/pages/ErrorBook/index.tsx @@ -3,14 +3,18 @@ import type { ISortType } from './HeadWrongNumber' import HeadWrongNumber from './HeadWrongNumber' import Pagination, { ITEM_PER_PAGE } from './Pagination' import RowDetail from './RowDetail' +import useGetWord from './hooks/useGetWord' import { currentRowDetailAtom } from './store' import type { groupedWordRecords } from './type' +import { idDictionaryMap } from '@/resources/dictionary' import { db, useDeleteWordRecord } from '@/utils/db' import type { WordRecord } from '@/utils/db/record' import * as ScrollArea from '@radix-ui/react-scroll-area' +import { saveAs } from 'file-saver' import { useAtomValue } from 'jotai' import { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' +import * as XLSX from 'xlsx' import IconX from '~icons/tabler/x' export function ErrorBook() { @@ -93,6 +97,24 @@ export function ErrorBook() { setReload((prev) => !prev) } + const handleExport = () => { + const ErrorBookData = [] as any + + // renderRecords.forEach((item: any) => { + // const dictInfo = idDictionaryMap[item.dict] + // const { word } = useGetWord(item.word, dictInfo) + // ErrorBookData.push({ 单词: item.word, 释义: word ? word.trans.join(';') : '', 错误次数: item.wrongCount, 词典: item.dict }) + // }) + + const worksheet = XLSX.utils.json_to_sheet(ErrorBookData) + const workbook = XLSX.utils.book_new() + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') + + const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }) + const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }) + saveAs(blob, 'ErrorBook.xlsx') + } + return ( <>
@@ -108,7 +130,9 @@ export function ErrorBook() { 释义 词典 - +
diff --git a/yarn.lock b/yarn.lock index cdf4fe90fb..d6e2ce2910 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3718,7 +3718,7 @@ file-entry-cache@^6.0.1: file-saver@^2.0.5: version "2.0.5" - resolved "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz" + resolved "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38" integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA== filelist@^1.0.4: @@ -6279,7 +6279,7 @@ wrappy@1: xlsx@^0.18.5: version "0.18.5" - resolved "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz" + resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0" integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ== dependencies: adler-32 "~1.3.0" From cdcec9728af113b7c59f7cdc497f8eb32de4354e Mon Sep 17 00:00:00 2001 From: ljt990218 <2511590093@qq.com> Date: Thu, 10 Oct 2024 10:22:40 +0800 Subject: [PATCH 2/5] feat: Export `xlsx` ErrorBookData --- src/pages/ErrorBook/ErrorRow.tsx | 17 ++++++++++++++--- src/pages/ErrorBook/index.tsx | 26 +++++++++++++++++++------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/pages/ErrorBook/ErrorRow.tsx b/src/pages/ErrorBook/ErrorRow.tsx index 2c2707c8c4..badfcafab7 100644 --- a/src/pages/ErrorBook/ErrorRow.tsx +++ b/src/pages/ErrorBook/ErrorRow.tsx @@ -7,24 +7,35 @@ import { idDictionaryMap } from '@/resources/dictionary' import { recordErrorBookAction } from '@/utils' import { useSetAtom } from 'jotai' import type { FC } from 'react' -import { useCallback } from 'react' +import { useCallback, useEffect, useMemo, useRef } from 'react' import DeleteIcon from '~icons/weui/delete-filled' type IErrorRowProps = { record: groupedWordRecords onDelete: () => void + onWordUpdate: (word: any) => void } -const ErrorRow: FC = ({ record, onDelete }) => { +const ErrorRow: FC = ({ record, onDelete, onWordUpdate }) => { const setCurrentRowDetail = useSetAtom(currentRowDetailAtom) const dictInfo = idDictionaryMap[record.dict] const { word, isLoading, hasError } = useGetWord(record.word, dictInfo) + const prevWordRef = useRef() + + const stableWord = useMemo(() => word, [word]) const onClick = useCallback(() => { setCurrentRowDetail(record) recordErrorBookAction('detail') }, [record, setCurrentRowDetail]) + useEffect(() => { + if (stableWord && stableWord !== prevWordRef.current) { + onWordUpdate(stableWord) + prevWordRef.current = stableWord + } + }, [stableWord, onWordUpdate]) + return (
  • = ({ record, onDelete }) => { > {record.word} - {word ? word.trans.join(';') : } + {stableWord ? stableWord.trans.join(';') : } {record.wrongCount} {dictInfo?.name} diff --git a/src/pages/ErrorBook/index.tsx b/src/pages/ErrorBook/index.tsx index f8e81e14e9..c9e60abbce 100644 --- a/src/pages/ErrorBook/index.tsx +++ b/src/pages/ErrorBook/index.tsx @@ -3,10 +3,8 @@ import type { ISortType } from './HeadWrongNumber' import HeadWrongNumber from './HeadWrongNumber' import Pagination, { ITEM_PER_PAGE } from './Pagination' import RowDetail from './RowDetail' -import useGetWord from './hooks/useGetWord' import { currentRowDetailAtom } from './store' import type { groupedWordRecords } from './type' -import { idDictionaryMap } from '@/resources/dictionary' import { db, useDeleteWordRecord } from '@/utils/db' import type { WordRecord } from '@/utils/db/record' import * as ScrollArea from '@radix-ui/react-scroll-area' @@ -26,6 +24,13 @@ export function ErrorBook() { const currentRowDetail = useAtomValue(currentRowDetailAtom) const { deleteWordRecord } = useDeleteWordRecord() const [reload, setReload] = useState(false) + const [words, setWords] = useState([]) + + const handleWordUpdate = (word: any) => { + console.log(word) + + setWords((prevWords) => [...prevWords, word]) + } const onBack = useCallback(() => { navigate('/') @@ -98,13 +103,19 @@ export function ErrorBook() { } const handleExport = () => { + console.log(words) + const ErrorBookData = [] as any - // renderRecords.forEach((item: any) => { - // const dictInfo = idDictionaryMap[item.dict] - // const { word } = useGetWord(item.word, dictInfo) - // ErrorBookData.push({ 单词: item.word, 释义: word ? word.trans.join(';') : '', 错误次数: item.wrongCount, 词典: item.dict }) - // }) + renderRecords.forEach((item: any) => { + const word = words.find((w) => w.name === item.word) + ErrorBookData.push({ + 单词: item.word, + 释义: word ? word.trans.join(';') : '', + 错误次数: item.wrongCount, + 词典: item.dict, + }) + }) const worksheet = XLSX.utils.json_to_sheet(ErrorBookData) const workbook = XLSX.utils.book_new() @@ -142,6 +153,7 @@ export function ErrorBook() { key={`${record.dict}-${record.word}`} record={record} onDelete={() => handleDelete(record.word, record.dict)} + onWordUpdate={handleWordUpdate} /> ))} From be7f7ba5e8ac001bcdddd149a74cbaae509c1128 Mon Sep 17 00:00:00 2001 From: ljt990218 <2511590093@qq.com> Date: Thu, 10 Oct 2024 14:54:21 +0800 Subject: [PATCH 3/5] chore(DropdownExport): Optimize the Export function --- package.json | 1 + src/pages/ErrorBook/DropdownExport.tsx | 82 +++++++++ src/pages/ErrorBook/index.tsx | 39 +---- yarn.lock | 224 ++++++++++++++++++++++++- 4 files changed, 311 insertions(+), 35 deletions(-) create mode 100644 src/pages/ErrorBook/DropdownExport.tsx diff --git a/package.json b/package.json index e5d845f25c..140fe52a1b 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "@headlessui/tailwindcss": "^0.1.2", "@radix-ui/react-avatar": "^1.0.4", "@radix-ui/react-dialog": "^1.0.5", + "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-progress": "^1.0.2", "@radix-ui/react-radio-group": "^1.1.2", "@radix-ui/react-scroll-area": "^1.0.5", diff --git a/src/pages/ErrorBook/DropdownExport.tsx b/src/pages/ErrorBook/DropdownExport.tsx new file mode 100644 index 0000000000..baad8d9979 --- /dev/null +++ b/src/pages/ErrorBook/DropdownExport.tsx @@ -0,0 +1,82 @@ +import * as DropdownMenu from '@radix-ui/react-dropdown-menu' +import { saveAs } from 'file-saver' +import type { FC } from 'react' +import * as XLSX from 'xlsx' + +type DropdownProps = { + renderRecords: any + paraphrases: any +} + +const DropdownExport: FC = ({ renderRecords, paraphrases }) => { + const formatTimestamp = (date: any) => { + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') // 月份从0开始 + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + const seconds = String(date.getSeconds()).padStart(2, '0') + + return `${year}-${month}-${day} ${hours}-${minutes}-${seconds}` + } + + const handleExport = (bookType: string) => { + const ExportData: Array<{ 单词: string; 释义: string; 错误次数: number; 词典: string }> = [] + + renderRecords.forEach((item: any) => { + const word = paraphrases.find((w: any) => w.name === item.word) + ExportData.push({ + 单词: item.word, + 释义: word ? word.trans.join(';') : '', + 错误次数: item.wrongCount, + 词典: item.dict, + }) + }) + + let blob: Blob + + if (bookType === 'txt') { + const content = ExportData.map((item: any) => `${item.单词}: ${item.释义}`).join('\n') + blob = new Blob([content], { type: 'text/plain' }) + } else { + const worksheet = XLSX.utils.json_to_sheet(ExportData) + const workbook = XLSX.utils.book_new() + XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') + const excelBuffer = XLSX.write(workbook, { bookType: bookType as XLSX.BookType, type: 'array' }) + blob = new Blob([excelBuffer], { type: 'application/octet-stream' }) + } + + const timestamp = formatTimestamp(new Date()) + const fileName = `ErrorBook_${timestamp}.${bookType}` + + if (blob && fileName) { + saveAs(blob, fileName) + } + } + + return ( +
    + + + + + + handleExport('xlsx')} + > + .xlsx + + handleExport('csv')} + > + .csv + + + +
    + ) +} + +export default DropdownExport diff --git a/src/pages/ErrorBook/index.tsx b/src/pages/ErrorBook/index.tsx index c9e60abbce..63c600d4b3 100644 --- a/src/pages/ErrorBook/index.tsx +++ b/src/pages/ErrorBook/index.tsx @@ -1,3 +1,4 @@ +import DropdownExport from './DropdownExport' import ErrorRow from './ErrorRow' import type { ISortType } from './HeadWrongNumber' import HeadWrongNumber from './HeadWrongNumber' @@ -8,11 +9,9 @@ import type { groupedWordRecords } from './type' import { db, useDeleteWordRecord } from '@/utils/db' import type { WordRecord } from '@/utils/db/record' import * as ScrollArea from '@radix-ui/react-scroll-area' -import { saveAs } from 'file-saver' import { useAtomValue } from 'jotai' import { useCallback, useEffect, useMemo, useState } from 'react' import { useNavigate } from 'react-router-dom' -import * as XLSX from 'xlsx' import IconX from '~icons/tabler/x' export function ErrorBook() { @@ -24,13 +23,7 @@ export function ErrorBook() { const currentRowDetail = useAtomValue(currentRowDetailAtom) const { deleteWordRecord } = useDeleteWordRecord() const [reload, setReload] = useState(false) - const [words, setWords] = useState([]) - - const handleWordUpdate = (word: any) => { - console.log(word) - - setWords((prevWords) => [...prevWords, word]) - } + const [paraphrases, setParaphrases] = useState([]) const onBack = useCallback(() => { navigate('/') @@ -102,28 +95,8 @@ export function ErrorBook() { setReload((prev) => !prev) } - const handleExport = () => { - console.log(words) - - const ErrorBookData = [] as any - - renderRecords.forEach((item: any) => { - const word = words.find((w) => w.name === item.word) - ErrorBookData.push({ - 单词: item.word, - 释义: word ? word.trans.join(';') : '', - 错误次数: item.wrongCount, - 词典: item.dict, - }) - }) - - const worksheet = XLSX.utils.json_to_sheet(ErrorBookData) - const workbook = XLSX.utils.book_new() - XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') - - const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }) - const blob = new Blob([excelBuffer], { type: 'application/octet-stream' }) - saveAs(blob, 'ErrorBook.xlsx') + const handleWordUpdate = (paraphrases: object) => { + setParaphrases((prevWords) => [...prevWords, paraphrases]) } return ( @@ -141,9 +114,7 @@ export function ErrorBook() { 释义 词典 - + diff --git a/yarn.lock b/yarn.lock index d6e2ce2910..aaf4d76dd2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1495,6 +1495,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/primitive@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" + integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== + "@radix-ui/react-arrow@1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz#c24f7968996ed934d57fe6cde5d6ec7266e1d25d" @@ -1503,6 +1508,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-arrow@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" + integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-avatar@^1.0.4": version "1.0.4" resolved "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.0.4.tgz#de9a5349d9e3de7bbe990334c4d2011acbbb9623" @@ -1536,6 +1548,16 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-slot" "1.0.2" +"@radix-ui/react-collection@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz#f18af78e46454a2360d103c2251773028b7724ed" + integrity sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-compose-refs@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz" @@ -1569,6 +1591,16 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-context@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" + integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== + +"@radix-ui/react-context@1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" + integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== + "@radix-ui/react-dialog@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz#71657b1b116de6c7a0b03242d7d43e01062c7300" @@ -1604,6 +1636,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-direction@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz#a7d39855f4d077adc2a1922f9c353c5977a09cdc" + integrity sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg== + "@radix-ui/react-dismissable-layer@1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz#3f98425b82b9068dfbab5db5fff3df6ebf48b9d4" @@ -1616,6 +1653,30 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-escape-keydown" "1.0.3" +"@radix-ui/react-dismissable-layer@1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" + integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown" "1.1.0" + +"@radix-ui/react-dropdown-menu@^2.1.2": + version "2.1.2" + resolved "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz#acc49577130e3c875ef0133bd1e271ea3392d924" + integrity sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-menu" "2.1.2" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-focus-guards@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz#1ea7e32092216b946397866199d892f71f7f98ad" @@ -1623,6 +1684,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + "@radix-ui/react-focus-scope@1.0.4": version "1.0.4" resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz#2ac45fce8c5bb33eb18419cdc1905ef4f1906525" @@ -1633,6 +1699,15 @@ "@radix-ui/react-primitive" "1.0.3" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-focus-scope@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz#ebe2891a298e0a33ad34daab2aad8dea31caf0b2" + integrity sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-id@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.0.0.tgz" @@ -1649,6 +1724,37 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-id@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" + integrity sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + +"@radix-ui/react-menu@2.1.2": + version "2.1.2" + resolved "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.2.tgz#91f6815845a4298dde775563ed2d80b7ad667899" + integrity sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-popper" "1.2.0" + "@radix-ui/react-portal" "1.1.2" + "@radix-ui/react-presence" "1.1.1" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-roving-focus" "1.1.0" + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.6.0" + "@radix-ui/react-popper@1.1.3": version "1.1.3" resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.3.tgz#24c03f527e7ac348fabf18c89795d85d21b00b42" @@ -1666,6 +1772,22 @@ "@radix-ui/react-use-size" "1.0.1" "@radix-ui/rect" "1.0.1" +"@radix-ui/react-popper@1.2.0": + version "1.2.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" + integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== + dependencies: + "@floating-ui/react-dom" "^2.0.0" + "@radix-ui/react-arrow" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-use-rect" "1.1.0" + "@radix-ui/react-use-size" "1.1.0" + "@radix-ui/rect" "1.1.0" + "@radix-ui/react-portal@1.0.4": version "1.0.4" resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz#df4bfd353db3b1e84e639e9c63a5f2565fb00e15" @@ -1674,6 +1796,14 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-primitive" "1.0.3" +"@radix-ui/react-portal@1.1.2": + version "1.1.2" + resolved "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" + integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== + dependencies: + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-presence@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.0.0.tgz" @@ -1692,6 +1822,14 @@ "@radix-ui/react-compose-refs" "1.0.1" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-presence@1.1.1": + version "1.1.1" + resolved "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" + integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== + dependencies: + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-primitive@1.0.2": version "1.0.2" resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz" @@ -1708,6 +1846,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-slot" "1.0.2" +"@radix-ui/react-primitive@2.0.0": + version "2.0.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" + integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== + dependencies: + "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-progress@^1.0.2": version "1.0.2" resolved "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.0.2.tgz" @@ -1766,6 +1911,21 @@ "@radix-ui/react-use-callback-ref" "1.0.1" "@radix-ui/react-use-controllable-state" "1.0.1" +"@radix-ui/react-roving-focus@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz#b30c59daf7e714c748805bfe11c76f96caaac35e" + integrity sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA== + dependencies: + "@radix-ui/primitive" "1.1.0" + "@radix-ui/react-collection" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-context" "1.1.0" + "@radix-ui/react-direction" "1.1.0" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-controllable-state" "1.1.0" + "@radix-ui/react-scroll-area@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.5.tgz#01160c6893f24a2ddb5aa399ae5b3ba84ad4d3cc" @@ -1816,7 +1976,7 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-compose-refs" "1.0.1" -"@radix-ui/react-slot@^1.0.2": +"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.0.2": version "1.1.0" resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== @@ -1895,6 +2055,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-callback-ref@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz#bce938ca413675bc937944b0d01ef6f4a6dc5bf1" + integrity sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw== + "@radix-ui/react-use-controllable-state@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz" @@ -1911,6 +2076,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-use-controllable-state@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz#1321446857bb786917df54c0d4d084877aab04b0" + integrity sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-escape-keydown@1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz#217b840c250541609c66f67ed7bab2b733620755" @@ -1919,6 +2091,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-callback-ref" "1.0.1" +"@radix-ui/react-use-escape-keydown@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz#31a5b87c3b726504b74e05dac1edce7437b98754" + integrity sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw== + dependencies: + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-use-layout-effect@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz" @@ -1933,6 +2112,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/react-use-layout-effect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz#3c2c8ce04827b26a39e442ff4888d9212268bd27" + integrity sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w== + "@radix-ui/react-use-previous@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.0.0.tgz" @@ -1948,6 +2132,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/rect" "1.0.1" +"@radix-ui/react-use-rect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz#13b25b913bd3e3987cc9b073a1a164bb1cf47b88" + integrity sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ== + dependencies: + "@radix-ui/rect" "1.1.0" + "@radix-ui/react-use-size@1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz" @@ -1964,6 +2155,13 @@ "@babel/runtime" "^7.13.10" "@radix-ui/react-use-layout-effect" "1.0.1" +"@radix-ui/react-use-size@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz#b4dba7fbd3882ee09e8d2a44a3eed3a7e555246b" + integrity sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw== + dependencies: + "@radix-ui/react-use-layout-effect" "1.1.0" + "@radix-ui/react-visually-hidden@1.0.3": version "1.0.3" resolved "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz#51aed9dd0fe5abcad7dee2a234ad36106a6984ac" @@ -1979,6 +2177,11 @@ dependencies: "@babel/runtime" "^7.13.10" +"@radix-ui/rect@1.1.0": + version "1.1.0" + resolved "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz#f817d1d3265ac5415dadc67edab30ae196696438" + integrity sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg== + "@remix-run/router@1.6.2": version "1.6.2" resolved "https://registry.npmmirror.com/@remix-run/router/-/router-1.6.2.tgz" @@ -5298,6 +5501,14 @@ react-remove-scroll-bar@^2.3.3: react-style-singleton "^2.2.1" tslib "^2.0.0" +react-remove-scroll-bar@^2.3.6: + version "2.3.6" + resolved "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz#3e585e9d163be84a010180b18721e851ac81a29c" + integrity sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + react-remove-scroll@2.5.5: version "2.5.5" resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz#1e31a1260df08887a8a0e46d09271b52b3a37e77" @@ -5309,6 +5520,17 @@ react-remove-scroll@2.5.5: use-callback-ref "^1.3.0" use-sidecar "^1.1.2" +react-remove-scroll@2.6.0: + version "2.6.0" + resolved "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz#fb03a0845d7768a4f1519a99fdb84983b793dc07" + integrity sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ== + dependencies: + react-remove-scroll-bar "^2.3.6" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + react-router-dom@^6.8.2: version "6.11.2" resolved "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.11.2.tgz" From 7454a454470cda47e38c34ec30b22cc1876566af Mon Sep 17 00:00:00 2001 From: ljt990218 <2511590093@qq.com> Date: Thu, 10 Oct 2024 15:27:15 +0800 Subject: [PATCH 4/5] fix: Revoke unnecessary modifications --- src/pages/ErrorBook/ErrorRow.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/ErrorBook/ErrorRow.tsx b/src/pages/ErrorBook/ErrorRow.tsx index badfcafab7..bcbb483e07 100644 --- a/src/pages/ErrorBook/ErrorRow.tsx +++ b/src/pages/ErrorBook/ErrorRow.tsx @@ -43,7 +43,7 @@ const ErrorRow: FC = ({ record, onDelete, onWordUpdate }) => { > {record.word} - {stableWord ? stableWord.trans.join(';') : } + {word ? word.trans.join(';') : } {record.wrongCount} {dictInfo?.name} From f017898dbdc10f5d65ab5c2f41fcab034d35198c Mon Sep 17 00:00:00 2001 From: ljt990218 <2511590093@qq.com> Date: Thu, 10 Oct 2024 15:39:04 +0800 Subject: [PATCH 5/5] fix: fix `eslint` --- src/pages/ErrorBook/ErrorRow.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/pages/ErrorBook/ErrorRow.tsx b/src/pages/ErrorBook/ErrorRow.tsx index bcbb483e07..4382702fbc 100644 --- a/src/pages/ErrorBook/ErrorRow.tsx +++ b/src/pages/ErrorBook/ErrorRow.tsx @@ -21,7 +21,6 @@ const ErrorRow: FC = ({ record, onDelete, onWordUpdate }) => { const dictInfo = idDictionaryMap[record.dict] const { word, isLoading, hasError } = useGetWord(record.word, dictInfo) const prevWordRef = useRef() - const stableWord = useMemo(() => word, [word]) const onClick = useCallback(() => {