• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

DaniSomoza / galactic-commander / 12422152220

19 Dec 2024 10:57PM UTC coverage: 52.396% (-13.2%) from 65.587%
12422152220

Pull #11

github

web-flow
Merge e0cd6a508 into 4f9f087f0
Pull Request #11: Build units

204 of 768 branches covered (26.56%)

Branch coverage included in aggregate %.

363 of 886 new or added lines in 84 files covered. (40.97%)

10 existing lines in 7 files now uncovered.

1414 of 2320 relevant lines covered (60.95%)

3.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

42.52
/packages/frontend/src/store/buildUnitsContext.tsx
1
import { createContext, useCallback, useContext, useState, useMemo } from 'react'
2

3
import { PlanetType } from 'game-api-microservice/src/types/Planet'
4
import { UnitTypes } from 'game-api-microservice/src/types/Unit'
5
import getSecond from 'game-engine/src/helpers/getSecond'
6

7
import { usePlayer } from './PlayerContext'
8
import {
9
  startBuildUnits as startBuildUnitsEndpoint,
10
  updateBuildUnitsQueue as updateBuildUnitsQueueEndpoint
11
} from '../endpoints/game/buildUnitsEndpoint'
12
import usePolling from '../hooks/usePolling'
13
import { useGameInfo } from './GameInfoContext'
14
import waitTaskToStart from '../utils/waitTaskToStart'
15
import waitTaskToFinish from '../utils/waitTaskToFinish'
16

17
const initialContext = {
1✔
18
  activeBuildTroops: undefined,
19
  activeBuildSpaceships: undefined,
20
  activeBuildDefenses: undefined,
21

22
  activeBuildTroopsCountdown: 0,
23
  activeBuildSpaceshipsCountdown: 0,
24
  activeBuildDefensesCountdown: 0,
25

26
  buildTroopsQueue: [],
27
  buildSpaceshipsQueue: [],
28
  buildDefensesQueue: [],
29

30
  isBuildUnitsLoading: true,
31

NEW
32
  starBuildUnits: () => Promise.resolve(),
×
NEW
33
  updateBuildUnitsQueue: () => Promise.resolve(),
×
NEW
34
  removeBuildUnitsFromQueue: () => Promise.resolve()
×
35
}
36

37
type buildUnitsContextValue = {
38
  activeBuildTroops?: PlanetType['unitBuild']['troops']['activeBuild']
39
  activeBuildSpaceships?: PlanetType['unitBuild']['spaceships']['activeBuild']
40
  activeBuildDefenses?: PlanetType['unitBuild']['defenses']['activeBuild']
41

42
  activeBuildTroopsCountdown: number
43
  activeBuildSpaceshipsCountdown: number
44
  activeBuildDefensesCountdown: number
45

46
  buildTroopsQueue: PlanetType['unitBuild']['troops']['queue']
47
  buildSpaceshipsQueue: PlanetType['unitBuild']['spaceships']['queue']
48
  buildDefensesQueue: PlanetType['unitBuild']['defenses']['queue']
49

50
  isBuildUnitsLoading: boolean
51

52
  starBuildUnits: (unitName: string, amount: number) => Promise<void>
53
  updateBuildUnitsQueue: (unitName: string, amount: number, unitType: UnitTypes) => Promise<void>
54
  removeBuildUnitsFromQueue: (index: number, unitType: UnitTypes) => Promise<void>
55
}
56

57
const buildUnitsContext = createContext<buildUnitsContextValue>(initialContext)
1✔
58

59
function useBuildUnits() {
60
  const context = useContext(buildUnitsContext)
1✔
61

62
  if (!context) {
1!
NEW
63
    throw new Error('useBuildUnits should be within BuildUnitsContext Provider')
×
64
  }
65

66
  return context
1✔
67
}
68

69
type BuildUnitsProviderProps = {
70
  children: JSX.Element | JSX.Element[]
71
}
72

