Skip to content

Commit

Permalink
Added anki tags selector to settings drawer
Browse files Browse the repository at this point in the history
  • Loading branch information
TomPlum committed Oct 1, 2023
1 parent a815aa8 commit 1c79b22
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 20 deletions.
10 changes: 6 additions & 4 deletions src/hooks/useAnki/useAnki.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import { useTranslation } from "react-i18next"
import { CreateAnkiCardParams } from "api/hooks/useCreateAnkiCard/types.ts"
import useGetAnkiDecks from "api/hooks/useGetAnkiDecks"
import useCreateAnkiDeck from "api/hooks/useCreateAnkiDeck"
import { useSettingsContext } from "modules/Settings/context/useSettingsContext.ts"

const useAnki = (): AnkiResponse => {
const { anki } = useSettingsContext()
const { fireToast } = useToastContext()
const { data: decks } = useGetAnkiDecks()
const { mutateAsync: createDeck } = useCreateAnkiDeck()
Expand All @@ -16,7 +18,7 @@ const useAnki = (): AnkiResponse => {

const createAnkiDeck = useCallback(async () => {
try {
await createDeck({ deck: 'Japanese::Nyusu' })
await createDeck({ deck: anki.deckName })

fireToast({
type: 'success',
Expand All @@ -28,10 +30,10 @@ const useAnki = (): AnkiResponse => {
message: t('create-deck.toast.error')
})
}
}, [createDeck, fireToast, t])
}, [anki.deckName, createDeck, fireToast, t])

const createCard = useCallback(async (args: CreateAnkiCardParams) => {
if (decks && !decks.includes('Japanese::Nyusu')) {
if (decks && !decks.includes(anki.deckName)) {
await createAnkiDeck()
}

Expand All @@ -49,7 +51,7 @@ const useAnki = (): AnkiResponse => {
})
}

}, [decks, createAnkiDeck, createCardApi, fireToast, t])
}, [decks, anki.deckName, createAnkiDeck, createCardApi, fireToast, t])

return {
createCard
Expand Down
7 changes: 6 additions & 1 deletion src/locales/en/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,12 @@
"anki": {
"heading": "Anki",
"deck": {
"label": "Deck Name"
"label": "Deck Name",
"help": "Cannot be empty."
},
"tags": {
"label": "Tags",
"help": "Must be comma separated"
}
}
},
Expand Down
7 changes: 6 additions & 1 deletion src/locales/jp/translation.json
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,12 @@
"anki": {
"heading": "アンキ",
"deck": {
"label": "デッキ名"
"label": "デッキ名",
"help": "空は不可"
},
"tags": {
"label": "タグ",
"help": "カンマ区切り"
}
}
},
Expand Down
8 changes: 5 additions & 3 deletions src/modules/Newspaper/components/AnkiArticle/AnkiArticle.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,18 @@ import useAnki from "hooks/useAnki"
import { Button, CircularProgress } from "@mui/material"
import { AnkiArticleProps } from "modules/Newspaper/components/AnkiArticle/types.ts"
import { useCallback, useState } from "react"
import { useSettingsContext } from "modules/Settings/context/useSettingsContext.ts"

export const AnkiArticle = ({ article }: AnkiArticleProps) => {
const { createCard } = useAnki()
const { anki } = useSettingsContext()
const [loading, setLoading] = useState(false)

const handleCreateCard = useCallback(() => {
setLoading(true)
createCard({
note: {
deckName: 'Japanese::Nyusu',
deckName: anki.deckName,
modelName: 'Basic',
fields: {
Back: {
Expand All @@ -24,14 +26,14 @@ export const AnkiArticle = ({ article }: AnkiArticleProps) => {
source: article.link
}
},
tags: ['nyusu']
tags: anki.tags
}
}).then(() => {
setLoading(false)
}).catch(e => {
console.debug(e)
})
}, [article.link, article.title, createCard])
}, [anki.deckName, anki.tags, article.link, article.title, createCard])

