@@ -2,7 +2,7 @@ import {createLogger} from '@alwatr/logger';
2
2
import { parseDuration } from '@alwatr/parse-duration' ;
3
3
import { waitForTimeout } from '@alwatr/wait' ;
4
4
5
- import { snackbarActionButtonClickedSignal , snackbarSignal } from './signal.js' ;
5
+ import { snackbarActionButtonClickedSignal , snackbarCloseButtonClickedSignal , snackbarSignal } from './signal.js' ;
6
6
7
7
import type { SnackbarElement } from './element.js' ;
8
8
import type { SnackbarActionHandler , SnackbarOptions } from './type.js' ;
@@ -19,6 +19,11 @@ let closeLastSnackbar: (() => Promise<void>) | null = null;
19
19
*/
20
20
let unsubscribeActionButtonHandler : ( ( ) => void ) | null = null ;
21
21
22
+ /**
23
+ * Store the function to unsubscribe the close button handler after close or action button clicked.
24
+ */
25
+ let unsubscribeCloseButtonHandler : ( ( ) => void ) | null = null ;
26
+
22
27
/**
23
28
* Create snackbar element with given options.
24
29
*
@@ -47,16 +52,20 @@ function createSnackbarElement(options: SnackbarOptions): SnackbarElement {
47
52
* @param handler - Handler to be called when the action button is clicked.
48
53
*/
49
54
function handleActionButtonClick ( closeSnackbar : ( ) => Promise < void > , handler ?: SnackbarActionHandler ) : void {
55
+ logger . logMethod ?.( 'handleActionButtonClick' ) ;
56
+
50
57
const actionButtonClickHandler = async ( ) => {
51
58
logger . logOther ?.( 'Snackbar action button clicked.' ) ;
52
59
53
60
await handler ?.( ) ;
54
61
return closeSnackbar ( ) ;
55
62
} ;
56
63
57
- // Subscribe to the action button click
64
+ /**
65
+ * Store the function to unsubscribe the action button handler after close or action button clicked.
66
+ */
58
67
unsubscribeActionButtonHandler = snackbarActionButtonClickedSignal . subscribe ( actionButtonClickHandler . bind ( null ) , {
59
- once : true ,
68
+ // once: true, // not work!
60
69
} ) . unsubscribe ;
61
70
}
62
71
@@ -80,13 +89,19 @@ async function showSnackbar(options: SnackbarOptions): Promise<void> {
80
89
81
90
await element . close ( ) ;
82
91
unsubscribeActionButtonHandler ?.( ) ;
92
+ unsubscribeCloseButtonHandler ?.( ) ;
93
+
83
94
closed = true ;
84
95
} ;
85
96
86
97
if ( options . action != null ) {
87
98
handleActionButtonClick ( closeSnackbar , options . action . handler ) ;
88
99
}
89
100
101
+ if ( options . addCloseButton === true ) {
102
+ unsubscribeCloseButtonHandler = snackbarCloseButtonClickedSignal . subscribe ( closeSnackbar . bind ( null ) ) . unsubscribe ;
103
+ }
104
+
90
105
// Close the last snackbar if it exists
91
106
await closeLastSnackbar ?.( ) ;
92
107
closeLastSnackbar = closeSnackbar ;
0 commit comments