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(() => {