Skip to content

Commit 1772350

Browse files
committed
feat: edit all fields of character; standardize on "remove" instead of "log out"
1 parent 4f12667 commit 1772350

8 files changed

+94
-34
lines changed

electron/renderer/components/sidebar/accounts/modal-edit-account.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export interface ModalEditAccountProps {
2929
export const ModalEditAccount: React.FC<ModalEditAccountProps> = (
3030
props: ModalEditAccountProps
3131
): ReactNode => {
32-
const { initialData = {}, onClose, onConfirm } = props;
32+
const { initialData, onClose, onConfirm } = props;
3333

3434
const form = useForm<ModalEditAccountConfirmData>();
3535

electron/renderer/components/sidebar/accounts/modal-remove-account.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ export const ModalRemoveAccount: React.FC<ModalRemoveAccountProps> = (
4242

4343
return (
4444
<EuiConfirmModal
45-
title={<>Log out of account?</>}
45+
title="Remove account?"
4646
onCancel={onModalClose}
4747
onConfirm={onModalConfirm}
4848
cancelButtonText="Cancel"
49-
confirmButtonText="Log out"
49+
confirmButtonText="Remove"
5050
buttonColor="danger"
5151
defaultFocusedButton="cancel"
5252
>

electron/renderer/components/sidebar/accounts/sidebar-item-accounts.tsx

+7-5
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ export const SidebarItemAccounts: React.FC = (): ReactNode => {
3737
setShowAddModal(false);
3838
setShowEditModal(false);
3939
setShowRemoveModal(false);
40-
setAccount(undefined);
4140
}, []);
4241

4342
const onAddAccountClick = useCallback(() => {
4443
closeModals();
44+
setAccount(undefined);
4545
setShowAddModal(true);
4646
}, [closeModals]);
4747

@@ -51,7 +51,7 @@ export const SidebarItemAccounts: React.FC = (): ReactNode => {
5151
setAccount(account);
5252
setShowEditModal(true);
5353
},
54-
[setAccount, closeModals]
54+
[closeModals]
5555
);
5656

5757
const onRemoveAccountClick = useCallback(
@@ -60,30 +60,32 @@ export const SidebarItemAccounts: React.FC = (): ReactNode => {
6060
setAccount(account);
6161
setShowRemoveModal(true);
6262
},
63-
[setAccount, closeModals]
63+
[closeModals]
6464
);
6565

6666
const onAccountSaveConfirm = useCallback(
6767
(data: ModalAddAccountConfirmData) => {
68-
closeModals();
6968
runInBackground(async () => {
7069
await saveAccount({
7170
accountName: data.accountName,
7271
accountPassword: data.accountPassword,
7372
});
7473
});
74+
closeModals();
75+
setAccount(undefined);
7576
},
7677
[closeModals, saveAccount]
7778
);
7879

7980
const onAccountRemoveConfirm = useCallback(
8081
(data: ModalRemoveAccountConfirmData) => {
81-
closeModals();
8282
runInBackground(async () => {
8383
await removeAccount({
8484
accountName: data.accountName,
8585
});
8686
});
87+
closeModals();
88+
setAccount(undefined);
8789
},
8890
[closeModals, removeAccount]
8991
);

electron/renderer/components/sidebar/accounts/table-list-accounts.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ export const TableListAccounts: React.FC<TableListAccountsProps> = memo(
5454
</EuiToolTip>
5555
</EuiFlexItem>
5656
<EuiFlexItem grow={false}>
57-
<EuiToolTip content="Log Out" position="bottom">
57+
<EuiToolTip content="Remove" position="bottom">
5858
<EuiButtonIcon
59-
aria-label="Log Out"
60-
iconType="exit"
59+
aria-label="Remove"
60+
iconType="cross"
6161
display="base"
6262
color="danger"
6363
onClick={() => onRemoveAccountClick(account)}

electron/renderer/components/sidebar/characters/modal-edit-character.tsx

+49-9
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
1+
import type { EuiSelectOption } from '@elastic/eui';
12
import {
23
EuiConfirmModal,
34
EuiFieldText,
45
EuiForm,
56
EuiFormRow,
7+
EuiSelect,
68
} from '@elastic/eui';
7-
import { useCallback, useEffect } from 'react';
9+
import sortBy from 'lodash-es/sortBy.js';
10+
import { useCallback, useEffect, useMemo } from 'react';
811
import type { ReactNode } from 'react';
912
import { Controller, useForm } from 'react-hook-form';
13+
import { useListAccounts } from '../../../hooks/accounts.jsx';
1014
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';
1216

1317
export interface ModalEditCharacterInitialData {
1418
accountName: string;
@@ -31,7 +35,42 @@ export interface ModalEditCharacterProps {
3135
export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
3236
props: ModalEditCharacterProps
3337
): 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]);
3574

3675
const form = useForm<ModalEditCharacterConfirmData>();
3776

@@ -62,7 +101,7 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
62101

63102
return (
64103
<EuiConfirmModal
65-
title="Rename Character"
104+
title="Edit Character"
66105
onCancel={onModalClose}
67106
onConfirm={onModalConfirm}
68107
cancelButtonText="Cancel"
@@ -86,6 +125,7 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
86125
onBlur={field.onBlur}
87126
onChange={field.onChange}
88127
isInvalid={fieldState.invalid}
128+
autoFocus={true}
89129
/>
90130
);
91131
}}
@@ -101,13 +141,13 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
101141
rules={{ required: true }}
102142
render={({ field, fieldState }) => {
103143
return (
104-
<EuiFieldText
144+
<EuiSelect
105145
name={field.name}
106146
defaultValue={field.value}
107147
onBlur={field.onBlur}
108148
onChange={field.onChange}
109149
isInvalid={fieldState.invalid}
110-
disabled={true}
150+
options={accountNameOptions}
111151
/>
112152
);
113153
}}
@@ -123,13 +163,13 @@ export const ModalEditCharacter: React.FC<ModalEditCharacterProps> = (
123163
rules={{ required: true }}
124164
render={({ field, fieldState }) => {
125165
return (
126-
<EuiFieldText
166+
<EuiSelect
127167
name={field.name}
128-
defaultValue={GameCodeLabels[field.value]}
168+
defaultValue={field.value}
129169
onBlur={field.onBlur}
130170
onChange={field.onChange}
131171
isInvalid={fieldState.invalid}
132-
disabled={true}
172+
options={gameCodeOptions}
133173
/>
134174
);
135175
}}

electron/renderer/components/sidebar/characters/modal-remove-character.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const ModalRemoveCharacter: React.FC<ModalRemoveCharacterProps> = (
4141

4242
return (
4343
<EuiConfirmModal
44-
title={<>Remove character?</>}
44+
title="Remove character?"
4545
onCancel={onModalClose}
4646
onConfirm={onModalConfirm}
4747
cancelButtonText="Cancel"

electron/renderer/components/sidebar/characters/sidebar-item-characters.tsx

+29-11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import {
55
EuiPanel,
66
EuiSpacer,
77
} from '@elastic/eui';
8+
import isEqual from 'lodash-es/isEqual.js';
89
import type { ReactNode } from 'react';
910
import { useCallback, useState } from 'react';
1011
import {
@@ -43,11 +44,11 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
4344
setShowAddModal(false);
4445
setShowEditModal(false);
4546
setShowRemoveModal(false);
46-
setCharacter(undefined);
4747
}, []);
4848

4949
const onAddCharacterClick = useCallback(() => {
5050
closeModals();
51+
setCharacter(undefined);
5152
setShowAddModal(true);
5253
}, [closeModals]);
5354

@@ -57,7 +58,7 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
5758
setCharacter(character);
5859
setShowEditModal(true);
5960
},
60-
[setCharacter, closeModals]
61+
[closeModals]
6162
);
6263

