hello-wordl/src/Row.tsx

46 lines
1.2 KiB
TypeScript
Raw Normal View History

2022-01-14 01:16:27 +02:00
import { Clue, clueClass, CluedLetter, clueWord } from "./clue";
2021-12-31 03:43:09 +02:00
export enum RowState {
LockedIn,
2022-01-12 18:40:23 +02:00
Editing,
2021-12-31 03:43:09 +02:00
Pending,
}
interface RowProps {
rowState: RowState;
2022-01-01 04:04:48 +02:00
wordLength: number;
cluedLetters: CluedLetter[];
2021-12-31 03:43:09 +02:00
}
export function Row(props: RowProps) {
const isLockedIn = props.rowState === RowState.LockedIn;
2022-01-12 18:40:23 +02:00
const isEditing = props.rowState === RowState.Editing;
2022-01-01 04:04:48 +02:00
const letterDivs = props.cluedLetters
.concat(Array(props.wordLength).fill({ clue: Clue.Absent, letter: "" }))
.slice(0, props.wordLength)
.map(({ clue, letter }, i) => {
2021-12-31 03:43:09 +02:00
let letterClass = "Row-letter";
2022-01-01 04:04:48 +02:00
if (isLockedIn && clue !== undefined) {
letterClass += " " + clueClass(clue);
2021-12-31 03:43:09 +02:00
}
return (
2022-01-14 01:16:27 +02:00
<td
key={i}
className={letterClass}
aria-live={isEditing ? "assertive" : "off"}
2022-01-14 01:16:27 +02:00
aria-label={
isLockedIn
? letter.toUpperCase() +
(clue === undefined ? "" : ": " + clueWord(clue))
: ""
}
>
2021-12-31 03:43:09 +02:00
{letter}
2022-01-14 01:16:27 +02:00
</td>
2021-12-31 03:43:09 +02:00
);
});
let rowClass = "Row";
if (isLockedIn) rowClass += " Row-locked-in";
2022-01-14 01:16:27 +02:00
return <tr className={rowClass}>{letterDivs}</tr>;
2021-12-31 03:43:09 +02:00
}