return (
<div className={styles.article}>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,39 @@
import { TextField } from "@mui/material"
import { useTranslation } from "react-i18next"
import { useSettingsContext } from "modules/Settings/context/useSettingsContext.ts"
import { ChangeEvent, useCallback } from "react"
import { ChangeEvent, useCallback, useEffect, useMemo, useState } from "react"

const AnkiDeckSelector = () => {
const { anki ,setAnkiSettings } = useSettingsContext()
const { t } = useTranslation('translation', { keyPrefix: 'settings.anki' })
const { anki, setAnkiSettings } = useSettingsContext()
const [value, setValue] = useState(anki.deckName)
const { t } = useTranslation('translation', { keyPrefix: 'settings.anki.deck' })

const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
setAnkiSettings({
...anki,
deckName: e.target.value
})
}, [anki, setAnkiSettings])
setValue(e.target.value)
}, [])

const error = useMemo(() => {
return value.length <= 0
}, [value.length])

useEffect(() => {
if (!error) {
setAnkiSettings({
...anki,
deckName: value
})
}
}, [anki, error, setAnkiSettings, value])

return (
<div>
<TextField
value={anki.deckName}
label={t('deck.label')}
value={value}
error={error}
label={t('label')}
onChange={handleChange}
id='anki-deck-name-selector'
helperText={error ? t('help') : ''}
data-testid='anki-deck-name-selector'
/>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { TextField } from "@mui/material"
import { useSettingsContext } from "modules/Settings/context/useSettingsContext.ts"
import { useTranslation } from "react-i18next"
import { ChangeEvent, useCallback, useEffect, useMemo, useState } from "react"

const AnkiTagsSelector = () => {
const { anki, setAnkiSettings } = useSettingsContext()
const [value, setValue] = useState(anki.tags.join(','))
const { t } = useTranslation('translation', { keyPrefix: 'settings.anki.tags' })

const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {
setValue(e.target.value)
}, [])

const error = useMemo(() => {
return !/^([a-zA-Z0-9]+,?\s*)+$/.test(value)
}, [value])

useEffect(() => {
if (!error) {
setAnkiSettings({
...anki,
tags: value.trim().split(',')
})
}
}, [anki, error, setAnkiSettings, value])

return (
<div>
<TextField
value={value}
error={error}
label={t('label')}
helperText={t('help')}
onChange={handleChange}
id='anki-deck-tags-selector'
data-testid='anki-deck-tags-selector'
/>
</div>
)
}

export default AnkiTagsSelector
1 change: 1 addition & 0 deletions src/modules/Settings/components/AnkiTagsSelector/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './AnkiTagsSelector.tsx'
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
margin-bottom: 10px;
display: flex;
flex-direction: column;

>div {
margin-bottom: 20px;
}
}

.heading {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import { Drawer } from "@mui/material"
import styles from './SettingsDrawer.module.scss'
import { useTranslation } from "react-i18next"
import { useSettingsContext } from "modules/Settings/context/useSettingsContext.ts"
import { SourcesSelector } from "modules/Settings/components/SourcesSelector/SourcesSelector.tsx"
import SourcesSelector from "modules/Settings/components/SourcesSelector"
import LanguageControls from "modules/Settings/components/LanguageControls"
import FontSelector from "modules/Settings/components/FontSelector"
import AnkiDeckSelector from "modules/Settings/components/AnkiDeckSelector"
import AnkiTagsSelector from "modules/Settings/components/AnkiTagsSelector"

const SettingsDrawer = () => {
const { open, setOpen } = useSettingsContext()
Expand Down Expand Up @@ -55,6 +56,7 @@ const SettingsDrawer = () => {
</p>

<AnkiDeckSelector />
<AnkiTagsSelector />
</div>
</div>
</Drawer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,5 @@ export const SourcesSelector = () => {
</div>
)
}

export default SourcesSelector
1 change: 1 addition & 0 deletions src/modules/Settings/components/SourcesSelector/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from './SourcesSelector.tsx'

0 comments on commit 1c79b22

Please sign in to comment.