@@ -2,9 +2,10 @@ import type { IpcRendererEvent } from 'electron';
2
2
import { EuiLoadingSpinner , EuiOverlayMask } from '@elastic/eui' ;
3
3
import { useRouter } from 'next/router.js' ;
4
4
import type { ReactNode } from 'react' ;
5
- import { createContext , useEffect , useState } from 'react' ;
5
+ import { createContext , useEffect , useMemo , useState } from 'react' ;
6
6
import type { Character } from '../../common/account/types.js' ;
7
7
import type {
8
+ GameCode ,
8
9
GameCommandMessage ,
9
10
GameConnectMessage ,
10
11
GameDisconnectMessage ,
@@ -20,15 +21,31 @@ import { runInBackground } from '../lib/async/run-in-background.js';
20
21
* React context for storing Game-related data and callbacks.
21
22
*/
22
23
export interface GameContextValue {
23
- //
24
- todo ?: true ;
24
+ /**
25
+ * Whether the game client is connected.
26
+ */
27
+ isConnected : boolean ;
28
+ /**
29
+ * The account of the connected character.
30
+ */
31
+ accountName ?: string ;
32
+ /**
33
+ * The name of the connected character.
34
+ */
35
+ characterName ?: string ;
36
+ /**
37
+ * The game code of the connected character.
38
+ */
39
+ gameCode ?: GameCode ;
25
40
}
26
41
27
42
/**
28
43
* Defines shape and behavior of the context value
29
44
* when no provider is found in the component hierarchy.
30
45
*/
31
- export const GameContext = createContext < GameContextValue > ( { } ) ;
46
+ export const GameContext = createContext < GameContextValue > ( {
47
+ isConnected : false ,
48
+ } ) ;
32
49
33
50
GameContext . displayName = 'GameContext' ;
34
51
@@ -48,6 +65,20 @@ export const GameProvider: React.FC<GameProviderProps> = (
48
65
const router = useRouter ( ) ;
49
66
const pubsub = usePubSub ( ) ;
50
67
68
+ const [ isConnected , setIsConnected ] = useState < boolean > ( false ) ;
69
+ const [ accountName , setAccountName ] = useState < string > ( ) ;
70
+ const [ characterName , setCharacterName ] = useState < string > ( ) ;
71
+ const [ gameCode , setGameCode ] = useState < GameCode > ( ) ;
72
+
73
+ const contextValue = useMemo < GameContextValue > ( ( ) => {
74
+ return {
75
+ isConnected,
76
+ accountName,
77
+ characterName,
78
+ gameCode,
79
+ } ;
80
+ } , [ isConnected , accountName , characterName , gameCode ] ) ;
81
+
51
82
const quitCharacter = useQuitCharacter ( ) ;
52
83
53
84
// To protect against a user pressing play/stop while the app
@@ -112,6 +143,10 @@ export const GameProvider: React.FC<GameProviderProps> = (
112
143
characterName,
113
144
gameCode,
114
145
} ) ;
146
+ setIsConnected ( true ) ;
147
+ setAccountName ( accountName ) ;
148
+ setCharacterName ( characterName ) ;
149
+ setGameCode ( gameCode ) ;
115
150
pubsub . publish ( 'game:connect' , {
116
151
accountName,
117
152
characterName,
@@ -134,6 +169,10 @@ export const GameProvider: React.FC<GameProviderProps> = (
134
169
characterName,
135
170
gameCode,
136
171
} ) ;
172
+ setIsConnected ( false ) ;
173
+ setAccountName ( accountName ) ;
174
+ setCharacterName ( characterName ) ;
175
+ setGameCode ( gameCode ) ;
137
176
pubsub . publish ( 'game:disconnect' , {
138
177
accountName,
139
178
characterName,
@@ -198,7 +237,7 @@ export const GameProvider: React.FC<GameProviderProps> = (
198
237
} , [ pubsub ] ) ;
199
238
200
239
return (
201
- < GameContext . Provider value = { { } } >
240
+ < GameContext . Provider value = { contextValue } >
202
241
< >
203
242
{ ( showPlayStartingOverlay || showPlayStoppingOverlay ) && (
204
243
< EuiOverlayMask >
0 commit comments