Skip to content

Commit cd6029b

Browse files
committed
add force push next toast functional
1 parent 05a8620 commit cd6029b

File tree

2 files changed

+76
-34
lines changed

2 files changed

+76
-34
lines changed

src/types/index.ts

+12
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@ export type ToastOptions = {
1919
* Default value: `success`
2020
*/
2121
type?: ToastType;
22+
/**
23+
* Use it when need to force hide current toaster and show next with animation.
24+
* Use for overshow toast
25+
* Default value: '250' ms
26+
*/
27+
showNextToastAfter?: number;
28+
/**
29+
* Use it when need to force hide current toaster and show next with animation.
30+
* When `true`, the visible Toast force hides and shows a next after showNextToastAfter ms Toast with next props.
31+
* Default value: 'false'
32+
*/
33+
forceOverride?: boolean;
2234
/**
2335
* Toast position.
2436
* Default value: `top`

src/useToast.ts

+64-34
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export const DEFAULT_DATA: ToastData = {
1313

1414
export const DEFAULT_OPTIONS: Required<ToastOptions> = {
1515
type: 'success',
16+
showNextToastAfter: 250,
17+
forceOverride: false,
1618
position: 'top',
1719
autoHide: true,
1820
visibilityTime: 4000,
@@ -59,49 +61,77 @@ export function useToast({ defaultOptions }: UseToastParams) {
5961
options.onHide();
6062
}, [clearTimer, log, options]);
6163

62-
const show = React.useCallback(
63-
(params: ToastShowParams) => {
64-
log(`Showing with params: ${JSON.stringify(params)}`);
64+
const showNextToaster = React.useCallback((params: ToastShowParams) => {
6565
const {
66-
text1 = DEFAULT_DATA.text1,
67-
text2 = DEFAULT_DATA.text2,
68-
type = initialOptions.type,
69-
position = initialOptions.position,
70-
autoHide = initialOptions.autoHide,
71-
visibilityTime = initialOptions.visibilityTime,
72-
topOffset = initialOptions.topOffset,
73-
bottomOffset = initialOptions.bottomOffset,
74-
keyboardOffset = initialOptions.keyboardOffset,
75-
onShow = initialOptions.onShow,
76-
onHide = initialOptions.onHide,
77-
onPress = initialOptions.onPress,
78-
props = initialOptions.props
66+
text1 = DEFAULT_DATA.text1,
67+
text2 = DEFAULT_DATA.text2,
68+
type = initialOptions.type,
69+
position = initialOptions.position,
70+
autoHide = initialOptions.autoHide,
71+
visibilityTime = initialOptions.visibilityTime,
72+
topOffset = initialOptions.topOffset,
73+
bottomOffset = initialOptions.bottomOffset,
74+
keyboardOffset = initialOptions.keyboardOffset,
75+
onShow = initialOptions.onShow,
76+
onHide = initialOptions.onHide,
77+
onPress = initialOptions.onPress,
78+
props = initialOptions.props
7979
} = params;
80+
8081
setData({
81-
text1,
82-
text2
82+
text1,
83+
text2
8384
});
8485
setOptions(
85-
mergeIfDefined(initialOptions, {
86-
type,
87-
position,
88-
autoHide,
89-
visibilityTime,
90-
topOffset,
91-
bottomOffset,
92-
keyboardOffset,
93-
onShow,
94-
onHide,
95-
onPress,
96-
props
97-
}) as Required<ToastOptions>
86+
mergeIfDefined(initialOptions, {
87+
type,
88+
position,
89+
autoHide,
90+
visibilityTime,
91+
topOffset,
92+
bottomOffset,
93+
keyboardOffset,
94+
onShow,
95+
onHide,
96+
onPress,
97+
props
98+
}) as Required<ToastOptions>
9899
);
100+
101+
}, [initialOptions])
102+
103+
const show = React.useCallback(
104+
(params: ToastShowParams) => {
105+
log(`Showing with params: ${JSON.stringify(params)}`);
106+
const {
107+
forceOverride = initialOptions.forceOverride,
108+
showNextToastAfter = initialOptions.showNextToastAfter,
109+
onShow = initialOptions.onShow,
110+
} = params;
111+
99112
// TODO: validate input
100113
// TODO: use a queue when Toast is already visible
101-
setIsVisible(true);
102-
onShow();
114+
115+
if (forceOverride) {
116+
if (isVisible) {
117+
hide();
118+
setTimeout(() => {
119+
showNextToaster(params);
120+
setIsVisible(true);
121+
onShow();
122+
}, showNextToastAfter)
123+
} else {
124+
showNextToaster(params);
125+
setIsVisible(true);
126+
onShow();
127+
}
128+
} else {
129+
showNextToaster(params);
130+
setIsVisible(true);
131+
onShow();
132+
}
103133
},
104-
[initialOptions, log]
134+
[hide, initialOptions.forceOverride, initialOptions.onShow, initialOptions.showNextToastAfter, isVisible, log, showNextToaster]
105135
);
106136

107137
React.useEffect(() => {

0 commit comments

Comments
 (0)