1
+ import type { EuiSelectOption } from '@elastic/eui' ;
1
2
import {
2
3
EuiConfirmModal ,
3
4
EuiFieldText ,
4
5
EuiForm ,
5
6
EuiFormRow ,
7
+ EuiSelect ,
6
8
} from '@elastic/eui' ;
7
- import { useCallback , useEffect } from 'react' ;
9
+ import sortBy from 'lodash-es/sortBy.js' ;
10
+ import { useCallback , useEffect , useMemo } from 'react' ;
8
11
import type { ReactNode } from 'react' ;
9
12
import { Controller , useForm } from 'react-hook-form' ;
13
+ import { useListAccounts } from '../../../hooks/accounts.jsx' ;
10
14
import { runInBackground } from '../../../lib/async/run-in-background.js' ;
11
- import { GameCodeLabels } from '../../../lib/game/game-code-labels.js' ;
15
+ import { GameCodeSelectOptions } from '../../../lib/game/game-code-labels.js' ;
12
16
13
17
export interface ModalEditCharacterInitialData {
14
18
accountName : string ;
@@ -31,7 +35,42 @@ export interface ModalEditCharacterProps {
31
35
export const ModalEditCharacter : React . FC < ModalEditCharacterProps > = (
32
36
props : ModalEditCharacterProps
33
37
) : ReactNode => {
34
- const { initialData = { } , onClose, onConfirm } = props ;
38
+ const { initialData, onClose, onConfirm } = props ;
39
+
40
+ const accounts = useListAccounts ( ) ;
41
+
42
+ const accountNameOptions = useMemo < Array < EuiSelectOption > > ( ( ) => {
43
+ const sortedAccounts = sortBy ( accounts , 'accountName' ) ;
44
+ return [
45
+ {
46
+ text : 'Select an account...' ,
47
+ value : '' ,
48
+ } ,
49
+ ...sortedAccounts . map ( ( { accountName } ) => {
50
+ return {
51
+ text : accountName ,
52
+ value : accountName ,
53
+ selected : accountName === initialData . accountName ,
54
+ } ;
55
+ } ) ,
56
+ ] ;
57
+ } , [ accounts , initialData ] ) ;
58
+
59
+ const gameCodeOptions = useMemo < Array < EuiSelectOption > > ( ( ) => {
60
+ return [
61
+ {
62
+ text : 'Select an instance...' ,
63
+ value : '' ,
64
+ } ,
65
+ ...GameCodeSelectOptions . map ( ( { label, value } ) => {
66
+ return {
67
+ text : `${ label } (${ value } )` ,
68
+ value,
69
+ selected : value === initialData . gameCode ,
70
+ } ;
71
+ } ) ,
72
+ ] ;
73
+ } , [ initialData ] ) ;
35
74
36
75
const form = useForm < ModalEditCharacterConfirmData > ( ) ;
37
76
@@ -62,7 +101,7 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
62
101
63
102
return (
64
103
< EuiConfirmModal
65
- title = "Rename Character"
104
+ title = "Edit Character"
66
105
onCancel = { onModalClose }
67
106
onConfirm = { onModalConfirm }
68
107
cancelButtonText = "Cancel"
@@ -86,6 +125,7 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
86
125
onBlur = { field . onBlur }
87
126
onChange = { field . onChange }
88
127
isInvalid = { fieldState . invalid }
128
+ autoFocus = { true }
89
129
/>
90
130
) ;
91
131
} }
@@ -101,13 +141,13 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
101
141
rules = { { required : true } }
102
142
render = { ( { field, fieldState } ) => {
103
143
return (
104
- < EuiFieldText
144
+ < EuiSelect
105
145
name = { field . name }
106
146
defaultValue = { field . value }
107
147
onBlur = { field . onBlur }
108
148
onChange = { field . onChange }
109
149
isInvalid = { fieldState . invalid }
110
- disabled = { true }
150
+ options = { accountNameOptions }
111
151
/>
112
152
) ;
113
153
} }
@@ -123,13 +163,13 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
123
163
rules = { { required : true } }
124
164
render = { ( { field, fieldState } ) => {
125
165
return (
126
- < EuiFieldText
166
+ < EuiSelect
127
167
name = { field . name }
128
- defaultValue = { GameCodeLabels [ field . value ] }
168
+ defaultValue = { field . value }
129
169
onBlur = { field . onBlur }
130
170
onChange = { field . onChange }
131
171
isInvalid = { fieldState . invalid }
132
- disabled = { true }
172
+ options = { gameCodeOptions }
133
173
/>
134
174
) ;
135
175
} }
0 commit comments