11import { PlusIcon } from "lucide-react" ;
2- import { useState } from "react" ;
2+ import { useState , useRef , useEffect } from "react" ;
33import { Button } from "./ui/button" ;
44import { Input } from "./ui/input" ;
55
66export default function MemberList ( ) {
77 // メンバー名の配列を状態として管理
88 const [ members , setMembers ] = useState < string [ ] > ( [ "" ] ) ;
9+ // 各inputへの参照を保持
10+ const inputRefs = useRef < ( HTMLInputElement | null ) [ ] > ( [ ] ) ;
911
1012 // メンバー追加関数
1113 const handleAddMember = ( ) => {
12- setMembers ( [ ...members , "" ] ) ;
14+ setMembers ( ( prev ) => [ ...prev , "" ] ) ;
1315 } ;
1416
1517 // 入力内容を更新する関数
@@ -21,37 +23,57 @@ export default function MemberList() {
2123
2224 // メンバー削除関数
2325 const handleDeleteMember = ( index : number ) => {
26+ // アラートの表示
27+ alert ( '本当に削除しますか' )
28+
2429 // フィルターで指定index以外を残す
25- const updated = members . filter ( ( _ , i ) => i !== index ) ;
26- setMembers ( updated ) ;
30+ setMembers ( ( prev ) => prev . filter ( ( _ , i ) => i !== index ) ) ;
31+ } ;
32+
33+ const handleKeyDown = ( e : React . KeyboardEvent < HTMLInputElement > , index : number ) => {
34+ if ( e . key === "Enter" ) {
35+ e . preventDefault ( ) ;
36+
37+ // 最後の要素なら新しい入力欄を追加
38+ if ( index === members . length - 1 ) {
39+ handleAddMember ( ) ;
40+ } else {
41+ // 次の入力欄にフォーカス
42+ inputRefs . current [ index + 1 ] ?. focus ( ) ;
43+ }
44+ }
2745 } ;
2846
47+ // メンバー追加時に自動で新しい欄にフォーカス
48+ useEffect ( ( ) => {
49+ if ( inputRefs . current [ members . length - 1 ] ) {
50+ inputRefs . current [ members . length - 1 ] ?. focus ( ) ;
51+ }
52+ } , [ members . length ] ) ;
53+
2954 return (
30- < div style = { { padding : "10px" } } >
31- < h2 > メンバー一覧</ h2 >
55+ < div className = "p-4" >
56+ < h2 className = "mb-2 text-xl font-semibold" > メンバー一覧</ h2 >
3257
3358 { members . map ( ( member , index ) => (
3459 < div
35- key = { index }
36- style = { {
37- marginBottom : "8px" ,
38- display : "flex" ,
39- alignItems : "center" ,
40- gap : "8px" ,
41- } }
42- >
60+ key = { index } className = "mb-2 flex items-center gap-2" >
4361 < Input
62+ //各inputを登録
63+ ref = { ( el ) => { inputRefs . current [ index ] = el } }
4464 type = "text"
4565 value = { member }
4666 placeholder = { `メンバー${ index + 1 } ` }
4767 onChange = { ( e ) => handleChange ( index , e . target . value ) }
68+ onKeyDown = { ( e ) => handleKeyDown ( e , index ) }
69+ className = "border rounded-md px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-400"
4870 />
4971
5072 { /* 削除ボタン */ }
5173 < Button
5274 onClick = { ( ) => handleDeleteMember ( index ) }
5375 variant = "destructive"
54- className = "cursor-pointer"
76+ className = "cursor-pointer hover:bg-red-700 "
5577 >
5678 削除
5779 </ Button >
@@ -62,7 +84,7 @@ export default function MemberList() {
6284 < Button
6385 onClick = { handleAddMember }
6486 variant = "outline"
65- className = "cursor-pointer"
87+ className = "cursor-pointer mt-2 "
6688 >
6789 < PlusIcon />
6890 メンバーを追加
0 commit comments