Skip to content

Commit da91d49

Browse files
authored
fix(sneak/#2179): Stale sneaks shown in UI (#3542)
__Issue:__ There were some cases where stale sneaks were left in the UI. __Defect:__ There are some cases where the `Hooks.effect(OnMountAndIf)` doesn't seem to be calling the disposal handler. __Fix:__ Collect the sneaks every render, ensuring we have the latest sneakable elements when sneak is opened. Fixes #2568 Fixes #2179
1 parent 4186b76 commit da91d49

File tree

3 files changed

+22
-21
lines changed

3 files changed

+22
-21
lines changed

src/Feature/Sneak/Feature_Sneak.re

+16-20
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ module Registry = {
149149
id;
150150
};
151151

152-
let unregister = id => {
153-
let filter = sneakInfo => sneakInfo.id !== id;
154-
MutableState.singleton := List.filter(filter, MutableState.singleton^);
152+
let reset = () => {
153+
MutableState.nextId := 0;
154+
MutableState.singleton := [];
155155
};
156156

157157
let getSneaks = () => {
@@ -247,6 +247,8 @@ module View = {
247247
open Revery.UI;
248248
open Revery.UI.Components;
249249

250+
let reset = Registry.reset;
251+
250252
module Colors = Feature_Theme.Colors;
251253

252254
module Constants = {
@@ -333,7 +335,7 @@ module View = {
333335
(
334336
~sneakId,
335337
~style=[],
336-
~onClick=() => (),
338+
~onClick=?,
337339
~onRightClick=() => (),
338340
~onAnyClick=_ => (),
339341
~onDoubleClick=() => (),
@@ -352,25 +354,19 @@ module View = {
352354
) => {
353355
let%hook bboxRef = Hooks.ref(None);
354356

355-
let%hook () =
356-
Hooks.effect(
357-
OnMountAndIf((!=), sneakId),
358-
() => {
359-
let maybeId =
360-
switch (onSneak) {
361-
| Some(cb) => Some(Registry.register(bboxRef, cb))
362-
| None => Some(Registry.register(bboxRef, onClick))
363-
};
364-
365-
Some(
366-
() => {maybeId |> Option.iter(id => Registry.unregister(id))},
367-
);
368-
},
369-
);
357+
ignore(sneakId);
358+
359+
switch (onSneak, onClick) {
360+
| (Some(sneakCallback), _) =>
361+
ignore(Registry.register(bboxRef, sneakCallback): int)
362+
| (None, Some(clickCallback)) =>
363+
ignore(Registry.register(bboxRef, clickCallback): int)
364+
| _ => ()
365+
};
370366

371367
<Clickable
372368
style
373-
onClick
369+
?onClick
374370
onRightClick
375371
onAnyClick
376372
onDoubleClick

src/Feature/Sneak/Feature_Sneak.rei

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type outmsg =
3939
let update: (model, msg) => (model, outmsg);
4040

4141
module View: {
42+
let reset: unit => unit;
4243
module Sneakable: {
4344
let make:
4445
(

src/bin_editor/Oni2_editor.re

+5-1
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,11 @@ switch (eff) {
390390
let uiDispatch = ref(_ => ());
391391

392392
let update =
393-
UI.start(window, <Root state=currentState^ dispatch=uiDispatch^ />);
393+
UI.start(
394+
~onBeforeRender=() => Feature_Sneak.View.reset(),
395+
window,
396+
<Root state=currentState^ dispatch=uiDispatch^ />,
397+
);
394398

395399
let setTitle = title => {
396400
Window.setTitle(window, title);

0 commit comments

Comments
 (0)