github-issue-tower-defence-management 2.5.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>TDPM Console</title>
7
- <script type="module" crossorigin src="/assets/index-C5cOzhyn.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-CaxYBHiT.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-CLHvrafO.css">
9
9
  </head>
10
10
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "2.5.0",
3
+ "version": "2.5.1",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -486,4 +486,144 @@ describe('useConsoleOperations', () => {
486
486
  ).rejects.toThrow();
487
487
  expect(callCount).toBe(1);
488
488
  });
489
+
490
+ it('marks setStatus overlay done before the API call resolves', async () => {
491
+ let resolveApi!: () => void;
492
+ global.fetch = jest.fn(
493
+ () =>
494
+ new Promise<Response>((resolve) => {
495
+ resolveApi = () =>
496
+ resolve({
497
+ ok: true,
498
+ status: 200,
499
+ json: async () => ({ ok: true }),
500
+ } as unknown as Response);
501
+ }),
502
+ ) as unknown as typeof fetch;
503
+ const { result } = setup();
504
+ const option = consoleStatusOptionsFixture[1];
505
+
506
+ act(() => {
507
+ void result.current.operations.setStatus(issueItem, option);
508
+ });
509
+
510
+ const stored = JSON.parse(
511
+ localStorage.getItem(overlayStorageKey('acme')) ?? '{}',
512
+ );
513
+ expect(stored[issueItem.projectItemId]?.done).toBe(true);
514
+
515
+ await act(async () => {
516
+ resolveApi();
517
+ await Promise.resolve();
518
+ });
519
+ });
520
+
521
+ it('marks reviewPullRequest overlay done before the API call resolves', async () => {
522
+ let resolveApi!: () => void;
523
+ global.fetch = jest.fn(
524
+ () =>
525
+ new Promise<Response>((resolve) => {
526
+ resolveApi = () =>
527
+ resolve({
528
+ ok: true,
529
+ status: 200,
530
+ json: async () => ({ ok: true }),
531
+ } as unknown as Response);
532
+ }),
533
+ ) as unknown as typeof fetch;
534
+ const { result } = setup();
535
+
536
+ act(() => {
537
+ void result.current.operations.reviewPullRequest(
538
+ prItem,
539
+ prItem.url,
540
+ 'approve_and_merge',
541
+ );
542
+ });
543
+
544
+ const stored = JSON.parse(
545
+ localStorage.getItem(overlayStorageKey('acme')) ?? '{}',
546
+ );
547
+ expect(stored[prItem.projectItemId]?.done).toBe(true);
548
+
549
+ await act(async () => {
550
+ resolveApi();
551
+ await Promise.resolve();
552
+ });
553
+ });
554
+
555
+ it('marks closeIssue overlay done before the API call resolves', async () => {
556
+ let resolveApi!: () => void;
557
+ global.fetch = jest.fn(
558
+ () =>
559
+ new Promise<Response>((resolve) => {
560
+ resolveApi = () =>
561
+ resolve({
562
+ ok: true,
563
+ status: 200,
564
+ json: async () => ({ ok: true }),
565
+ } as unknown as Response);
566
+ }),
567
+ ) as unknown as typeof fetch;
568
+ const { result } = setup();
569
+
570
+ act(() => {
571
+ void result.current.operations.closeIssue(issueItem, 'close_not_planned');
572
+ });
573
+
574
+ const stored = JSON.parse(
575
+ localStorage.getItem(overlayStorageKey('acme')) ?? '{}',
576
+ );
577
+ expect(stored[issueItem.projectItemId]?.done).toBe(true);
578
+
579
+ await act(async () => {
580
+ resolveApi();
581
+ await Promise.resolve();
582
+ });
583
+ });
584
+
585
+ it('marks okAndMoveToAwaitingWorkspace overlay done before API calls resolve', async () => {
586
+ let resolveApi!: () => void;
587
+ global.fetch = jest.fn(
588
+ () =>
589
+ new Promise<Response>((resolve) => {
590
+ resolveApi = () =>
591
+ resolve({
592
+ ok: true,
593
+ status: 200,
594
+ json: async () => ({
595
+ ok: true,
596
+ comment: {
597
+ author: 'bot',
598
+ body: 'ok',
599
+ createdAt: '2026-01-01T00:00:00Z',
600
+ },
601
+ }),
602
+ } as unknown as Response);
603
+ }),
604
+ ) as unknown as typeof fetch;
605
+ const { result } = setup();
606
+ const [option] = consoleStatusOptionsFixture.filter(
607
+ (o) => o.name.toLowerCase() === 'awaiting workspace',
608
+ );
609
+
610
+ act(() => {
611
+ void result.current.operations.okAndMoveToAwaitingWorkspace(
612
+ issueItem,
613
+ option,
614
+ );
615
+ });
616
+
617
+ const stored = JSON.parse(
618
+ localStorage.getItem(overlayStorageKey('acme')) ?? '{}',
619
+ );
620
+ expect(stored[issueItem.projectItemId]?.done).toBe(true);
621
+
622
+ await act(async () => {
623
+ resolveApi();
624
+ await Promise.resolve();
625
+ resolveApi();
626
+ await Promise.resolve();
627
+ });
628
+ });
489
629
  });
