feat: add GameRow component composing LetterInput and ActorPopover
This commit is contained in:
43
assets/react/controllers/GameRow.jsx
Normal file
43
assets/react/controllers/GameRow.jsx
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
import React, { useRef, useCallback } from 'react';
|
||||||
|
import LetterInput from './LetterInput';
|
||||||
|
import ActorPopover from './ActorPopover';
|
||||||
|
|
||||||
|
export default function GameRow({ actorName, pos, colStart, totalWidth }) {
|
||||||
|
const inputRefs = useRef([]);
|
||||||
|
|
||||||
|
const setInputRef = useCallback((index) => (el) => {
|
||||||
|
inputRefs.current[index] = el;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const focusInput = useCallback((index) => {
|
||||||
|
inputRefs.current[index]?.focus();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const letters = actorName.split('');
|
||||||
|
|
||||||
|
return (
|
||||||
|
<tr>
|
||||||
|
{Array.from({ length: totalWidth + 1 }, (_, colIndex) => {
|
||||||
|
const charIndex = colIndex - colStart;
|
||||||
|
const isInRange = charIndex >= 0 && charIndex < letters.length;
|
||||||
|
|
||||||
|
if (!isInRange) {
|
||||||
|
return <td key={colIndex} />;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<LetterInput
|
||||||
|
key={colIndex}
|
||||||
|
highlighted={charIndex === pos}
|
||||||
|
inputRef={setInputRef(charIndex)}
|
||||||
|
onNext={() => focusInput(charIndex + 1)}
|
||||||
|
onPrev={() => focusInput(charIndex - 1)}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
<td>
|
||||||
|
<ActorPopover actorName={actorName} />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user