diff --git a/src/pages/pc/word/StudyWord.vue b/src/pages/pc/word/StudyWord.vue index b83be8ab..19840b28 100644 --- a/src/pages/pc/word/StudyWord.vue +++ b/src/pages/pc/word/StudyWord.vue @@ -18,7 +18,7 @@ import Panel from "@/pages/pc/components/Panel.vue"; import BaseIcon from "@/components/BaseIcon.vue"; import Tooltip from "@/pages/pc/components/Tooltip.vue"; import WordList from "@/pages/pc/components/list/WordList.vue"; -import Typing from "@/pages/pc/word/components/Typing.vue"; +import Type from "@/pages/pc/word/components/Type.vue"; import Empty from "@/components/Empty.vue"; import {useBaseStore} from "@/stores/base.ts"; import {usePracticeStore} from "@/stores/practice.ts"; @@ -289,7 +289,7 @@ useEvents([ - -import {provide, watch} from "vue" -import {useBaseStore} from "@/stores/base.ts" -import {getDefaultWord, ShortcutKey, StudyData, Word} from "@/types.ts"; -import {emitter, EventKey, useEvents} from "@/utils/eventBus.ts" -import {cloneDeep, shuffle} from "lodash-es" -import {usePracticeStore} from "@/stores/practice.ts" -import {useSettingStore} from "@/stores/setting.ts"; -import {useOnKeyboardEventListener} from "@/hooks/event.ts"; -import {Icon} from "@iconify/vue"; -import Tooltip from "@/pages/pc/components/Tooltip.vue"; -import Typing from "@/pages/pc/word/components/Typing.vue"; -import Panel from "@/pages/pc/components/Panel.vue"; -import {useWordOptions} from "@/hooks/dict.ts"; -import BaseIcon from "@/components/BaseIcon.vue"; -import WordList from "@/pages/pc/components/list/WordList.vue"; -import Empty from "@/components/Empty.vue"; -import Footer from "@/pages/pc/word/components/Footer.vue"; - -interface IProps { - data: { - new: any[], - review: any[], - write: any[], - } -} - -const props = withDefaults(defineProps(), { - data: { - new: [], - review: [], - write: [], - } -}) - -const emit = defineEmits<{ - 'update:words': [val: Word[]], - sort: [val: Word[]], - complete: [val: any] -}>() - -const typingRef: any = $ref() -const store = useBaseStore() -const statStore = usePracticeStore() -const settingStore = useSettingStore() - -const { - isWordCollect, - toggleWordCollect, - isWordSimple, - toggleWordSimple -} = useWordOptions() - -let allWrongWords = new Set() - -let data = $ref({ - index: 0, - words: [], - wrongWords: [], -}) - -provide('studyData', data) - -watch(() => props.data, () => { - data.words = props.data.new - data.index = 0 - data.wrongWords = [] - allWrongWords = new Set() - - statStore.step = 0 - statStore.startDate = Date.now() - statStore.inputWordNumber = 0 - statStore.wrong = 0 - statStore.total = props.data.review.concat(props.data.new).concat(props.data.write).length - statStore.newWordNumber = props.data.new.length - statStore.index = 0 -}, {immediate: true, deep: true}) - -const word = $computed(() => { - return data.words[data.index] ?? getDefaultWord() -}) - -const prevWord: Word = $computed(() => { - return data.words?.[data.index - 1] ?? undefined -}) - -const nextWord: Word = $computed(() => { - return data.words?.[data.index + 1] ?? undefined -}) - -function next(isTyping: boolean = true) { - if (data.index === data.words.length - 1) { - if (data.wrongWords.length) { - console.log('学完了,但还有错词') - data.words = shuffle(cloneDeep(data.wrongWords)) - data.index = 0 - data.wrongWords = [] - } else { - console.log('学完了,没错词', statStore.total, statStore.step, data.index) - isTyping && statStore.inputWordNumber++ - statStore.speed = Date.now() - statStore.startDate - - if (statStore.step === 2) { - console.log('emit') - emitter.emit(EventKey.openStatModal, {}) - // emit('complete', {}) - } - - if (statStore.step === 1) { - settingStore.dictation = true - data.words = shuffle(props.data.write.concat(props.data.new).concat(props.data.review)) - statStore.step++ - data.index = 0 - } - - if (statStore.step === 0) { - statStore.step++ - if (props.data.review.length) { - data.words = shuffle(props.data.review) - settingStore.dictation = false - data.index = 0 - } else { - next() - } - } - } - } else { - data.index++ - isTyping && statStore.inputWordNumber++ - console.log('这个词完了') - } -} - -function onTypeWrong() { - let temp = word.word.toLowerCase() - if (!allWrongWords.has(word.word.toLowerCase())) { - allWrongWords.add(word.word.toLowerCase()) - statStore.wrong++ - } - //todo 后续要测试有非常的多的错词时,这会还卡不卡 - setTimeout(() => { - requestAnimationFrame(() => { - if (!store.wrong.words.find((v: Word) => v.word.toLowerCase() === temp)) { - store.wrong.words.push(word) - store.wrong.length = store.wrong.words.length - } - if (!data.wrongWords.find((v: Word) => v.word.toLowerCase() === temp)) { - data.wrongWords.push(word) - } - }) - }, 500) -} - -function onKeyUp(e: KeyboardEvent) { - typingRef.hideWord() -} - -async function onKeyDown(e: KeyboardEvent) { - // console.log('e', e) - switch (e.key) { - case 'Backspace': - typingRef.del() - break - } -} - -useOnKeyboardEventListener(onKeyDown, onKeyUp) - -//TODO 略过忽略的单词上 -function prev() { - if (data.index === 0) { - ElMessage.warning('已经是第一个了~') - } else { - data.index-- - } -} - -function skip(e: KeyboardEvent) { - next(false) - // e.preventDefault() -} - -function show(e: KeyboardEvent) { - typingRef.showWord() -} - -function collect(e: KeyboardEvent) { - toggleWordCollect(word) -} - -function toggleWordSimpleWrapper() { - if (!isWordSimple(word)) { - toggleWordSimple(word) - //延迟一下,不知道为什么不延迟会导致当前条目不自动定位到列表中间 - setTimeout(() => next(false)) - } else { - toggleWordSimple(word) - } -} - -function play() { - typingRef.play() -} - -useEvents([ - [ShortcutKey.ShowWord, show], - [ShortcutKey.Previous, prev], - [ShortcutKey.Next, skip], - [ShortcutKey.ToggleCollect, collect], - [ShortcutKey.ToggleSimple, toggleWordSimpleWrapper], - [ShortcutKey.PlayWordPronunciation, play], -]) - - - - - - - - - - - {{ prevWord.word }} - - - - - {{ nextWord.word }} - - - - - - - - - - - - data.index = val.index" - > - - - - - - - - - - - - - - - -