mirror of
https://github.com/hazemKrimi/touch-programming.git
synced 2026-05-01 18:20:26 +00:00
Skip tab spacing and show incorrect spaces and return characters
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
letter-spacing: 0.12rem;
|
letter-spacing: 0.12rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pending {
|
.pending, .space {
|
||||||
color: gray;
|
color: gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,6 +21,14 @@
|
|||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.incorrect-space {
|
||||||
|
border-bottom: 1px solid red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.incorrect-enter {
|
||||||
|
border-left: 1px solid red;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes blink {
|
@keyframes blink {
|
||||||
0% {
|
0% {
|
||||||
border-left: 1px solid white;
|
border-left: 1px solid white;
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { KEYS_TO_DISABLE } from 'constants/default';
|
import { KEYS_TO_DISABLE } from 'constants/default';
|
||||||
|
|
||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
function Code() {
|
function Code() {
|
||||||
@@ -7,14 +8,14 @@ function Code() {
|
|||||||
// TODO: Create a function that combines a sequence of spaces into tabs.
|
// TODO: Create a function that combines a sequence of spaces into tabs.
|
||||||
const [code, setCode] = useState<string>('');
|
const [code, setCode] = useState<string>('');
|
||||||
const [loaded, setLoaded] = useState<boolean>(false);
|
const [loaded, setLoaded] = useState<boolean>(false);
|
||||||
const [characters, setCharacters] = useState<Array<boolean>>([]);
|
const [characters, setCharacters] = useState<Array<boolean | 'space'>>([]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
(async function () {
|
(async function () {
|
||||||
setCode('');
|
setCode('');
|
||||||
|
|
||||||
const response = await fetch(
|
const response = await fetch(
|
||||||
`${import.meta.env.VITE_API_URL}/generate?lang=lisp`,
|
`${import.meta.env.VITE_API_URL}/generate?lang=typescript`,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!response.ok || !response.body) return;
|
if (!response.ok || !response.body) return;
|
||||||
@@ -47,12 +48,19 @@ function Code() {
|
|||||||
|
|
||||||
const char = code[characters.length];
|
const char = code[characters.length];
|
||||||
|
|
||||||
if (/^\n$/.test(char))
|
if (/^\n$/.test(char)) {
|
||||||
return setCharacters(characters.concat(event.key === 'Enter'));
|
const traversedCharacters: Array<boolean | 'space'> = [event.key === 'Enter'];
|
||||||
if (/^(\s|\t)$/.test(char))
|
let numberOfTraversedCharacters = characters.length + 1;
|
||||||
return setCharacters(
|
let space = code[numberOfTraversedCharacters];
|
||||||
characters.concat(['Space', 'Tab'].includes(event.key)),
|
|
||||||
);
|
while (/^\s$/.test(space)) {
|
||||||
|
traversedCharacters.push('space');
|
||||||
|
numberOfTraversedCharacters++;
|
||||||
|
space = code[numberOfTraversedCharacters];
|
||||||
|
}
|
||||||
|
|
||||||
|
return setCharacters(characters.concat(...traversedCharacters));
|
||||||
|
}
|
||||||
|
|
||||||
setCharacters(characters.concat(event.key === char));
|
setCharacters(characters.concat(event.key === char));
|
||||||
}
|
}
|
||||||
@@ -68,6 +76,9 @@ function Code() {
|
|||||||
|
|
||||||
if (loaded && index === characters.length) return 'highlight';
|
if (loaded && index === characters.length) return 'highlight';
|
||||||
if (typeof typed === 'undefined') return 'pending';
|
if (typeof typed === 'undefined') return 'pending';
|
||||||
|
if (typed === 'space') return 'space';
|
||||||
|
if (!typed && /^\n$/.test(code[index])) return 'incorrect-enter';
|
||||||
|
if (!typed && /^\s$/.test(code[index])) return 'incorrect-space';
|
||||||
if (!typed) return 'incorrect';
|
if (!typed) return 'incorrect';
|
||||||
|
|
||||||
return 'correct';
|
return 'correct';
|
||||||
|
|||||||
Reference in New Issue
Block a user