@@ -154,10 +154,9 @@ export const useConsoleOperations = (
154
154
 
155
155
  const markDone = useCallback(
156
156
  (item: ConsoleListItem) => {
157
- invalidateItemContent(item);
158
157
  patchOverlay(overlayKeyForItem(item), { done: true }, mode);
159
158
  },
160
- [invalidateItemContent, patchOverlay, mode],
159
+ [patchOverlay, mode],
161
160
  );
162
161
 
163
162
  const reviewPullRequest = useCallback(
@@ -170,13 +169,14 @@ export const useConsoleOperations = (
170
169
  if (pjcode === null) {
171
170
  throw missingPjcodeError();
172
171
  }
172
+ markDone(item);
173
173
  await postConsoleOperation(
174
174
  REVIEW_OPERATION_PATH,
175
175
  reviewRequest(pjcode, item, prUrl, action, pendingReviewComments),
176
176
  );
177
- markDone(item);
177
+ invalidateItemContent(item);
178
178
  },
179
- [pjcode, markDone],
179
+ [pjcode, markDone, invalidateItemContent],
180
180
  );
181
181
 
182
182
  const setNextActionDate = useCallback(
@@ -190,10 +190,11 @@ export const useConsoleOperations = (
190
190
  issueUrl: item.url,
191
191
  projectItemId: item.projectItemId,
192
192
  };
193
- await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
194
193
  markDone(item);
194
+ await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
195
+ invalidateItemContent(item);
195
196
  },
196
- [pjcode, markDone],
197
+ [pjcode, markDone, invalidateItemContent],
197
198
  );
198
199
 
199
200
  const setStory = useCallback(
@@ -208,13 +209,13 @@ export const useConsoleOperations = (
208
209
  projectItemId: item.projectItemId,
209
210
  storyOptionId: option.id,
210
211
  };
211
- await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
212
- invalidateItemContent(item);
213
212
  patchOverlay(
214
213
  overlayKeyForItem(item),
215
214
  { done: true, story: { name: option.name, color: option.color } },
216
215
  mode,
217
216
  );
217
+ await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
218
+ invalidateItemContent(item);
218
219
  },
219
220
  [pjcode, invalidateItemContent, patchOverlay, mode],
220
221
  );
@@ -231,13 +232,13 @@ export const useConsoleOperations = (
231
232
  projectItemId: item.projectItemId,
232
233
  statusName: option.name,
233
234
  };
234
- await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
235
- invalidateItemContent(item);
236
235
  patchOverlay(
237
236
  overlayKeyForItem(item),
238
237
  { done: true, status: { name: option.name, color: option.color } },
239
238
  mode,
240
239
  );
240
+ await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
241
+ invalidateItemContent(item);
241
242
  },
242
243
  [pjcode, invalidateItemContent, patchOverlay, mode],
243
244
  );
@@ -253,13 +254,13 @@ export const useConsoleOperations = (
253
254
  issueUrl: item.url,
254
255
  projectItemId: item.projectItemId,
255
256
  };
256
- await postConsoleOperation(INTMUX_OPERATION_PATH, request);
257
- invalidateItemContent(item);
258
257
  patchOverlay(
259
258
  overlayKeyForItem(item),
260
259
  { done: true, status: { name: option.name, color: option.color } },
261
260
  mode,
262
261
  );
262
+ await postConsoleOperation(INTMUX_OPERATION_PATH, request);
263
+ invalidateItemContent(item);
263
264
  },
264
265
  [pjcode, invalidateItemContent, patchOverlay, mode],
265
266
  );
@@ -275,10 +276,11 @@ export const useConsoleOperations = (
275
276
  issueUrl: item.url,
276
277
  projectItemId: item.projectItemId,
277
278
  };
278
- await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
279
279
  markDone(item);
280
+ await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
281
+ invalidateItemContent(item);
280
282
  },
281
- [pjcode, markDone],
283
+ [pjcode, markDone, invalidateItemContent],
282
284
  );
283
285
 
284
286
  const okAndMoveToAwaitingWorkspace = useCallback(
@@ -286,6 +288,11 @@ export const useConsoleOperations = (
286
288
  if (pjcode === null) {
287
289
  throw missingPjcodeError();
288
290
  }
291
+ patchOverlay(
292
+ overlayKeyForItem(item),
293
+ { done: true, status: { name: option.name, color: option.color } },
294
+ mode,
295
+ );
289
296
  await postConsoleComment({ pjcode, url: item.url, body: 'ok' });
290
297
  const request: ConsoleTriageRequest = {
291
298
  pjcode,
@@ -296,11 +303,6 @@ export const useConsoleOperations = (
296
303
  };
297
304
  await postConsoleOperation(TRIAGE_OPERATION_PATH, request);
298
305
  invalidateItemContent(item);
299
- patchOverlay(
300
- overlayKeyForItem(item),
301
- { done: true, status: { name: option.name, color: option.color } },
302
- mode,
303
- );
304
306
  },
305
307
  [pjcode, invalidateItemContent, patchOverlay, mode],
306
308
  );