73
function BuildUnitsProvider({ children }: BuildUnitsProviderProps) {
74
  const [activeBuildTroopsCountdown, setActiveBuildTroopsCountdown] = useState(0)
1✔
75
  const [activeBuildSpaceshipsCountdown, setActiveBuildSpaceshipsCountdown] = useState(0)
1✔
76
  const [activeBuildDefensesCountdown, setActiveBuildDefensesCountdown] = useState(0)
1✔
77

78
  const { selectedUniverse } = useGameInfo()
1✔
79
  const { loadPlayer, isPlayerLoading, selectedPlanet } = usePlayer()
1✔
80

81
  const activeBuildTroops = selectedPlanet?.unitBuild.troops.activeBuild
1✔
82
  const activeBuildSpaceships = selectedPlanet?.unitBuild.spaceships.activeBuild
1✔
83
  const activeBuildDefenses = selectedPlanet?.unitBuild.defenses.activeBuild
1✔
84

85
  const buildTroopsQueue = useMemo(
1✔
86
    () => selectedPlanet?.unitBuild.troops.queue || [],
1✔
87
    [selectedPlanet]
88
  )
89
  const buildSpaceshipsQueue = useMemo(
1✔
90
    () => selectedPlanet?.unitBuild.spaceships.queue || [],
1✔
91
    [selectedPlanet]
92
  )
93
  const buildDefensesQueue = useMemo(
1✔
94
    () => selectedPlanet?.unitBuild.defenses.queue || [],
1✔
95
    [selectedPlanet]
96
  )
97

98
  const executeBuildTroopsTaskAt = activeBuildTroops?.executeTaskAt || 0
1✔
99
  const executeBuildSpaceshipsTaskAt = activeBuildSpaceships?.executeTaskAt || 0
1✔
100
  const executeBuildDefensesTaskAt = activeBuildDefenses?.executeTaskAt || 0
1✔
101

102
  const updateBuildTroopsCountdown = useCallback(async () => {
1✔
103
    if (executeBuildTroopsTaskAt) {
1!
NEW
104
      const countdown = (executeBuildTroopsTaskAt - getSecond(Date.now())) / 1_000
×
NEW
105
      const activeBuildTroopsCountdown = countdown < 0 ? 0 : countdown
×
NEW
106
      setActiveBuildTroopsCountdown(activeBuildTroopsCountdown)
×
107

NEW
108
      const isBuildTroopsFinished = activeBuildTroopsCountdown === 0
×
NEW
109
      if (isBuildTroopsFinished && activeBuildTroops) {
×
NEW
110
        await waitTaskToFinish(activeBuildTroops.taskId)
×
NEW
111
        await loadPlayer()
×
112
      }
113
    }
114
  }, [executeBuildTroopsTaskAt, loadPlayer, activeBuildTroops])
115

116
  usePolling(updateBuildTroopsCountdown)
1✔
117

118
  const updateBuildSpaceshipsCountdown = useCallback(async () => {
1✔
119
    if (executeBuildSpaceshipsTaskAt) {
1!
NEW
120
      const countdown = (executeBuildSpaceshipsTaskAt - getSecond(Date.now())) / 1_000
×
NEW
121
      const activeBuildSpaceshipsCountdown = countdown < 0 ? 0 : countdown
×
NEW
122
      setActiveBuildSpaceshipsCountdown(activeBuildSpaceshipsCountdown)
×
123

NEW
124
      const isBuildSpaceshipsFinished = activeBuildSpaceshipsCountdown === 0
×
NEW
125
      if (isBuildSpaceshipsFinished && activeBuildSpaceships) {
×
NEW
126
        await waitTaskToFinish(activeBuildSpaceships.taskId)
×
NEW
127
        await loadPlayer()
×
128
      }
129
    }
130
  }, [executeBuildSpaceshipsTaskAt, loadPlayer, activeBuildSpaceships])
131

132
  usePolling(updateBuildSpaceshipsCountdown)
1✔
133

134
  const updateBuildDefensesCountdown = useCallback(async () => {
1✔
135
    if (executeBuildDefensesTaskAt) {
1!
NEW
136
      const countdown = (executeBuildDefensesTaskAt - getSecond(Date.now())) / 1_000
×
NEW
137
      const activeBuildDefensesCountdown = countdown < 0 ? 0 : countdown
×
NEW
138
      setActiveBuildDefensesCountdown(activeBuildDefensesCountdown)
×
139

NEW
140
      const isBuildDefensesFinished = activeBuildDefensesCountdown === 0
×
NEW
141
      if (isBuildDefensesFinished && activeBuildDefenses) {
×
NEW
142
        await waitTaskToFinish(activeBuildDefenses.taskId)
×
NEW
143
        await loadPlayer()
×
144
      }
145
    }
146
  }, [executeBuildDefensesTaskAt, loadPlayer, activeBuildDefenses])
147

148
  usePolling(updateBuildDefensesCountdown)
1✔
149

150
  const isBuildUnitsLoading =
151
    isPlayerLoading ||
1!
152
    (activeBuildTroops
×
153
      ? activeBuildTroopsCountdown === 0 && buildTroopsQueue.length > 0
×
154
      : buildTroopsQueue.length > 0) ||
155
    (activeBuildSpaceships
×
156
      ? activeBuildSpaceshipsCountdown === 0 && buildSpaceshipsQueue.length > 0
×
157
      : buildSpaceshipsQueue.length > 0) ||
158
    (activeBuildDefenses
×
159
      ? activeBuildDefensesCountdown === 0 && buildDefensesQueue.length > 0
×
160
      : buildDefensesQueue.length > 0)
161

162
  const starBuildUnits = useCallback(
1✔
163
    async (unitName: string, amount: number) => {
164
      const {
165
        data: { task }
NEW
166
      } = await startBuildUnitsEndpoint(
×
167
        unitName,
168
        amount,
169
        selectedPlanet!.coordinates,
170
        selectedUniverse!.name
171
      )
NEW
172
      await waitTaskToStart(task.taskId)
×
NEW
173
      await loadPlayer()
×
174
    },
175
    [selectedUniverse, loadPlayer, selectedPlanet]
176
  )
177

178
  const updateBuildUnitsQueue = useCallback(
1✔
179
    async (unitName: string, amount: number, unitType: UnitTypes) => {
NEW
180
      const queues = {
×
181
        TROOP: buildTroopsQueue,
182
        SPACESHIP: buildSpaceshipsQueue,
183
        DEFENSE: buildDefensesQueue
184
      }
185

NEW
186
      const newBuildUnitsQueue = [...queues[unitType], { unitName, amount }]
×
NEW
187
      await updateBuildUnitsQueueEndpoint(
×
188
        newBuildUnitsQueue,
189
        selectedPlanet!.coordinates,
190
        unitType,
191
        selectedUniverse!.name
192
      )
NEW
193
      await loadPlayer()
×
194
    },
195
    [
196
      buildTroopsQueue,
197
      buildDefensesQueue,
198
      buildSpaceshipsQueue,
199
      selectedUniverse,
200
      selectedPlanet,
201
      loadPlayer
202
    ]
203
  )
204

205
  const removeBuildUnitsFromQueue = useCallback(
1✔
206
    async (index: number, unitType: UnitTypes) => {
NEW
207
      const queues = {
×
208
        TROOP: buildTroopsQueue,
209
        SPACESHIP: buildSpaceshipsQueue,
210
        DEFENSE: buildDefensesQueue
211
      }
212

NEW
213
      const newPlayerQueue = [
×
214
        ...queues[unitType].slice(0, index),
215
        ...queues[unitType].slice(index + 1)
216
      ]
NEW
217
      await updateBuildUnitsQueueEndpoint(
×
218
        newPlayerQueue,
219
        selectedPlanet!.coordinates,
220
        unitType,
221
        selectedUniverse!.name
222
      )
NEW
223
      await loadPlayer()
×
224
    },
225
    [
226
      buildTroopsQueue,
227
      buildDefensesQueue,
228
      buildSpaceshipsQueue,
229
      selectedUniverse,
230
      selectedPlanet,
231
      loadPlayer
232
    ]
233
  )
234

235
  // TODO: create scheduleBuildUnits
236
  // TODO: create cancelBuildUnits
237

238
  // TODO: create reorderBuildUnits Queue
239

240
  // TODO: include HERE the BuildUnits QUEUE logic ?
241

242
  const value = {
1✔
243
    activeBuildTroopsCountdown,
244
    activeBuildSpaceshipsCountdown,
245
    activeBuildDefensesCountdown,
246

247
    activeBuildTroops,
248
    activeBuildSpaceships,
249
    activeBuildDefenses,
250

251
    buildTroopsQueue,
252
    buildSpaceshipsQueue,
253
    buildDefensesQueue,
254

255
    isBuildUnitsLoading,
256

257
    starBuildUnits,
258
    updateBuildUnitsQueue,
259
    removeBuildUnitsFromQueue
260
  }
261

262
  return <buildUnitsContext.Provider value={value}>{children}</buildUnitsContext.Provider>
1✔
263
}
264

265
export { useBuildUnits, BuildUnitsProvider }
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc