@@ -23,8 +23,9 @@ type SnackBarAttrs = {
23
23
message : MaybeTranslation
24
24
button : ButtonAttrs | null
25
25
dismissButton ?: IconButtonAttrs
26
+ onHoverChange : ( hovered : boolean ) => void
26
27
}
27
- type QueueItem = SnackBarAttrs & {
28
+ type QueueItem = Omit < SnackBarAttrs , "onHoverChange" > & {
28
29
onClose : ( ( timedOut : boolean ) => unknown ) | null
29
30
onShow : ( ( ) => unknown ) | null
30
31
doCancel : { cancel : ( ) => unknown }
@@ -38,11 +39,22 @@ let cancelCurrentSnackbar: (() => unknown) | null = null
38
39
class SnackBar implements Component < SnackBarAttrs > {
39
40
view ( vnode : Vnode < SnackBarAttrs > ) {
40
41
// use same padding as MinimizedEditor
41
- return m ( ".snackbar-content.flex.flex-space-between.border-radius.plr.pb-xs.pt-xs" , [
42
- m ( ".flex.center-vertically.smaller" , lang . getTranslationText ( vnode . attrs . message ) ) ,
43
- vnode . attrs . button ? m ( ".flex-end.center-vertically.pl" , m ( Button , vnode . attrs . button ) ) : null ,
44
- vnode . attrs . dismissButton ? m ( ".flex.items-center.justify-right" , [ m ( IconButton , vnode . attrs . dismissButton ) ] ) : null ,
45
- ] )
42
+ return m (
43
+ ".snackbar-content.flex.flex-space-between.border-radius.plr.pb-xs.pt-xs.content-hover" ,
44
+ {
45
+ onmouseenter : ( ) => {
46
+ vnode . attrs . onHoverChange ( true )
47
+ } ,
48
+ onmouseleave : ( ) => {
49
+ vnode . attrs . onHoverChange ( false )
50
+ } ,
51
+ } ,
52
+ [
53
+ m ( ".flex.center-vertically.smaller" , lang . getTranslationText ( vnode . attrs . message ) ) ,
54
+ vnode . attrs . button ? m ( ".flex-end.center-vertically.pl" , m ( Button , vnode . attrs . button ) ) : null ,
55
+ vnode . attrs . dismissButton ? m ( ".flex.items-center.justify-right" , [ m ( IconButton , vnode . attrs . dismissButton ) ] ) : null ,
56
+ ] ,
57
+ )
46
58
}
47
59
}
48
60
@@ -161,6 +173,9 @@ function showNextNotification() {
161
173
message,
162
174
button,
163
175
dismissButton : dismissButton ,
176
+ onHoverChange : ( isHovered ) => {
177
+ hovered = isHovered
178
+ } ,
164
179
} ) ,
165
180
} ,
166
181
"slide-bottom" ,
@@ -169,8 +184,14 @@ function showNextNotification() {
169
184
)
170
185
171
186
let closed = false
187
+ let hovered = false
172
188
173
189
const closeAndOpenNext = ( timedOut : boolean ) => {
190
+ if ( timedOut && hovered ) {
191
+ debounce ( 1000 , closeAndOpenNext ) ( true )
192
+ return
193
+ }
194
+
174
195
closed = true
175
196
cancelCurrentSnackbar = null
176
197
0 commit comments