fix(slack): restore debounced initial reaction

This commit is contained in:
Frank Yang
2026-03-29 15:22:46 +08:00
parent e5d548f9b0
commit fc60229755
2 changed files with 29 additions and 2 deletions

View File

@@ -117,6 +117,33 @@ describe("Slack status reaction lifecycle", () => {
expect(active.has(DEFAULT_EMOJIS.stallHard)).toBe(false);
});
it("restoreInitial still applies initial emoji when it is only debounced", async () => {
const { adapter, active } = createSlackMockAdapter();
const ctrl = createStatusReactionController({
enabled: true,
adapter,
initialEmoji: "eyes",
emojis: { thinking: "eyes" },
timing: { debounceMs: 20, stallSoftMs: 99999, stallHardMs: 99999 },
});
void ctrl.setQueued();
await vi.advanceTimersByTimeAsync(1);
expect(active.has("eyes")).toBe(true);
void ctrl.setTool("web_search");
await vi.advanceTimersByTimeAsync(25);
expect(active.has(DEFAULT_EMOJIS.web)).toBe(true);
expect(active.has("eyes")).toBe(false);
void ctrl.setThinking();
await ctrl.restoreInitial();
expect(active.has("eyes")).toBe(true);
expect(active.has(DEFAULT_EMOJIS.web)).toBe(false);
expect(adapter.setReaction).toHaveBeenCalledTimes(3);
});
it("does nothing when disabled", async () => {
const { adapter, active } = createSlackMockAdapter();
const ctrl = createStatusReactionController({

View File

@@ -380,9 +380,9 @@ export function createStatusReactionController(params: {
}
const alreadyInitial = currentEmoji === initialEmoji;
const initialAlreadyPending = pendingEmoji === initialEmoji;
const initialAlreadyQueuedImmediately = pendingEmoji === initialEmoji && debounceTimer === null;
clearAllTimers();
if (alreadyInitial || initialAlreadyPending) {
if (alreadyInitial || initialAlreadyQueuedImmediately) {
pendingEmoji = "";
return;
}