feat: implement ignore case setting (#386)

This commit is contained in:
Kaiyi
2023-04-12 17:17:34 +08:00
committed by GitHub
parent c5e8f0b80f
commit e377807402
3 changed files with 29 additions and 4 deletions

View File

@@ -5,7 +5,7 @@ import { LetterState } from './Letter'
import style from './index.module.css'
import WordSound from '../WordSound'
import { useAtomValue } from 'jotai'
import { pronunciationIsOpenAtom } from '@/store'
import { isIgnoreCaseAtom, pronunciationIsOpenAtom } from '@/store'
import { WordStat } from '@/typings'
import dayjs from 'dayjs'
import { EXPLICIT_SPACE } from '@/constants'
@@ -48,6 +48,7 @@ export default function Word({ word, onFinish }: WordProps) {
const [wordState, setWordState] = useState<WordState>(initialWordState)
const wordStat = useRef<WordStat>(initialStatInfo)
const wordVisible = state.isWordVisible
const isIgnoreCase = useAtomValue(isIgnoreCaseAtom)
const displayWord = useMemo(() => {
// run only when word changes
@@ -100,7 +101,9 @@ export default function Word({ word, onFinish }: WordProps) {
const inputChar = wordState.inputWord[inputLength - 1]
const correctChar = displayWord[inputLength - 1]
if (inputChar === correctChar) {
const isEqual = isIgnoreCase ? inputChar.toLowerCase() === correctChar.toLowerCase() : inputChar === correctChar
if (isEqual) {
if (inputLength >= displayWord.length) {
const isAllCorrect = wordState.statesList.slice(0, -1).every((t) => t === 'correct')
if (isAllCorrect) {
@@ -133,7 +136,7 @@ export default function Word({ word, onFinish }: WordProps) {
wordStat.current.countTypo += 1
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [wordState.inputWord, displayWord, dispatch])
}, [wordState.inputWord, displayWord, dispatch, isIgnoreCase])
useEffect(() => {
if (wordState.hasWrong) {

View File

@@ -1,4 +1,4 @@
import { randomConfigAtom } from '@/store'
import { isIgnoreCaseAtom, randomConfigAtom } from '@/store'
import { Switch } from '@headlessui/react'
import { useAtom } from 'jotai'
import { useCallback } from 'react'
@@ -6,6 +6,7 @@ import styles from './index.module.css'
export default function AdvancedSetting() {
const [randomConfig, setRandomConfig] = useAtom(randomConfigAtom)
const [isIgnoreCase, setIsIgnoreCase] = useAtom(isIgnoreCaseAtom)
const onToggleRandom = useCallback(
(checked: boolean) => {
@@ -17,6 +18,13 @@ export default function AdvancedSetting() {
[setRandomConfig],
)
const onToggleIgnoreCase = useCallback(
(checked: boolean) => {
setIsIgnoreCase(checked)
},
[setIsIgnoreCase],
)
return (
<div className={styles.tabContent}>
<div className={styles.section}>
@@ -31,6 +39,18 @@ export default function AdvancedSetting() {
}`}</span>
</div>
</div>
<div className={styles.section}>
<span className={styles.sectionLabel}></span>
<span className={styles.sectionDescription}>helloHello</span>
<div className={styles.switchBlock}>
<Switch checked={isIgnoreCase} onChange={onToggleIgnoreCase} className="switch-root">
<span aria-hidden="true" className="switch-thumb" />
</Switch>
<span className="text-right text-xs font-normal leading-tight text-gray-600">{`忽略大小写已${
isIgnoreCase ? '开启' : '关闭'
}`}</span>
</div>
</div>
</div>
)
}

View File

@@ -46,6 +46,8 @@ export const randomConfigAtom = atomWithStorage('randomConfig', {
export const isLoopSingleWordAtom = atom(false)
export const isIgnoreCaseAtom = atomWithStorage('isIgnoreCase', true)
export const phoneticConfigAtom = atomWithStorage('phoneticConfig', {
isOpen: true,
type: 'us' as PhoneticType,