From 52646af15ebce6c7f8783fe45463c7cc70fcad19 Mon Sep 17 00:00:00 2001 From: KaiyiWing Date: Wed, 19 Apr 2023 02:32:48 +0800 Subject: [PATCH] feat: add isTextSelectable switcher --- .../CurrentWord/components/Phonetic/index.tsx | 9 ++++++-- .../components/Translation/index.tsx | 12 +++++++++- .../CurrentWord/components/Word/Letter.tsx | 2 +- .../CurrentWord/components/Word/index.tsx | 7 ++++-- .../components/Setting/AdvancedSetting.tsx | 22 ++++++++++++++++++- src/store/index.ts | 2 ++ 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/pages/Typing/components/CurrentWord/components/Phonetic/index.tsx b/src/pages/Typing/components/CurrentWord/components/Phonetic/index.tsx index 0a55bcce..3266d680 100644 --- a/src/pages/Typing/components/CurrentWord/components/Phonetic/index.tsx +++ b/src/pages/Typing/components/CurrentWord/components/Phonetic/index.tsx @@ -1,4 +1,4 @@ -import { phoneticConfigAtom } from '@/store' +import { isTextSelectableAtom, phoneticConfigAtom } from '@/store' import { Word } from '@/typings' import { useAtomValue } from 'jotai' @@ -8,9 +8,14 @@ export type PhoneticProps = { function Phonetic({ word }: PhoneticProps) { const phoneticConfig = useAtomValue(phoneticConfigAtom) + const isTextSelectable = useAtomValue(isTextSelectableAtom) return ( -
+
{phoneticConfig.type === 'us' && word.usphone && word.usphone.length > 1 && {`AmE: [${word.usphone}]`}} {phoneticConfig.type === 'uk' && word.ukphone && word.ukphone.length > 1 && {`BrE: [${word.ukphone}]`}}
diff --git a/src/pages/Typing/components/CurrentWord/components/Translation/index.tsx b/src/pages/Typing/components/CurrentWord/components/Translation/index.tsx index e9fb9170..e8dc94e2 100644 --- a/src/pages/Typing/components/CurrentWord/components/Translation/index.tsx +++ b/src/pages/Typing/components/CurrentWord/components/Translation/index.tsx @@ -1,8 +1,18 @@ +import { isTextSelectableAtom } from '@/store' +import { useAtomValue } from 'jotai' + export type TranslationProps = { trans: string } export default function Translation({ trans }: TranslationProps) { + const isTextSelectable = useAtomValue(isTextSelectableAtom) return ( -
{trans}
+
+ {trans} +
) } diff --git a/src/pages/Typing/components/CurrentWord/components/Word/Letter.tsx b/src/pages/Typing/components/CurrentWord/components/Word/Letter.tsx index 662887cd..346f8fc5 100644 --- a/src/pages/Typing/components/CurrentWord/components/Word/Letter.tsx +++ b/src/pages/Typing/components/CurrentWord/components/Word/Letter.tsx @@ -24,7 +24,7 @@ export type LetterProps = { const Letter: React.FC = ({ letter, state = 'normal', visible = true }) => ( diff --git a/src/pages/Typing/components/CurrentWord/components/Word/index.tsx b/src/pages/Typing/components/CurrentWord/components/Word/index.tsx index 34f813bb..1243ae4e 100644 --- a/src/pages/Typing/components/CurrentWord/components/Word/index.tsx +++ b/src/pages/Typing/components/CurrentWord/components/Word/index.tsx @@ -6,7 +6,7 @@ import style from './index.module.css' import { EXPLICIT_SPACE } from '@/constants' import useKeySounds from '@/hooks/useKeySounds' import { TypingContext, TypingStateActionType } from '@/pages/Typing/store' -import { isIgnoreCaseAtom, pronunciationIsOpenAtom } from '@/store' +import { isIgnoreCaseAtom, isTextSelectableAtom, pronunciationIsOpenAtom } from '@/store' import { useMixPanelWordLogUploader } from '@/utils' import { useSaveWordRecord } from '@/utils/db' import { LetterMistakes } from '@/utils/db/record' @@ -55,6 +55,7 @@ export default function Word({ word, onFinish }: { word: string; onFinish: () => const { state, dispatch } = useContext(TypingContext)! const [wordState, setWordState] = useImmer(structuredClone(initialWordState)) + const isTextSelectable = useAtomValue(isTextSelectableAtom) const isIgnoreCase = useAtomValue(isIgnoreCaseAtom) const saveWordRecord = useSaveWordRecord() const wordLogUploader = useMixPanelWordLogUploader(state) @@ -208,7 +209,9 @@ export default function Word({ word, onFinish }: { word: string; onFinish: () =>
-
+
{wordState.displayWord.split('').map((t, index) => { return ( { @@ -25,6 +26,13 @@ export default function AdvancedSetting() { [setIsIgnoreCase], ) + const onToggleTextSelectable = useCallback( + (checked: boolean) => { + setIsTextSelectable(checked) + }, + [setIsTextSelectable], + ) + return (
@@ -51,6 +59,18 @@ export default function AdvancedSetting() { }`}
+
+ 是否允许选择文本 + 开启后,可以通过鼠标选择文本 +
+ + + {`选择文本已${ + isTextSelectable ? '开启' : '关闭' + }`} +
+
) } diff --git a/src/store/index.ts b/src/store/index.ts index 7e62ed5e..1847a1ba 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -53,6 +53,8 @@ export const isLoopSingleWordAtom = atom(false) export const isIgnoreCaseAtom = atomWithStorage('isIgnoreCase', true) +export const isTextSelectableAtom = atomWithStorage('isTextSelectable', false) + export const phoneticConfigAtom = atomWithStorage('phoneticConfig', { isOpen: true, type: 'us' as PhoneticType,