import React, { useEffect, useState } from 'react'; import { ActivityIndicator, Button, KeyboardAvoidingView, Platform, ScrollView, StyleSheet, Text, useColorScheme, View } from 'react-native'; import { SvgXml } from 'react-native-svg'; import { useSelector } from 'react-redux'; import { learnihonColors } from '../assets/colors'; import { Kanji } from '../model/kanji'; import { KanjiListByGrade } from '../model/kanjiListByGrades'; import GradeChipList from './GradeChipList'; import KanjiAnswerField from './KanjiAnswerField'; const KanjiCard = () => { var kanjiCardStyle = useColorScheme() == 'light' ? kanjiCardStyle_light : kanjiCardStyle_dark; const [answerTextColor, setAnswerTextColor] = useState(kanjiCardStyle.text.color); var textAnswerStyle = StyleSheet.create({ text: { color: answerTextColor, fontWeight: "bold", fontSize: "20em" } }) const [loadingSvg, setLoadingSvg] = useState(false); const [selectedItems, setSelectedItems] = useState<{ title: string, data: Kanji[] }[]>([]); const updateSelectedItems = (item: string, isSelected: Boolean) => { if (!isSelected) { setSelectedItems([...selectedItems, { title: item, data: kanjis[item] }]); } else { setSelectedItems(selectedItems.filter((selectedItem) => selectedItem.title !== item)); } }; const nextKanji = () => { if (selectedItems.length) { var items= [].concat(...Object.values(selectedItems.map(it => it.data))) return items[Math.floor(Math.random() * items.length)] } return allKanjis[Math.floor(Math.random() * allKanjis.length)] }; const [kanji, setKanji] = useState((): Kanji | null => { return null }); const [imgXml, setImgXml] = useState(''); const [hasAnswered, setHasAnswered] = useState(false); const [answer, setAnswer] = React.useState(""); var kanjis: KanjiListByGrade = useSelector(state => state.kanjiReducer.kanjis); const allKanjis = [].concat(...Object.values(kanjis)) const fetchXml = async () => { if (kanji) { setLoadingSvg(true); const xml = await (await fetch(kanji?.image!)).text(); setImgXml(xml); setLoadingSvg(false); } } useEffect(() => { setKanji(nextKanji()); }, []); useEffect(() => { fetchXml().then(_ => { }); }, [kanji]); const computeAnswer = () => { setAnswerTextColor(isAnswerRight() ? learnihonColors.correct : learnihonColors.wrong); setHasAnswered(true); } const computeNext = () => { setKanji(nextKanji()); setAnswer(""); setHasAnswered(false); } const isAnswerRight = () => { const arr1 = answer.toLowerCase().split(',').map(word => word.trim()).sort(); const arr2 = kanji?.meaning.toLowerCase().split(',').map(word => word.trim()).sort(); return JSON.stringify(arr1) === JSON.stringify(arr2); } return ( {kanji?.onyomi} {kanji?.kunyomi} {loadingSvg ? ( ) : ()} {!hasAnswered && ( <>