quiz sentence hide details and stop audio before starting next
This commit is contained in:
1 parent
eff1227b20
commit
09af058fa1
3 files changed
+26
-1
No files matched your search
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useTemplateRef } from "vue";
|
import { useTemplateRef } from "vue";
|
||||||
|
import { stop as stopTTS } from "tauri-plugin-tts-api";
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
src: string;
|
src: string;
|
||||||
@@ -16,7 +17,14 @@ const audioEl = useTemplateRef("audio");
|
|||||||
|
|
||||||
function playAudio() {
|
function playAudio() {
|
||||||
if (!audioEl.value) return;
|
if (!audioEl.value) return;
|
||||||
|
|
||||||
|
document.querySelectorAll("audio").forEach((el) => {
|
||||||
|
el.pause();
|
||||||
|
});
|
||||||
|
stopTTS();
|
||||||
|
|
||||||
audioEl.value.src = props.src;
|
audioEl.value.src = props.src;
|
||||||
|
audioEl.value.currentTime = 0;
|
||||||
audioEl.value.play();
|
audioEl.value.play();
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ async function playAudio() {
|
|||||||
const voices = await getVoices(lang);
|
const voices = await getVoices(lang);
|
||||||
if (!voices.length) return;
|
if (!voices.length) return;
|
||||||
|
|
||||||
|
document.querySelectorAll("audio").forEach((el) => {
|
||||||
|
el.pause();
|
||||||
|
});
|
||||||
|
|
||||||
const v = voices[Math.floor(Math.random() * voices.length)];
|
const v = voices[Math.floor(Math.random() * voices.length)];
|
||||||
console.log(JSON.stringify(v));
|
console.log(JSON.stringify(v));
|
||||||
await speak({
|
await speak({
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<span class="spoiler"> {{ v.en }} </span>
|
<span class="spoiler"> {{ v.en }} </span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<details v-if="example">
|
<details v-if="example" ref="sdetails">
|
||||||
<summary>
|
<summary>
|
||||||
<span v-if="example.audio">
|
<span v-if="example.audio">
|
||||||
{{ example.ko }}
|
{{ example.ko }}
|
||||||
@@ -69,6 +69,7 @@ const vList = ref<IVoc[]>([]);
|
|||||||
const vIndex = ref(0);
|
const vIndex = ref(0);
|
||||||
const vSentAutoplayAudio = ref(true);
|
const vSentAutoplayAudio = ref(true);
|
||||||
|
|
||||||
|
const sentenceDetails = useTemplateRef("sdetails");
|
||||||
const stts = useTemplateRef<InstanceType<typeof TTS>>("stts");
|
const stts = useTemplateRef<InstanceType<typeof TTS>>("stts");
|
||||||
|
|
||||||
const v = computed(() => vList.value[vIndex.value]);
|
const v = computed(() => vList.value[vIndex.value]);
|
||||||
@@ -99,6 +100,12 @@ vChosenCats.value = [...vCats.value];
|
|||||||
makeVList();
|
makeVList();
|
||||||
|
|
||||||
function makeVList() {
|
function makeVList() {
|
||||||
|
nextTick(() => {
|
||||||
|
if (sentenceDetails.value) {
|
||||||
|
sentenceDetails.value.open = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
vList.value = Object.entries(vocabulary)
|
vList.value = Object.entries(vocabulary)
|
||||||
.filter(([k]) => vChosenCats.value.includes(k))
|
.filter(([k]) => vChosenCats.value.includes(k))
|
||||||
.flatMap(([, v]) => v);
|
.flatMap(([, v]) => v);
|
||||||
@@ -113,6 +120,12 @@ function makeVList() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mark(isRight: boolean) {
|
function mark(isRight: boolean) {
|
||||||
|
nextTick(() => {
|
||||||
|
if (sentenceDetails.value) {
|
||||||
|
sentenceDetails.value.open = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if (isRight) {
|
if (isRight) {
|
||||||
vList.value = [...vList.value.filter((_, i) => i !== vIndex.value)];
|
vList.value = [...vList.value.filter((_, i) => i !== vIndex.value)];
|
||||||
if (vList.value.length === 0) {
|
if (vList.value.length === 0) {
|
||||||
|
|||||||
Reference in new issue
Block a user