6364
const onRemoveCharacterClick = useCallback(
@@ -66,43 +67,60 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
6667
setCharacter(character);
6768
setShowRemoveModal(true);
6869
},
69-
[setCharacter, closeModals]
70+
[closeModals]
7071
);
7172

7273
const onPlayCharacterClick = useCallback(
7374
(character: Character) => {
74-
closeModals();
75-
setCharacter(character);
76-
// TODO play the character
77-
alert('Play character: ' + character.characterName);
75+
runInBackground(async () => {
76+
closeModals();
77+
setCharacter(character);
78+
// TODO navigate to game grid so user can play the character
79+
alert('Play character: ' + character.characterName);
80+
await playCharacter(character);
81+
});
7882
},
79-
[setCharacter, closeModals]
83+
[closeModals, playCharacter]
8084
);
8185

8286
const onCharacterSaveConfirm = useCallback(
8387
(data: ModalAddCharacterConfirmData) => {
84-
closeModals();
8588
runInBackground(async () => {
89+
// Characters are identified by their attributes.
90+
// If the user edits the character, that creates a new unique entry.
91+
// We need to remove the old entry and save the new one.
92+
if (character) {
93+
if (!isEqual(character, data)) {
94+
await removeCharacter({
95+
accountName: character.accountName,
96+
characterName: character.characterName,
97+
gameCode: character.gameCode,
98+
});
99+
}
100+
}
86101
await saveCharacter({
87102
accountName: data.accountName,
88103
characterName: data.characterName,
89104
gameCode: data.gameCode,
90105
});
106+
closeModals();
107+
setCharacter(undefined);
91108
});
92109
},
93-
[closeModals, saveCharacter]
110+
[character, closeModals, removeCharacter, saveCharacter]
94111
);
95112

96113
const onCharacterRemoveConfirm = useCallback(
97114
(data: ModalRemoveCharacterConfirmData) => {
98-
closeModals();
99115
runInBackground(async () => {
100116
await removeCharacter({
101117
accountName: data.accountName,
102118
characterName: data.characterName,
103119
gameCode: data.gameCode,
104120
});
105121
});
122+
closeModals();
123+
setCharacter(undefined);
106124
},
107125
[closeModals, removeCharacter]
108126
);

electron/renderer/components/sidebar/characters/table-list-characters.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,9 @@ export const TableListCharacters: React.FC<TableListCharactersProps> = memo(
8181
</EuiToolTip>
8282
</EuiFlexItem>
8383
<EuiFlexItem grow={false}>
84-
<EuiToolTip content="Rename" position="bottom">
84+
<EuiToolTip content="Edit" position="bottom">
8585
<EuiButtonIcon
86-
aria-label="Rename"
86+
aria-label="Edit"
8787
iconType="pencil"
8888
display="base"
8989
color="warning"

0 commit comments

Comments
 (0)