import { useState } from 'react' import './App.css' import Form from 'react-bootstrap/Form'; import { Badge, Button, ListGroup } from 'react-bootstrap'; import { initials, finales, syllables, tones } from './data'; import { getRandomTones, isEnabled, toggle } from './utils'; import { Found, Syllable, Tone } from './types'; import { strings } from './strings'; const defaultFoundState:Found = { allfinales: false, allInitiales: false, finales: [], initiales: [], syllables: [], toneS: [], randomTones: [] } enum Status {params, plaing, plaied, showlist} function App() { const [ count, setCount ] = useState(10) const [ pause, setPause ] = useState(3) const [ found, setFound ] = useState(defaultFoundState) const onchangepause = (e: React.ChangeEvent ) => setPause( Number(e.target.value) ) const onchangecount = (e: React.ChangeEvent ) => { setCount( Number(e.target.value) ) refreshRandomTones() } //---------------- to found state const toggleAllInitiales = () => { let toggled = found.allInitiales ? [] : initials let foundSyllables:Syllable[] = syllables.filter( syl => toggled.includes(syl.initiale) && found.finales.includes(syl.finale) ) let foundTones = tones.filter( t => foundSyllables.some( syl => syl.tones.some( st => st===t.tone) ) ) let foundRandomTones = getRandomTones( foundTones, count ) setFound({...found, allInitiales: !found.allInitiales, initiales: toggled, syllables: foundSyllables, toneS: foundTones, randomTones: foundRandomTones }) } const toggleInitialsState = (caption: string) => { let toggled = toggle(found.initiales,caption) let foundSyllables:Syllable[] = syllables.filter( syl => toggled.includes(syl.initiale) && found.finales.includes(syl.finale) ) let foundTones = tones.filter( t => foundSyllables.some( syl => syl.tones.some( st => st===t.tone) ) ) let foundRandomTones = getRandomTones( foundTones, count ) setFound({...found, initiales: toggled, syllables: foundSyllables, toneS: foundTones, randomTones: foundRandomTones }) } const toggleAllFinales = () => { let toggled = found.allfinales ? [] : finales.map( f => f.finale) let foundSyllables:Syllable[] = syllables.filter ( syl => found.initiales.includes( syl.initiale) && toggled.includes( syl.finale ) ) let foundTones = tones.filter( t => foundSyllables.some( syl => syl.tones.some( st => st===t.tone) ) ) let foundRandomTones = getRandomTones( foundTones, count ) setFound({...found, allfinales: !found.allfinales, finales: toggled, syllables: foundSyllables, toneS: foundTones, randomTones: foundRandomTones }) } const toggleFinalsState = (caption: string) => { let toggled = toggle(found.finales,caption) let foundSyllables:Syllable[] = syllables.filter ( syl => found.initiales.includes( syl.initiale) && toggled.includes( syl.finale ) ) let foundTones = tones.filter( t => foundSyllables.some( syl => syl.tones.some( st => st===t.tone) ) ) let foundRandomTones = getRandomTones( foundTones, count ) setFound({...found, finales: toggled, syllables: foundSyllables, toneS: foundTones, randomTones: foundRandomTones }) } const isFound = ():boolean => found.syllables.length > 0 const [plaingNo, setPlaingNo ] = useState(0) // ---- опять по новой const [ status, setStatus ] = useState(Status.params) const beginDictation = (): void => { refreshRandomTones() console.debug(found.randomTones) playDictation2(found.randomTones) } const playDictation2 = (randomTones: Tone[]) => { if ( randomTones.length == 0 ) return let audios:HTMLAudioElement[] = [] randomTones.forEach(element => { audios = [...audios, new Audio(`/src/assets/audio/${element.tone}.mp3`) ] }); console.debug(audios) if ( audios.length == 0 ) return for(let x=0; x setTimeout( () => { let pno = x+2 setPlaingNo(pno) audios[x+1].play() }, 1000*pause ) ; } audios[audios.length-1].onended = () => setStatus(Status.plaied) setStatus(Status.plaing) setPlaingNo(1) audios[0].play() } const renderRandomTones2 = () => { return found.randomTones.map( (ton, i) => { return {ton.caption}{' '} }) } const refresh = () => { refreshRandomTones() setStatus(Status.params) } const refreshRandomTones = () => { let foundRandomTones = getRandomTones( found.toneS, count ) setFound({...found, randomTones: foundRandomTones }) } return ( <>

Диктант pīnyīn

{strings.selectInitiales}

{initials.map( (text, i) => )}

{strings.selectFinales}

{finales.map( (fin, i) => )}

{strings.params}

Количество слогов {count} Пауза между слогами {pause} секунд
{ status == Status.params && <> Выбрано {found.initiales.length} инициалей, {found.finales.length} финалей, найдено {found.syllables.length} слогов, { found.toneS.length } тонов ,
} { status == Status.plaing &&

Воспроизводится...{plaingNo}

} { status == Status.plaied && } { status == Status.showlist && <>
{renderRandomTones2()}

}
) } export default App