refactor(web): use last-seen-tick comparison for slideout listener

Replace the boolean "skip first render" ref with a ref that stores the
previously-seen tick value. The effect now compares against the stored
value and only fires when it differs, which makes the dependency
naturally used (removes the `void slideoutOpenedTick;` acknowledgement)
and self-documents the intent of the guard.

Behavior is unchanged — both forms preserve the one-shot-per-event
semantics of the prior window-event implementation. The JSDoc on
`slideoutOpenedTickAtom` is updated to describe the new pattern.
This commit is contained in:
suryo12 2026-05-24 18:13:36 +07:00
parent ddae506631
commit d571cb23fa
2 changed files with 11 additions and 9 deletions

View file

@ -479,14 +479,14 @@ const Composer: FC = () => {
}, [isDesktop, showDocumentPopover, showPromptPicker, threadId]);
// Close document picker when a sidebar slide-out panel (inbox, etc.) opens.
// React only on changes to the tick — comparing against the previously-seen
// value preserves the one-shot semantics of the prior window-event approach
// (no retroactive close on mount if a panel had already opened earlier).
const slideoutOpenedTick = useAtomValue(slideoutOpenedTickAtom);
const isFirstSlideoutTickRef = useRef(true);
const lastSeenSlideoutTickRef = useRef(slideoutOpenedTick);
useEffect(() => {
void slideoutOpenedTick;
if (isFirstSlideoutTickRef.current) {
isFirstSlideoutTickRef.current = false;
return;
}
if (lastSeenSlideoutTickRef.current === slideoutOpenedTick) return;
lastSeenSlideoutTickRef.current = slideoutOpenedTick;
setShowDocumentPopover(false);
setMentionQuery("");
}, [slideoutOpenedTick]);

View file

@ -2,8 +2,10 @@ import { atom } from "jotai";
/**
* Tick counter that increments each time a sidebar slide-out panel opens.
* Consumers read this with `useAtomValue` and react to it changing guard
* the initial render with a ref so the effect only fires on subsequent
* opens, matching the one-shot semantics of the previous window event.
* Consumers read this with `useAtomValue` and store the last-seen value in
* a ref so the effect fires only when the tick changes. This preserves the
* one-shot semantics of the previous window-event implementation: a
* subscriber that mounts after a panel has already opened does not
* retroactively re-trigger.
*/
export const slideoutOpenedTickAtom = atom(0);