Skip to content

Commit cd0cc3c

Browse files
committed
feat: play/quit character
1 parent 1772350 commit cd0cc3c

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

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

+15-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { ReactNode } from 'react';
1010
import { useCallback, useState } from 'react';
1111
import {
1212
usePlayCharacter,
13+
useQuitCharacter,
1314
useRemoveCharacter,
1415
useSaveCharacter,
1516
} from '../../../hooks/characters.jsx';
@@ -32,6 +33,7 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
3233

3334
// Hooks to manage characters.
3435
const playCharacter = usePlayCharacter();
36+
const quitCharacter = useQuitCharacter();
3537
const saveCharacter = useSaveCharacter();
3638
const removeCharacter = useRemoveCharacter();
3739

@@ -75,14 +77,24 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
7577
runInBackground(async () => {
7678
closeModals();
7779
setCharacter(character);
78-
// TODO navigate to game grid so user can play the character
79-
alert('Play character: ' + character.characterName);
8080
await playCharacter(character);
81+
// TODO navigate to game grid so user can play the character
8182
});
8283
},
8384
[closeModals, playCharacter]
8485
);
8586

87+
const onQuitCharacterClick = useCallback(
88+
(character: Character) => {
89+
runInBackground(async () => {
90+
closeModals();
91+
setCharacter(character);
92+
await quitCharacter();
93+
});
94+
},
95+
[closeModals, quitCharacter]
96+
);
97+
8698
const onCharacterSaveConfirm = useCallback(
8799
(data: ModalAddCharacterConfirmData) => {
88100
runInBackground(async () => {
@@ -143,6 +155,7 @@ export const SidebarItemCharacters: React.FC = (): ReactNode => {
143155

144156
<TableListCharacters
145157
onPlayCharacterClick={onPlayCharacterClick}
158+
onQuitCharacterClick={onQuitCharacterClick}
146159
onEditCharacterClick={onEditCharacterClick}
147160
onRemoveCharacterClick={onRemoveCharacterClick}
148161
/>

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

+38-11
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@ import {
99
EuiToolTip,
1010
} from '@elastic/eui';
1111
import groupBy from 'lodash-es/groupBy.js';
12+
import isEqual from 'lodash-es/isEqual.js';
1213
import isNil from 'lodash-es/isNil.js';
1314
import type { ReactElement, ReactNode } from 'react';
1415
import { Fragment, memo, useMemo } from 'react';
15-
import { useListCharacters } from '../../../hooks/characters.jsx';
16+
import {
17+
useGetPlayingCharacter,
18+
useListCharacters,
19+
} from '../../../hooks/characters.jsx';
1620
import { GameCodeLabels } from '../../../lib/game/game-code-labels.js';
1721
import type { Character } from '../../../types/game.types.js';
1822

@@ -24,6 +28,7 @@ interface TableByGameCode {
2428

2529
export interface TableListCharactersProps {
2630
onPlayCharacterClick: (character: Character) => void;
31+
onQuitCharacterClick: (character: Character) => void;
2732
onEditCharacterClick: (character: Character) => void;
2833
onRemoveCharacterClick: (character: Character) => void;
2934
}
@@ -32,13 +37,17 @@ export const TableListCharacters: React.FC<TableListCharactersProps> = memo(
3237
(props: TableListCharactersProps): ReactNode => {
3338
const {
3439
onPlayCharacterClick,
40+
onQuitCharacterClick,
3541
onEditCharacterClick,
3642
onRemoveCharacterClick,
3743
} = props;
3844

3945
// All characters to display.
4046
const characters = useListCharacters();
4147

48+
// Which character is currently being played?
49+
const playingCharacter = useGetPlayingCharacter();
50+
4251
// We'll display the characters grouped by game code.
4352
const charactersByGameCode = useMemo(() => {
4453
return groupBy(characters, 'gameCode');
@@ -70,15 +79,27 @@ export const TableListCharacters: React.FC<TableListCharactersProps> = memo(
7079
alignItems="center"
7180
>
7281
<EuiFlexItem grow={false}>
73-
<EuiToolTip content="Play" position="bottom">
74-
<EuiButtonIcon
75-
aria-label="Play"
76-
iconType="play"
77-
display="base"
78-
color="success"
79-
onClick={() => onPlayCharacterClick(character)}
80-
/>
81-
</EuiToolTip>
82+
{isEqual(playingCharacter, character) ? (
83+
<EuiToolTip content="Quit" position="bottom">
84+
<EuiButtonIcon
85+
aria-label="Quit"
86+
iconType="stopFilled"
87+
display="base"
88+
color="accent"
89+
onClick={() => onQuitCharacterClick(character)}
90+
/>
91+
</EuiToolTip>
92+
) : (
93+
<EuiToolTip content="Play" position="bottom">
94+
<EuiButtonIcon
95+
aria-label="Play"
96+
iconType="playFilled"
97+
display="base"
98+
color="success"
99+
onClick={() => onPlayCharacterClick(character)}
100+
/>
101+
</EuiToolTip>
102+
)}
82103
</EuiFlexItem>
83104
<EuiFlexItem grow={false}>
84105
<EuiToolTip content="Edit" position="bottom">
@@ -107,7 +128,13 @@ export const TableListCharacters: React.FC<TableListCharactersProps> = memo(
107128
},
108129
},
109130
];
110-
}, [onPlayCharacterClick, onEditCharacterClick, onRemoveCharacterClick]);
131+
}, [
132+
playingCharacter,
133+
onPlayCharacterClick,
134+
onQuitCharacterClick,
135+
onEditCharacterClick,
136+
onRemoveCharacterClick,
137+
]);
111138

112139
// Create a table for each game code that has characters.
113140
const tablesByGameCode = useMemo<Array<TableByGameCode>>(() => {

0 commit comments

Comments
 (0)