@yahoo/uds-mobile 2.16.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/fixtures/dist/index.mjs +14 -0
- package/dist/components/Toast/Toast.cjs +141 -0
- package/dist/components/Toast/Toast.d.cts +38 -0
- package/dist/components/Toast/Toast.d.cts.map +1 -0
- package/dist/components/Toast/Toast.d.ts +38 -0
- package/dist/components/Toast/Toast.d.ts.map +1 -0
- package/dist/components/Toast/Toast.js +141 -0
- package/dist/components/Toast/Toast.js.map +1 -0
- package/dist/components/Toast/ToastAnimatedItem.cjs +88 -0
- package/dist/components/Toast/ToastAnimatedItem.d.cts +27 -0
- package/dist/components/Toast/ToastAnimatedItem.d.cts.map +1 -0
- package/dist/components/Toast/ToastAnimatedItem.d.ts +27 -0
- package/dist/components/Toast/ToastAnimatedItem.d.ts.map +1 -0
- package/dist/components/Toast/ToastAnimatedItem.js +87 -0
- package/dist/components/Toast/ToastAnimatedItem.js.map +1 -0
- package/dist/components/Toast/ToastItem.cjs +35 -0
- package/dist/components/Toast/ToastItem.d.cts +25 -0
- package/dist/components/Toast/ToastItem.d.cts.map +1 -0
- package/dist/components/Toast/ToastItem.d.ts +25 -0
- package/dist/components/Toast/ToastItem.d.ts.map +1 -0
- package/dist/components/Toast/ToastItem.js +35 -0
- package/dist/components/Toast/ToastItem.js.map +1 -0
- package/dist/components/Toast/ToastProvider.cjs +144 -0
- package/dist/components/Toast/ToastProvider.d.cts +58 -0
- package/dist/components/Toast/ToastProvider.d.cts.map +1 -0
- package/dist/components/Toast/ToastProvider.d.ts +58 -0
- package/dist/components/Toast/ToastProvider.d.ts.map +1 -0
- package/dist/components/Toast/ToastProvider.js +143 -0
- package/dist/components/Toast/ToastProvider.js.map +1 -0
- package/dist/components/Toast/ToastViewport.cjs +48 -0
- package/dist/components/Toast/ToastViewport.d.cts +42 -0
- package/dist/components/Toast/ToastViewport.d.cts.map +1 -0
- package/dist/components/Toast/ToastViewport.d.ts +42 -0
- package/dist/components/Toast/ToastViewport.d.ts.map +1 -0
- package/dist/components/Toast/ToastViewport.js +48 -0
- package/dist/components/Toast/ToastViewport.js.map +1 -0
- package/dist/components/Toast/createToast.cjs +21 -0
- package/dist/components/Toast/createToast.d.cts +10 -0
- package/dist/components/Toast/createToast.d.cts.map +1 -0
- package/dist/components/Toast/createToast.d.ts +10 -0
- package/dist/components/Toast/createToast.d.ts.map +1 -0
- package/dist/components/Toast/createToast.js +20 -0
- package/dist/components/Toast/createToast.js.map +1 -0
- package/dist/components/Toast/index.cjs +10 -0
- package/dist/components/Toast/index.d.cts +6 -0
- package/dist/components/Toast/index.d.ts +6 -0
- package/dist/components/Toast/index.js +5 -0
- package/dist/components/Toast/types.cjs +1 -0
- package/dist/components/Toast/types.d.cts +113 -0
- package/dist/components/Toast/types.d.cts.map +1 -0
- package/dist/components/Toast/types.d.ts +113 -0
- package/dist/components/Toast/types.d.ts.map +1 -0
- package/dist/components/Toast/types.js +1 -0
- package/dist/components/Toast/useToastController.cjs +286 -0
- package/dist/components/Toast/useToastController.d.cts +25 -0
- package/dist/components/Toast/useToastController.d.cts.map +1 -0
- package/dist/components/Toast/useToastController.d.ts +25 -0
- package/dist/components/Toast/useToastController.d.ts.map +1 -0
- package/dist/components/Toast/useToastController.js +286 -0
- package/dist/components/Toast/useToastController.js.map +1 -0
- package/dist/components/Toast/utils.cjs +69 -0
- package/dist/components/Toast/utils.d.cts +27 -0
- package/dist/components/Toast/utils.d.cts.map +1 -0
- package/dist/components/Toast/utils.d.ts +27 -0
- package/dist/components/Toast/utils.d.ts.map +1 -0
- package/dist/components/Toast/utils.js +55 -0
- package/dist/components/Toast/utils.js.map +1 -0
- package/dist/jest/mocks/gesture-handler.cjs +38 -0
- package/dist/jest/mocks/gesture-handler.d.cts +41 -0
- package/dist/jest/mocks/gesture-handler.d.cts.map +1 -0
- package/dist/jest/mocks/gesture-handler.d.ts +41 -0
- package/dist/jest/mocks/gesture-handler.d.ts.map +1 -0
- package/dist/jest/mocks/gesture-handler.js +37 -0
- package/dist/jest/mocks/gesture-handler.js.map +1 -0
- package/dist/jest/mocks/safe-area-context.cjs +35 -0
- package/dist/jest/mocks/safe-area-context.d.cts +43 -0
- package/dist/jest/mocks/safe-area-context.d.cts.map +1 -0
- package/dist/jest/mocks/safe-area-context.d.ts +43 -0
- package/dist/jest/mocks/safe-area-context.d.ts.map +1 -0
- package/dist/jest/mocks/safe-area-context.js +32 -0
- package/dist/jest/mocks/safe-area-context.js.map +1 -0
- package/dist/jest/mocks/screens.cjs +8 -0
- package/dist/jest/mocks/screens.d.cts +12 -0
- package/dist/jest/mocks/screens.d.cts.map +1 -0
- package/dist/jest/mocks/screens.d.ts +12 -0
- package/dist/jest/mocks/screens.d.ts.map +1 -0
- package/dist/jest/mocks/screens.js +9 -0
- package/dist/jest/mocks/screens.js.map +1 -0
- package/dist/jest/mocks/styles.cjs +38 -1
- package/dist/jest/mocks/styles.d.cts +3 -2
- package/dist/jest/mocks/styles.d.cts.map +1 -1
- package/dist/jest/mocks/styles.d.ts +3 -2
- package/dist/jest/mocks/styles.d.ts.map +1 -1
- package/dist/jest/mocks/styles.js +38 -2
- package/dist/jest/mocks/styles.js.map +1 -1
- package/dist/types/dist/index.d.cts +4 -1
- package/dist/types/dist/index.d.cts.map +1 -1
- package/dist/types/dist/index.d.ts +4 -1
- package/dist/types/dist/index.d.ts.map +1 -1
- package/fonts/index.cjs +211 -211
- package/fonts/index.mjs +211 -211
- package/package.json +11 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
require("../../_virtual/_rolldown/runtime.cjs");
|
|
4
|
+
const require_components_Toast_utils = require("./utils.cjs");
|
|
5
|
+
let react = require("react");
|
|
6
|
+
//#region src/components/Toast/useToastController.ts
|
|
7
|
+
function useToastController({ autoClose, limit, placement, shouldReduceMotion }) {
|
|
8
|
+
const [toasts, baseDispatch] = (0, react.useReducer)(require_components_Toast_utils.toastReducer, []);
|
|
9
|
+
const [waitingToastCount, setWaitingToastCount] = (0, react.useState)(0);
|
|
10
|
+
const toastsRef = (0, react.useRef)(toasts);
|
|
11
|
+
const limitRef = (0, react.useRef)(limit);
|
|
12
|
+
const waitingQueueRef = (0, react.useRef)([]);
|
|
13
|
+
const timeoutRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
14
|
+
const exitTimeoutRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
|
|
15
|
+
const hideRef = (0, react.useRef)(null);
|
|
16
|
+
(0, react.useEffect)(() => {
|
|
17
|
+
toastsRef.current = toasts;
|
|
18
|
+
}, [toasts]);
|
|
19
|
+
const dispatchToastAction = (0, react.useCallback)((action) => {
|
|
20
|
+
toastsRef.current = require_components_Toast_utils.toastReducer(toastsRef.current, action);
|
|
21
|
+
baseDispatch(action);
|
|
22
|
+
}, [baseDispatch]);
|
|
23
|
+
const clearToastTimer = (0, react.useCallback)((id) => {
|
|
24
|
+
const timeout = timeoutRefs.current.get(id);
|
|
25
|
+
if (timeout) {
|
|
26
|
+
clearTimeout(timeout);
|
|
27
|
+
timeoutRefs.current.delete(id);
|
|
28
|
+
}
|
|
29
|
+
}, []);
|
|
30
|
+
const clearAllToastTimers = (0, react.useCallback)(() => {
|
|
31
|
+
timeoutRefs.current.forEach((timeout) => clearTimeout(timeout));
|
|
32
|
+
timeoutRefs.current.clear();
|
|
33
|
+
}, []);
|
|
34
|
+
const clearToastExitTimer = (0, react.useCallback)((id) => {
|
|
35
|
+
const timeout = exitTimeoutRefs.current.get(id);
|
|
36
|
+
if (timeout) {
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
exitTimeoutRefs.current.delete(id);
|
|
39
|
+
}
|
|
40
|
+
}, []);
|
|
41
|
+
const clearAllToastExitTimers = (0, react.useCallback)(() => {
|
|
42
|
+
exitTimeoutRefs.current.forEach((timeout) => clearTimeout(timeout));
|
|
43
|
+
exitTimeoutRefs.current.clear();
|
|
44
|
+
}, []);
|
|
45
|
+
const syncWaitingToastCount = (0, react.useCallback)(() => {
|
|
46
|
+
setWaitingToastCount(waitingQueueRef.current.length);
|
|
47
|
+
}, []);
|
|
48
|
+
const clearWaitingQueue = (0, react.useCallback)(() => {
|
|
49
|
+
waitingQueueRef.current = [];
|
|
50
|
+
syncWaitingToastCount();
|
|
51
|
+
}, [syncWaitingToastCount]);
|
|
52
|
+
const getQueuedToastIndex = (0, react.useCallback)((id) => waitingQueueRef.current.findIndex((toast) => toast.id === id), []);
|
|
53
|
+
const removeQueuedToast = (0, react.useCallback)((id) => {
|
|
54
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
55
|
+
if (queuedToastIndex === -1) return false;
|
|
56
|
+
waitingQueueRef.current.splice(queuedToastIndex, 1);
|
|
57
|
+
syncWaitingToastCount();
|
|
58
|
+
return true;
|
|
59
|
+
}, [getQueuedToastIndex, syncWaitingToastCount]);
|
|
60
|
+
const scheduleToast = (0, react.useCallback)((toast) => {
|
|
61
|
+
clearToastTimer(toast.id);
|
|
62
|
+
if (require_components_Toast_utils.isPersistentAutoClose(toast.autoClose)) return;
|
|
63
|
+
if (!Number.isFinite(toast.autoClose)) return;
|
|
64
|
+
if (toast.autoClose <= 0) {
|
|
65
|
+
hideRef.current?.(toast.id);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const timeout = setTimeout(() => {
|
|
69
|
+
hideRef.current?.(toast.id);
|
|
70
|
+
timeoutRefs.current.delete(toast.id);
|
|
71
|
+
}, toast.autoClose);
|
|
72
|
+
timeoutRefs.current.set(toast.id, timeout);
|
|
73
|
+
}, [clearToastTimer]);
|
|
74
|
+
const showVisibleToast = (0, react.useCallback)((toast, shouldCallOnShow) => {
|
|
75
|
+
clearToastExitTimer(toast.id);
|
|
76
|
+
removeQueuedToast(toast.id);
|
|
77
|
+
dispatchToastAction({
|
|
78
|
+
type: "upsert",
|
|
79
|
+
toast
|
|
80
|
+
});
|
|
81
|
+
if (shouldCallOnShow) toast.onShow?.();
|
|
82
|
+
scheduleToast(toast);
|
|
83
|
+
}, [
|
|
84
|
+
clearToastExitTimer,
|
|
85
|
+
dispatchToastAction,
|
|
86
|
+
removeQueuedToast,
|
|
87
|
+
scheduleToast
|
|
88
|
+
]);
|
|
89
|
+
const flushWaitingQueue = (0, react.useCallback)(() => {
|
|
90
|
+
let availableSlots = limitRef.current - toastsRef.current.length;
|
|
91
|
+
while (availableSlots > 0 && waitingQueueRef.current.length > 0) {
|
|
92
|
+
const toast = waitingQueueRef.current.shift();
|
|
93
|
+
if (toast) {
|
|
94
|
+
showVisibleToast(toast, true);
|
|
95
|
+
availableSlots -= 1;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
syncWaitingToastCount();
|
|
99
|
+
}, [showVisibleToast, syncWaitingToastCount]);
|
|
100
|
+
const removeToast = (0, react.useCallback)((id) => {
|
|
101
|
+
clearToastTimer(id);
|
|
102
|
+
clearToastExitTimer(id);
|
|
103
|
+
dispatchToastAction({
|
|
104
|
+
type: "remove",
|
|
105
|
+
id
|
|
106
|
+
});
|
|
107
|
+
flushWaitingQueue();
|
|
108
|
+
}, [
|
|
109
|
+
clearToastExitTimer,
|
|
110
|
+
clearToastTimer,
|
|
111
|
+
dispatchToastAction,
|
|
112
|
+
flushWaitingQueue
|
|
113
|
+
]);
|
|
114
|
+
const beginHideToast = (0, react.useCallback)((toast) => {
|
|
115
|
+
clearToastTimer(toast.id);
|
|
116
|
+
if (toast.isExiting) return;
|
|
117
|
+
toast.onHide?.();
|
|
118
|
+
if (shouldReduceMotion) {
|
|
119
|
+
removeToast(toast.id);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
dispatchToastAction({
|
|
123
|
+
type: "update",
|
|
124
|
+
id: toast.id,
|
|
125
|
+
toast: { isExiting: true }
|
|
126
|
+
});
|
|
127
|
+
clearToastExitTimer(toast.id);
|
|
128
|
+
const timeout = setTimeout(() => {
|
|
129
|
+
exitTimeoutRefs.current.delete(toast.id);
|
|
130
|
+
removeToast(toast.id);
|
|
131
|
+
}, 150);
|
|
132
|
+
exitTimeoutRefs.current.set(toast.id, timeout);
|
|
133
|
+
}, [
|
|
134
|
+
clearToastExitTimer,
|
|
135
|
+
clearToastTimer,
|
|
136
|
+
dispatchToastAction,
|
|
137
|
+
removeToast,
|
|
138
|
+
shouldReduceMotion
|
|
139
|
+
]);
|
|
140
|
+
const hide = (0, react.useCallback)((id) => {
|
|
141
|
+
if (id === "all") {
|
|
142
|
+
clearWaitingQueue();
|
|
143
|
+
toastsRef.current.forEach(beginHideToast);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const toastId = id ?? toastsRef.current.at(-1)?.id;
|
|
147
|
+
if (!toastId) return;
|
|
148
|
+
const toast = toastsRef.current.find((item) => item.id === toastId);
|
|
149
|
+
if (!toast) {
|
|
150
|
+
removeQueuedToast(toastId);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
beginHideToast(toast);
|
|
154
|
+
}, [
|
|
155
|
+
beginHideToast,
|
|
156
|
+
clearWaitingQueue,
|
|
157
|
+
removeQueuedToast
|
|
158
|
+
]);
|
|
159
|
+
(0, react.useEffect)(() => {
|
|
160
|
+
hideRef.current = hide;
|
|
161
|
+
}, [hide]);
|
|
162
|
+
const createToastRecord = (0, react.useCallback)((options, existingToast) => {
|
|
163
|
+
const id = options.id ?? existingToast?.id ?? require_components_Toast_utils.createToastId();
|
|
164
|
+
return {
|
|
165
|
+
...existingToast,
|
|
166
|
+
...options,
|
|
167
|
+
id,
|
|
168
|
+
size: options.size ?? existingToast?.size ?? "default",
|
|
169
|
+
variant: options.variant ?? existingToast?.variant ?? "info",
|
|
170
|
+
placement: options.placement ?? existingToast?.placement ?? placement,
|
|
171
|
+
autoClose: options.autoClose ?? existingToast?.autoClose ?? autoClose,
|
|
172
|
+
createdAt: existingToast?.createdAt ?? Date.now(),
|
|
173
|
+
closeOnAction: options.closeOnAction ?? existingToast?.closeOnAction ?? false,
|
|
174
|
+
isExiting: false
|
|
175
|
+
};
|
|
176
|
+
}, [autoClose, placement]);
|
|
177
|
+
const upsertToast = (0, react.useCallback)((toast, shouldCallOnShow) => {
|
|
178
|
+
if (toastsRef.current.find((item) => item.id === toast.id) || toastsRef.current.length < limitRef.current) {
|
|
179
|
+
showVisibleToast(toast, shouldCallOnShow);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
const queuedToastIndex = getQueuedToastIndex(toast.id);
|
|
183
|
+
if (queuedToastIndex === -1) {
|
|
184
|
+
waitingQueueRef.current.push(toast);
|
|
185
|
+
syncWaitingToastCount();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
waitingQueueRef.current[queuedToastIndex] = toast;
|
|
189
|
+
}, [
|
|
190
|
+
getQueuedToastIndex,
|
|
191
|
+
showVisibleToast,
|
|
192
|
+
syncWaitingToastCount
|
|
193
|
+
]);
|
|
194
|
+
const update = (0, react.useCallback)((id, options) => {
|
|
195
|
+
const existingToast = toastsRef.current.find((toast) => toast.id === id);
|
|
196
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
197
|
+
const queuedToast = queuedToastIndex === -1 ? void 0 : waitingQueueRef.current[queuedToastIndex];
|
|
198
|
+
upsertToast(createToastRecord({
|
|
199
|
+
...options,
|
|
200
|
+
id
|
|
201
|
+
}, existingToast ?? queuedToast), false);
|
|
202
|
+
return {
|
|
203
|
+
id,
|
|
204
|
+
update: (nextOptions) => update(id, nextOptions),
|
|
205
|
+
close: () => hide(id)
|
|
206
|
+
};
|
|
207
|
+
}, [
|
|
208
|
+
createToastRecord,
|
|
209
|
+
getQueuedToastIndex,
|
|
210
|
+
hide,
|
|
211
|
+
upsertToast
|
|
212
|
+
]);
|
|
213
|
+
const show = (0, react.useCallback)((input) => {
|
|
214
|
+
const options = require_components_Toast_utils.resolveToastInput(input);
|
|
215
|
+
const id = options.id ?? require_components_Toast_utils.createToastId();
|
|
216
|
+
const existingToast = toastsRef.current.find((toast) => toast.id === id);
|
|
217
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
218
|
+
const queuedToast = queuedToastIndex === -1 ? void 0 : waitingQueueRef.current[queuedToastIndex];
|
|
219
|
+
upsertToast(createToastRecord({
|
|
220
|
+
...options,
|
|
221
|
+
id
|
|
222
|
+
}, existingToast ?? queuedToast), true);
|
|
223
|
+
return {
|
|
224
|
+
id,
|
|
225
|
+
update: (nextOptions) => update(id, nextOptions),
|
|
226
|
+
close: () => hide(id)
|
|
227
|
+
};
|
|
228
|
+
}, [
|
|
229
|
+
createToastRecord,
|
|
230
|
+
getQueuedToastIndex,
|
|
231
|
+
hide,
|
|
232
|
+
update,
|
|
233
|
+
upsertToast
|
|
234
|
+
]);
|
|
235
|
+
const hideAll = (0, react.useCallback)(() => hide("all"), [hide]);
|
|
236
|
+
(0, react.useEffect)(() => {
|
|
237
|
+
limitRef.current = limit;
|
|
238
|
+
if (toastsRef.current.length > limit) {
|
|
239
|
+
const visibleToasts = toastsRef.current.slice(0, limit);
|
|
240
|
+
const queuedToasts = toastsRef.current.slice(limit).map((toast) => ({
|
|
241
|
+
...toast,
|
|
242
|
+
isExiting: false
|
|
243
|
+
}));
|
|
244
|
+
queuedToasts.forEach((toast) => {
|
|
245
|
+
clearToastTimer(toast.id);
|
|
246
|
+
clearToastExitTimer(toast.id);
|
|
247
|
+
});
|
|
248
|
+
waitingQueueRef.current = [...queuedToasts, ...waitingQueueRef.current];
|
|
249
|
+
syncWaitingToastCount();
|
|
250
|
+
dispatchToastAction({
|
|
251
|
+
type: "set",
|
|
252
|
+
toasts: visibleToasts
|
|
253
|
+
});
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
flushWaitingQueue();
|
|
257
|
+
}, [
|
|
258
|
+
clearToastExitTimer,
|
|
259
|
+
clearToastTimer,
|
|
260
|
+
dispatchToastAction,
|
|
261
|
+
flushWaitingQueue,
|
|
262
|
+
limit,
|
|
263
|
+
syncWaitingToastCount
|
|
264
|
+
]);
|
|
265
|
+
return {
|
|
266
|
+
clearAllToastExitTimers,
|
|
267
|
+
clearAllToastTimers,
|
|
268
|
+
controller: (0, react.useMemo)(() => ({
|
|
269
|
+
show,
|
|
270
|
+
update,
|
|
271
|
+
hide,
|
|
272
|
+
hideAll,
|
|
273
|
+
clearWaitingQueue
|
|
274
|
+
}), [
|
|
275
|
+
clearWaitingQueue,
|
|
276
|
+
hide,
|
|
277
|
+
hideAll,
|
|
278
|
+
show,
|
|
279
|
+
update
|
|
280
|
+
]),
|
|
281
|
+
toasts,
|
|
282
|
+
waitingToastCount
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
//#endregion
|
|
286
|
+
exports.useToastController = useToastController;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
import { ToastAutoClose, ToastController, ToastPlacement, ToastRecord } from "./types.cjs";
|
|
3
|
+
|
|
4
|
+
//#region src/components/Toast/useToastController.d.ts
|
|
5
|
+
interface UseToastControllerOptions {
|
|
6
|
+
autoClose: ToastAutoClose;
|
|
7
|
+
limit: number;
|
|
8
|
+
placement: ToastPlacement;
|
|
9
|
+
shouldReduceMotion: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare function useToastController({
|
|
12
|
+
autoClose,
|
|
13
|
+
limit,
|
|
14
|
+
placement,
|
|
15
|
+
shouldReduceMotion
|
|
16
|
+
}: UseToastControllerOptions): {
|
|
17
|
+
clearAllToastExitTimers: () => void;
|
|
18
|
+
clearAllToastTimers: () => void;
|
|
19
|
+
controller: ToastController;
|
|
20
|
+
toasts: ToastRecord[];
|
|
21
|
+
waitingToastCount: number;
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { useToastController };
|
|
25
|
+
//# sourceMappingURL=useToastController.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToastController.d.cts","names":[],"sources":["../../../src/components/Toast/useToastController.ts"],"mappings":";;;;UAoBU,yBAAA;EACR,SAAA,EAAW,cAAA;EACX,KAAA;EACA,SAAA,EAAW,cAAA;EACX,kBAAA;AAAA;AAAA,iBAGO,kBAAA,CAAA;EACP,SAAA;EACA,KAAA;EACA,SAAA;EACA;AAAA,GACC,yBAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
|
|
2
|
+
import { ToastAutoClose, ToastController, ToastPlacement, ToastRecord } from "./types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/components/Toast/useToastController.d.ts
|
|
5
|
+
interface UseToastControllerOptions {
|
|
6
|
+
autoClose: ToastAutoClose;
|
|
7
|
+
limit: number;
|
|
8
|
+
placement: ToastPlacement;
|
|
9
|
+
shouldReduceMotion: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare function useToastController({
|
|
12
|
+
autoClose,
|
|
13
|
+
limit,
|
|
14
|
+
placement,
|
|
15
|
+
shouldReduceMotion
|
|
16
|
+
}: UseToastControllerOptions): {
|
|
17
|
+
clearAllToastExitTimers: () => void;
|
|
18
|
+
clearAllToastTimers: () => void;
|
|
19
|
+
controller: ToastController;
|
|
20
|
+
toasts: ToastRecord[];
|
|
21
|
+
waitingToastCount: number;
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { useToastController };
|
|
25
|
+
//# sourceMappingURL=useToastController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToastController.d.ts","names":[],"sources":["../../../src/components/Toast/useToastController.ts"],"mappings":";;;;UAoBU,yBAAA;EACR,SAAA,EAAW,cAAA;EACX,KAAA;EACA,SAAA,EAAW,cAAA;EACX,kBAAA;AAAA;AAAA,iBAGO,kBAAA,CAAA;EACP,SAAA;EACA,KAAA;EACA,SAAA;EACA;AAAA,GACC,yBAAA"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/*! © 2026 Yahoo, Inc. UDS Mobile v0.0.0-development */
|
|
2
|
+
import { createToastId, isPersistentAutoClose, resolveToastInput, toastReducer } from "./utils.js";
|
|
3
|
+
import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from "react";
|
|
4
|
+
//#region src/components/Toast/useToastController.ts
|
|
5
|
+
function useToastController({ autoClose, limit, placement, shouldReduceMotion }) {
|
|
6
|
+
const [toasts, baseDispatch] = useReducer(toastReducer, []);
|
|
7
|
+
const [waitingToastCount, setWaitingToastCount] = useState(0);
|
|
8
|
+
const toastsRef = useRef(toasts);
|
|
9
|
+
const limitRef = useRef(limit);
|
|
10
|
+
const waitingQueueRef = useRef([]);
|
|
11
|
+
const timeoutRefs = useRef(/* @__PURE__ */ new Map());
|
|
12
|
+
const exitTimeoutRefs = useRef(/* @__PURE__ */ new Map());
|
|
13
|
+
const hideRef = useRef(null);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
toastsRef.current = toasts;
|
|
16
|
+
}, [toasts]);
|
|
17
|
+
const dispatchToastAction = useCallback((action) => {
|
|
18
|
+
toastsRef.current = toastReducer(toastsRef.current, action);
|
|
19
|
+
baseDispatch(action);
|
|
20
|
+
}, [baseDispatch]);
|
|
21
|
+
const clearToastTimer = useCallback((id) => {
|
|
22
|
+
const timeout = timeoutRefs.current.get(id);
|
|
23
|
+
if (timeout) {
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
timeoutRefs.current.delete(id);
|
|
26
|
+
}
|
|
27
|
+
}, []);
|
|
28
|
+
const clearAllToastTimers = useCallback(() => {
|
|
29
|
+
timeoutRefs.current.forEach((timeout) => clearTimeout(timeout));
|
|
30
|
+
timeoutRefs.current.clear();
|
|
31
|
+
}, []);
|
|
32
|
+
const clearToastExitTimer = useCallback((id) => {
|
|
33
|
+
const timeout = exitTimeoutRefs.current.get(id);
|
|
34
|
+
if (timeout) {
|
|
35
|
+
clearTimeout(timeout);
|
|
36
|
+
exitTimeoutRefs.current.delete(id);
|
|
37
|
+
}
|
|
38
|
+
}, []);
|
|
39
|
+
const clearAllToastExitTimers = useCallback(() => {
|
|
40
|
+
exitTimeoutRefs.current.forEach((timeout) => clearTimeout(timeout));
|
|
41
|
+
exitTimeoutRefs.current.clear();
|
|
42
|
+
}, []);
|
|
43
|
+
const syncWaitingToastCount = useCallback(() => {
|
|
44
|
+
setWaitingToastCount(waitingQueueRef.current.length);
|
|
45
|
+
}, []);
|
|
46
|
+
const clearWaitingQueue = useCallback(() => {
|
|
47
|
+
waitingQueueRef.current = [];
|
|
48
|
+
syncWaitingToastCount();
|
|
49
|
+
}, [syncWaitingToastCount]);
|
|
50
|
+
const getQueuedToastIndex = useCallback((id) => waitingQueueRef.current.findIndex((toast) => toast.id === id), []);
|
|
51
|
+
const removeQueuedToast = useCallback((id) => {
|
|
52
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
53
|
+
if (queuedToastIndex === -1) return false;
|
|
54
|
+
waitingQueueRef.current.splice(queuedToastIndex, 1);
|
|
55
|
+
syncWaitingToastCount();
|
|
56
|
+
return true;
|
|
57
|
+
}, [getQueuedToastIndex, syncWaitingToastCount]);
|
|
58
|
+
const scheduleToast = useCallback((toast) => {
|
|
59
|
+
clearToastTimer(toast.id);
|
|
60
|
+
if (isPersistentAutoClose(toast.autoClose)) return;
|
|
61
|
+
if (!Number.isFinite(toast.autoClose)) return;
|
|
62
|
+
if (toast.autoClose <= 0) {
|
|
63
|
+
hideRef.current?.(toast.id);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const timeout = setTimeout(() => {
|
|
67
|
+
hideRef.current?.(toast.id);
|
|
68
|
+
timeoutRefs.current.delete(toast.id);
|
|
69
|
+
}, toast.autoClose);
|
|
70
|
+
timeoutRefs.current.set(toast.id, timeout);
|
|
71
|
+
}, [clearToastTimer]);
|
|
72
|
+
const showVisibleToast = useCallback((toast, shouldCallOnShow) => {
|
|
73
|
+
clearToastExitTimer(toast.id);
|
|
74
|
+
removeQueuedToast(toast.id);
|
|
75
|
+
dispatchToastAction({
|
|
76
|
+
type: "upsert",
|
|
77
|
+
toast
|
|
78
|
+
});
|
|
79
|
+
if (shouldCallOnShow) toast.onShow?.();
|
|
80
|
+
scheduleToast(toast);
|
|
81
|
+
}, [
|
|
82
|
+
clearToastExitTimer,
|
|
83
|
+
dispatchToastAction,
|
|
84
|
+
removeQueuedToast,
|
|
85
|
+
scheduleToast
|
|
86
|
+
]);
|
|
87
|
+
const flushWaitingQueue = useCallback(() => {
|
|
88
|
+
let availableSlots = limitRef.current - toastsRef.current.length;
|
|
89
|
+
while (availableSlots > 0 && waitingQueueRef.current.length > 0) {
|
|
90
|
+
const toast = waitingQueueRef.current.shift();
|
|
91
|
+
if (toast) {
|
|
92
|
+
showVisibleToast(toast, true);
|
|
93
|
+
availableSlots -= 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
syncWaitingToastCount();
|
|
97
|
+
}, [showVisibleToast, syncWaitingToastCount]);
|
|
98
|
+
const removeToast = useCallback((id) => {
|
|
99
|
+
clearToastTimer(id);
|
|
100
|
+
clearToastExitTimer(id);
|
|
101
|
+
dispatchToastAction({
|
|
102
|
+
type: "remove",
|
|
103
|
+
id
|
|
104
|
+
});
|
|
105
|
+
flushWaitingQueue();
|
|
106
|
+
}, [
|
|
107
|
+
clearToastExitTimer,
|
|
108
|
+
clearToastTimer,
|
|
109
|
+
dispatchToastAction,
|
|
110
|
+
flushWaitingQueue
|
|
111
|
+
]);
|
|
112
|
+
const beginHideToast = useCallback((toast) => {
|
|
113
|
+
clearToastTimer(toast.id);
|
|
114
|
+
if (toast.isExiting) return;
|
|
115
|
+
toast.onHide?.();
|
|
116
|
+
if (shouldReduceMotion) {
|
|
117
|
+
removeToast(toast.id);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
dispatchToastAction({
|
|
121
|
+
type: "update",
|
|
122
|
+
id: toast.id,
|
|
123
|
+
toast: { isExiting: true }
|
|
124
|
+
});
|
|
125
|
+
clearToastExitTimer(toast.id);
|
|
126
|
+
const timeout = setTimeout(() => {
|
|
127
|
+
exitTimeoutRefs.current.delete(toast.id);
|
|
128
|
+
removeToast(toast.id);
|
|
129
|
+
}, 150);
|
|
130
|
+
exitTimeoutRefs.current.set(toast.id, timeout);
|
|
131
|
+
}, [
|
|
132
|
+
clearToastExitTimer,
|
|
133
|
+
clearToastTimer,
|
|
134
|
+
dispatchToastAction,
|
|
135
|
+
removeToast,
|
|
136
|
+
shouldReduceMotion
|
|
137
|
+
]);
|
|
138
|
+
const hide = useCallback((id) => {
|
|
139
|
+
if (id === "all") {
|
|
140
|
+
clearWaitingQueue();
|
|
141
|
+
toastsRef.current.forEach(beginHideToast);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const toastId = id ?? toastsRef.current.at(-1)?.id;
|
|
145
|
+
if (!toastId) return;
|
|
146
|
+
const toast = toastsRef.current.find((item) => item.id === toastId);
|
|
147
|
+
if (!toast) {
|
|
148
|
+
removeQueuedToast(toastId);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
beginHideToast(toast);
|
|
152
|
+
}, [
|
|
153
|
+
beginHideToast,
|
|
154
|
+
clearWaitingQueue,
|
|
155
|
+
removeQueuedToast
|
|
156
|
+
]);
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
hideRef.current = hide;
|
|
159
|
+
}, [hide]);
|
|
160
|
+
const createToastRecord = useCallback((options, existingToast) => {
|
|
161
|
+
const id = options.id ?? existingToast?.id ?? createToastId();
|
|
162
|
+
return {
|
|
163
|
+
...existingToast,
|
|
164
|
+
...options,
|
|
165
|
+
id,
|
|
166
|
+
size: options.size ?? existingToast?.size ?? "default",
|
|
167
|
+
variant: options.variant ?? existingToast?.variant ?? "info",
|
|
168
|
+
placement: options.placement ?? existingToast?.placement ?? placement,
|
|
169
|
+
autoClose: options.autoClose ?? existingToast?.autoClose ?? autoClose,
|
|
170
|
+
createdAt: existingToast?.createdAt ?? Date.now(),
|
|
171
|
+
closeOnAction: options.closeOnAction ?? existingToast?.closeOnAction ?? false,
|
|
172
|
+
isExiting: false
|
|
173
|
+
};
|
|
174
|
+
}, [autoClose, placement]);
|
|
175
|
+
const upsertToast = useCallback((toast, shouldCallOnShow) => {
|
|
176
|
+
if (toastsRef.current.find((item) => item.id === toast.id) || toastsRef.current.length < limitRef.current) {
|
|
177
|
+
showVisibleToast(toast, shouldCallOnShow);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const queuedToastIndex = getQueuedToastIndex(toast.id);
|
|
181
|
+
if (queuedToastIndex === -1) {
|
|
182
|
+
waitingQueueRef.current.push(toast);
|
|
183
|
+
syncWaitingToastCount();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
waitingQueueRef.current[queuedToastIndex] = toast;
|
|
187
|
+
}, [
|
|
188
|
+
getQueuedToastIndex,
|
|
189
|
+
showVisibleToast,
|
|
190
|
+
syncWaitingToastCount
|
|
191
|
+
]);
|
|
192
|
+
const update = useCallback((id, options) => {
|
|
193
|
+
const existingToast = toastsRef.current.find((toast) => toast.id === id);
|
|
194
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
195
|
+
const queuedToast = queuedToastIndex === -1 ? void 0 : waitingQueueRef.current[queuedToastIndex];
|
|
196
|
+
upsertToast(createToastRecord({
|
|
197
|
+
...options,
|
|
198
|
+
id
|
|
199
|
+
}, existingToast ?? queuedToast), false);
|
|
200
|
+
return {
|
|
201
|
+
id,
|
|
202
|
+
update: (nextOptions) => update(id, nextOptions),
|
|
203
|
+
close: () => hide(id)
|
|
204
|
+
};
|
|
205
|
+
}, [
|
|
206
|
+
createToastRecord,
|
|
207
|
+
getQueuedToastIndex,
|
|
208
|
+
hide,
|
|
209
|
+
upsertToast
|
|
210
|
+
]);
|
|
211
|
+
const show = useCallback((input) => {
|
|
212
|
+
const options = resolveToastInput(input);
|
|
213
|
+
const id = options.id ?? createToastId();
|
|
214
|
+
const existingToast = toastsRef.current.find((toast) => toast.id === id);
|
|
215
|
+
const queuedToastIndex = getQueuedToastIndex(id);
|
|
216
|
+
const queuedToast = queuedToastIndex === -1 ? void 0 : waitingQueueRef.current[queuedToastIndex];
|
|
217
|
+
upsertToast(createToastRecord({
|
|
218
|
+
...options,
|
|
219
|
+
id
|
|
220
|
+
}, existingToast ?? queuedToast), true);
|
|
221
|
+
return {
|
|
222
|
+
id,
|
|
223
|
+
update: (nextOptions) => update(id, nextOptions),
|
|
224
|
+
close: () => hide(id)
|
|
225
|
+
};
|
|
226
|
+
}, [
|
|
227
|
+
createToastRecord,
|
|
228
|
+
getQueuedToastIndex,
|
|
229
|
+
hide,
|
|
230
|
+
update,
|
|
231
|
+
upsertToast
|
|
232
|
+
]);
|
|
233
|
+
const hideAll = useCallback(() => hide("all"), [hide]);
|
|
234
|
+
useEffect(() => {
|
|
235
|
+
limitRef.current = limit;
|
|
236
|
+
if (toastsRef.current.length > limit) {
|
|
237
|
+
const visibleToasts = toastsRef.current.slice(0, limit);
|
|
238
|
+
const queuedToasts = toastsRef.current.slice(limit).map((toast) => ({
|
|
239
|
+
...toast,
|
|
240
|
+
isExiting: false
|
|
241
|
+
}));
|
|
242
|
+
queuedToasts.forEach((toast) => {
|
|
243
|
+
clearToastTimer(toast.id);
|
|
244
|
+
clearToastExitTimer(toast.id);
|
|
245
|
+
});
|
|
246
|
+
waitingQueueRef.current = [...queuedToasts, ...waitingQueueRef.current];
|
|
247
|
+
syncWaitingToastCount();
|
|
248
|
+
dispatchToastAction({
|
|
249
|
+
type: "set",
|
|
250
|
+
toasts: visibleToasts
|
|
251
|
+
});
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
flushWaitingQueue();
|
|
255
|
+
}, [
|
|
256
|
+
clearToastExitTimer,
|
|
257
|
+
clearToastTimer,
|
|
258
|
+
dispatchToastAction,
|
|
259
|
+
flushWaitingQueue,
|
|
260
|
+
limit,
|
|
261
|
+
syncWaitingToastCount
|
|
262
|
+
]);
|
|
263
|
+
return {
|
|
264
|
+
clearAllToastExitTimers,
|
|
265
|
+
clearAllToastTimers,
|
|
266
|
+
controller: useMemo(() => ({
|
|
267
|
+
show,
|
|
268
|
+
update,
|
|
269
|
+
hide,
|
|
270
|
+
hideAll,
|
|
271
|
+
clearWaitingQueue
|
|
272
|
+
}), [
|
|
273
|
+
clearWaitingQueue,
|
|
274
|
+
hide,
|
|
275
|
+
hideAll,
|
|
276
|
+
show,
|
|
277
|
+
update
|
|
278
|
+
]),
|
|
279
|
+
toasts,
|
|
280
|
+
waitingToastCount
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
//#endregion
|
|
284
|
+
export { useToastController };
|
|
285
|
+
|
|
286
|
+
//# sourceMappingURL=useToastController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useToastController.js","names":[],"sources":["../../../src/components/Toast/useToastController.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react';\n\nimport type {\n ToastAction,\n ToastAutoClose,\n ToastController,\n ToastHandle,\n ToastPlacement,\n ToastRecord,\n ToastShowInput,\n ToastShowOptions,\n} from './types';\nimport {\n createToastId,\n isPersistentAutoClose,\n resolveToastInput,\n TOAST_EXIT_ANIMATION_DURATION,\n toastReducer,\n} from './utils';\n\ninterface UseToastControllerOptions {\n autoClose: ToastAutoClose;\n limit: number;\n placement: ToastPlacement;\n shouldReduceMotion: boolean;\n}\n\nfunction useToastController({\n autoClose,\n limit,\n placement,\n shouldReduceMotion,\n}: UseToastControllerOptions) {\n const [toasts, baseDispatch] = useReducer(toastReducer, [] as ToastRecord[]);\n const [waitingToastCount, setWaitingToastCount] = useState(0);\n const toastsRef = useRef<ToastRecord[]>(toasts);\n const limitRef = useRef(limit);\n const waitingQueueRef = useRef<ToastRecord[]>([]);\n const timeoutRefs = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n const exitTimeoutRefs = useRef(new Map<string, ReturnType<typeof setTimeout>>());\n const hideRef = useRef<ToastController['hide'] | null>(null);\n\n useEffect(() => {\n toastsRef.current = toasts;\n }, [toasts]);\n\n const dispatchToastAction = useCallback(\n (action: ToastAction) => {\n toastsRef.current = toastReducer(toastsRef.current, action);\n baseDispatch(action);\n },\n [baseDispatch],\n );\n\n const clearToastTimer = useCallback((id: string) => {\n const timeout = timeoutRefs.current.get(id);\n\n if (timeout) {\n clearTimeout(timeout);\n timeoutRefs.current.delete(id);\n }\n }, []);\n\n const clearAllToastTimers = useCallback(() => {\n timeoutRefs.current.forEach((timeout) => clearTimeout(timeout));\n timeoutRefs.current.clear();\n }, []);\n\n const clearToastExitTimer = useCallback((id: string) => {\n const timeout = exitTimeoutRefs.current.get(id);\n\n if (timeout) {\n clearTimeout(timeout);\n exitTimeoutRefs.current.delete(id);\n }\n }, []);\n\n const clearAllToastExitTimers = useCallback(() => {\n exitTimeoutRefs.current.forEach((timeout) => clearTimeout(timeout));\n exitTimeoutRefs.current.clear();\n }, []);\n\n const syncWaitingToastCount = useCallback(() => {\n setWaitingToastCount(waitingQueueRef.current.length);\n }, []);\n\n const clearWaitingQueue = useCallback(() => {\n waitingQueueRef.current = [];\n syncWaitingToastCount();\n }, [syncWaitingToastCount]);\n\n const getQueuedToastIndex = useCallback(\n (id: string) => waitingQueueRef.current.findIndex((toast) => toast.id === id),\n [],\n );\n\n const removeQueuedToast = useCallback(\n (id: string) => {\n const queuedToastIndex = getQueuedToastIndex(id);\n\n if (queuedToastIndex === -1) {\n return false;\n }\n\n waitingQueueRef.current.splice(queuedToastIndex, 1);\n syncWaitingToastCount();\n return true;\n },\n [getQueuedToastIndex, syncWaitingToastCount],\n );\n\n const scheduleToast = useCallback(\n (toast: ToastRecord) => {\n clearToastTimer(toast.id);\n\n if (isPersistentAutoClose(toast.autoClose)) {\n return;\n }\n\n if (!Number.isFinite(toast.autoClose)) {\n return;\n }\n\n if (toast.autoClose <= 0) {\n hideRef.current?.(toast.id);\n return;\n }\n\n const timeout = setTimeout(() => {\n hideRef.current?.(toast.id);\n timeoutRefs.current.delete(toast.id);\n }, toast.autoClose);\n\n timeoutRefs.current.set(toast.id, timeout);\n },\n [clearToastTimer],\n );\n\n const showVisibleToast = useCallback(\n (toast: ToastRecord, shouldCallOnShow: boolean) => {\n clearToastExitTimer(toast.id);\n removeQueuedToast(toast.id);\n dispatchToastAction({ type: 'upsert', toast });\n\n if (shouldCallOnShow) {\n toast.onShow?.();\n }\n\n scheduleToast(toast);\n },\n [clearToastExitTimer, dispatchToastAction, removeQueuedToast, scheduleToast],\n );\n\n const flushWaitingQueue = useCallback(() => {\n let availableSlots = limitRef.current - toastsRef.current.length;\n\n while (availableSlots > 0 && waitingQueueRef.current.length > 0) {\n const toast = waitingQueueRef.current.shift();\n\n if (toast) {\n showVisibleToast(toast, true);\n availableSlots -= 1;\n }\n }\n\n syncWaitingToastCount();\n }, [showVisibleToast, syncWaitingToastCount]);\n\n const removeToast = useCallback(\n (id: string) => {\n clearToastTimer(id);\n clearToastExitTimer(id);\n dispatchToastAction({ type: 'remove', id });\n flushWaitingQueue();\n },\n [clearToastExitTimer, clearToastTimer, dispatchToastAction, flushWaitingQueue],\n );\n\n const beginHideToast = useCallback(\n (toast: ToastRecord) => {\n clearToastTimer(toast.id);\n\n if (toast.isExiting) {\n return;\n }\n\n toast.onHide?.();\n\n if (shouldReduceMotion) {\n removeToast(toast.id);\n return;\n }\n\n dispatchToastAction({ type: 'update', id: toast.id, toast: { isExiting: true } });\n clearToastExitTimer(toast.id);\n\n const timeout = setTimeout(() => {\n exitTimeoutRefs.current.delete(toast.id);\n removeToast(toast.id);\n }, TOAST_EXIT_ANIMATION_DURATION);\n\n exitTimeoutRefs.current.set(toast.id, timeout);\n },\n [clearToastExitTimer, clearToastTimer, dispatchToastAction, removeToast, shouldReduceMotion],\n );\n\n const hide = useCallback(\n (id?: string | 'all') => {\n if (id === 'all') {\n clearWaitingQueue();\n toastsRef.current.forEach(beginHideToast);\n return;\n }\n\n const toastId = id ?? toastsRef.current.at(-1)?.id;\n\n if (!toastId) {\n return;\n }\n\n const toast = toastsRef.current.find((item) => item.id === toastId);\n\n if (!toast) {\n removeQueuedToast(toastId);\n return;\n }\n\n beginHideToast(toast);\n },\n [beginHideToast, clearWaitingQueue, removeQueuedToast],\n );\n\n useEffect(() => {\n hideRef.current = hide;\n }, [hide]);\n\n const createToastRecord = useCallback(\n (options: Partial<ToastRecord>, existingToast?: ToastRecord): ToastRecord => {\n const id = options.id ?? existingToast?.id ?? createToastId();\n\n return {\n ...existingToast,\n ...options,\n id,\n size: options.size ?? existingToast?.size ?? 'default',\n variant: options.variant ?? existingToast?.variant ?? 'info',\n placement: options.placement ?? existingToast?.placement ?? placement,\n autoClose: options.autoClose ?? existingToast?.autoClose ?? autoClose,\n createdAt: existingToast?.createdAt ?? Date.now(),\n closeOnAction: options.closeOnAction ?? existingToast?.closeOnAction ?? false,\n isExiting: false,\n };\n },\n [autoClose, placement],\n );\n\n const upsertToast = useCallback(\n (toast: ToastRecord, shouldCallOnShow: boolean) => {\n const visibleToast = toastsRef.current.find((item) => item.id === toast.id);\n\n if (visibleToast || toastsRef.current.length < limitRef.current) {\n showVisibleToast(toast, shouldCallOnShow);\n return;\n }\n\n const queuedToastIndex = getQueuedToastIndex(toast.id);\n\n if (queuedToastIndex === -1) {\n waitingQueueRef.current.push(toast);\n syncWaitingToastCount();\n return;\n }\n\n waitingQueueRef.current[queuedToastIndex] = toast;\n },\n [getQueuedToastIndex, showVisibleToast, syncWaitingToastCount],\n );\n\n const update = useCallback(\n (id: string, options: Partial<ToastShowOptions>): ToastHandle => {\n const existingToast = toastsRef.current.find((toast) => toast.id === id);\n const queuedToastIndex = getQueuedToastIndex(id);\n const queuedToast =\n queuedToastIndex === -1 ? undefined : waitingQueueRef.current[queuedToastIndex];\n const toast = createToastRecord({ ...options, id }, existingToast ?? queuedToast);\n\n upsertToast(toast, false);\n\n return {\n id,\n update: (nextOptions) => update(id, nextOptions),\n close: () => hide(id),\n };\n },\n [createToastRecord, getQueuedToastIndex, hide, upsertToast],\n );\n\n const show = useCallback(\n (input: ToastShowInput): ToastHandle => {\n const options = resolveToastInput(input);\n const id = options.id ?? createToastId();\n const existingToast = toastsRef.current.find((toast) => toast.id === id);\n const queuedToastIndex = getQueuedToastIndex(id);\n const queuedToast =\n queuedToastIndex === -1 ? undefined : waitingQueueRef.current[queuedToastIndex];\n const toast = createToastRecord({ ...options, id }, existingToast ?? queuedToast);\n\n upsertToast(toast, true);\n\n return {\n id,\n update: (nextOptions) => update(id, nextOptions),\n close: () => hide(id),\n };\n },\n [createToastRecord, getQueuedToastIndex, hide, update, upsertToast],\n );\n\n const hideAll = useCallback(() => hide('all'), [hide]);\n\n useEffect(() => {\n limitRef.current = limit;\n\n if (toastsRef.current.length > limit) {\n const visibleToasts = toastsRef.current.slice(0, limit);\n const queuedToasts = toastsRef.current.slice(limit).map((toast) => ({\n ...toast,\n isExiting: false,\n }));\n\n queuedToasts.forEach((toast) => {\n clearToastTimer(toast.id);\n clearToastExitTimer(toast.id);\n });\n\n waitingQueueRef.current = [...queuedToasts, ...waitingQueueRef.current];\n syncWaitingToastCount();\n dispatchToastAction({ type: 'set', toasts: visibleToasts });\n return;\n }\n\n flushWaitingQueue();\n }, [\n clearToastExitTimer,\n clearToastTimer,\n dispatchToastAction,\n flushWaitingQueue,\n limit,\n syncWaitingToastCount,\n ]);\n\n const controller = useMemo<ToastController>(\n () => ({\n show,\n update,\n hide,\n hideAll,\n clearWaitingQueue,\n }),\n [clearWaitingQueue, hide, hideAll, show, update],\n );\n\n return {\n clearAllToastExitTimers,\n clearAllToastTimers,\n controller,\n toasts,\n waitingToastCount,\n };\n}\n\nexport { useToastController };\n"],"mappings":";;;;AA2BA,SAAS,mBAAmB,EAC1B,WACA,OACA,WACA,sBAC4B;CAC5B,MAAM,CAAC,QAAQ,gBAAgB,WAAW,cAAc,EAAE,CAAkB;CAC5E,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,EAAE;CAC7D,MAAM,YAAY,OAAsB,OAAO;CAC/C,MAAM,WAAW,OAAO,MAAM;CAC9B,MAAM,kBAAkB,OAAsB,EAAE,CAAC;CACjD,MAAM,cAAc,uBAAO,IAAI,KAA4C,CAAC;CAC5E,MAAM,kBAAkB,uBAAO,IAAI,KAA4C,CAAC;CAChF,MAAM,UAAU,OAAuC,KAAK;CAE5D,gBAAgB;EACd,UAAU,UAAU;IACnB,CAAC,OAAO,CAAC;CAEZ,MAAM,sBAAsB,aACzB,WAAwB;EACvB,UAAU,UAAU,aAAa,UAAU,SAAS,OAAO;EAC3D,aAAa,OAAO;IAEtB,CAAC,aAAa,CACf;CAED,MAAM,kBAAkB,aAAa,OAAe;EAClD,MAAM,UAAU,YAAY,QAAQ,IAAI,GAAG;EAE3C,IAAI,SAAS;GACX,aAAa,QAAQ;GACrB,YAAY,QAAQ,OAAO,GAAG;;IAE/B,EAAE,CAAC;CAEN,MAAM,sBAAsB,kBAAkB;EAC5C,YAAY,QAAQ,SAAS,YAAY,aAAa,QAAQ,CAAC;EAC/D,YAAY,QAAQ,OAAO;IAC1B,EAAE,CAAC;CAEN,MAAM,sBAAsB,aAAa,OAAe;EACtD,MAAM,UAAU,gBAAgB,QAAQ,IAAI,GAAG;EAE/C,IAAI,SAAS;GACX,aAAa,QAAQ;GACrB,gBAAgB,QAAQ,OAAO,GAAG;;IAEnC,EAAE,CAAC;CAEN,MAAM,0BAA0B,kBAAkB;EAChD,gBAAgB,QAAQ,SAAS,YAAY,aAAa,QAAQ,CAAC;EACnE,gBAAgB,QAAQ,OAAO;IAC9B,EAAE,CAAC;CAEN,MAAM,wBAAwB,kBAAkB;EAC9C,qBAAqB,gBAAgB,QAAQ,OAAO;IACnD,EAAE,CAAC;CAEN,MAAM,oBAAoB,kBAAkB;EAC1C,gBAAgB,UAAU,EAAE;EAC5B,uBAAuB;IACtB,CAAC,sBAAsB,CAAC;CAE3B,MAAM,sBAAsB,aACzB,OAAe,gBAAgB,QAAQ,WAAW,UAAU,MAAM,OAAO,GAAG,EAC7E,EAAE,CACH;CAED,MAAM,oBAAoB,aACvB,OAAe;EACd,MAAM,mBAAmB,oBAAoB,GAAG;EAEhD,IAAI,qBAAqB,IACvB,OAAO;EAGT,gBAAgB,QAAQ,OAAO,kBAAkB,EAAE;EACnD,uBAAuB;EACvB,OAAO;IAET,CAAC,qBAAqB,sBAAsB,CAC7C;CAED,MAAM,gBAAgB,aACnB,UAAuB;EACtB,gBAAgB,MAAM,GAAG;EAEzB,IAAI,sBAAsB,MAAM,UAAU,EACxC;EAGF,IAAI,CAAC,OAAO,SAAS,MAAM,UAAU,EACnC;EAGF,IAAI,MAAM,aAAa,GAAG;GACxB,QAAQ,UAAU,MAAM,GAAG;GAC3B;;EAGF,MAAM,UAAU,iBAAiB;GAC/B,QAAQ,UAAU,MAAM,GAAG;GAC3B,YAAY,QAAQ,OAAO,MAAM,GAAG;KACnC,MAAM,UAAU;EAEnB,YAAY,QAAQ,IAAI,MAAM,IAAI,QAAQ;IAE5C,CAAC,gBAAgB,CAClB;CAED,MAAM,mBAAmB,aACtB,OAAoB,qBAA8B;EACjD,oBAAoB,MAAM,GAAG;EAC7B,kBAAkB,MAAM,GAAG;EAC3B,oBAAoB;GAAE,MAAM;GAAU;GAAO,CAAC;EAE9C,IAAI,kBACF,MAAM,UAAU;EAGlB,cAAc,MAAM;IAEtB;EAAC;EAAqB;EAAqB;EAAmB;EAAc,CAC7E;CAED,MAAM,oBAAoB,kBAAkB;EAC1C,IAAI,iBAAiB,SAAS,UAAU,UAAU,QAAQ;EAE1D,OAAO,iBAAiB,KAAK,gBAAgB,QAAQ,SAAS,GAAG;GAC/D,MAAM,QAAQ,gBAAgB,QAAQ,OAAO;GAE7C,IAAI,OAAO;IACT,iBAAiB,OAAO,KAAK;IAC7B,kBAAkB;;;EAItB,uBAAuB;IACtB,CAAC,kBAAkB,sBAAsB,CAAC;CAE7C,MAAM,cAAc,aACjB,OAAe;EACd,gBAAgB,GAAG;EACnB,oBAAoB,GAAG;EACvB,oBAAoB;GAAE,MAAM;GAAU;GAAI,CAAC;EAC3C,mBAAmB;IAErB;EAAC;EAAqB;EAAiB;EAAqB;EAAkB,CAC/E;CAED,MAAM,iBAAiB,aACpB,UAAuB;EACtB,gBAAgB,MAAM,GAAG;EAEzB,IAAI,MAAM,WACR;EAGF,MAAM,UAAU;EAEhB,IAAI,oBAAoB;GACtB,YAAY,MAAM,GAAG;GACrB;;EAGF,oBAAoB;GAAE,MAAM;GAAU,IAAI,MAAM;GAAI,OAAO,EAAE,WAAW,MAAM;GAAE,CAAC;EACjF,oBAAoB,MAAM,GAAG;EAE7B,MAAM,UAAU,iBAAiB;GAC/B,gBAAgB,QAAQ,OAAO,MAAM,GAAG;GACxC,YAAY,MAAM,GAAG;SACU;EAEjC,gBAAgB,QAAQ,IAAI,MAAM,IAAI,QAAQ;IAEhD;EAAC;EAAqB;EAAiB;EAAqB;EAAa;EAAmB,CAC7F;CAED,MAAM,OAAO,aACV,OAAwB;EACvB,IAAI,OAAO,OAAO;GAChB,mBAAmB;GACnB,UAAU,QAAQ,QAAQ,eAAe;GACzC;;EAGF,MAAM,UAAU,MAAM,UAAU,QAAQ,GAAG,GAAG,EAAE;EAEhD,IAAI,CAAC,SACH;EAGF,MAAM,QAAQ,UAAU,QAAQ,MAAM,SAAS,KAAK,OAAO,QAAQ;EAEnE,IAAI,CAAC,OAAO;GACV,kBAAkB,QAAQ;GAC1B;;EAGF,eAAe,MAAM;IAEvB;EAAC;EAAgB;EAAmB;EAAkB,CACvD;CAED,gBAAgB;EACd,QAAQ,UAAU;IACjB,CAAC,KAAK,CAAC;CAEV,MAAM,oBAAoB,aACvB,SAA+B,kBAA6C;EAC3E,MAAM,KAAK,QAAQ,MAAM,eAAe,MAAM,eAAe;EAE7D,OAAO;GACL,GAAG;GACH,GAAG;GACH;GACA,MAAM,QAAQ,QAAQ,eAAe,QAAQ;GAC7C,SAAS,QAAQ,WAAW,eAAe,WAAW;GACtD,WAAW,QAAQ,aAAa,eAAe,aAAa;GAC5D,WAAW,QAAQ,aAAa,eAAe,aAAa;GAC5D,WAAW,eAAe,aAAa,KAAK,KAAK;GACjD,eAAe,QAAQ,iBAAiB,eAAe,iBAAiB;GACxE,WAAW;GACZ;IAEH,CAAC,WAAW,UAAU,CACvB;CAED,MAAM,cAAc,aACjB,OAAoB,qBAA8B;EAGjD,IAFqB,UAAU,QAAQ,MAAM,SAAS,KAAK,OAAO,MAAM,GAExD,IAAI,UAAU,QAAQ,SAAS,SAAS,SAAS;GAC/D,iBAAiB,OAAO,iBAAiB;GACzC;;EAGF,MAAM,mBAAmB,oBAAoB,MAAM,GAAG;EAEtD,IAAI,qBAAqB,IAAI;GAC3B,gBAAgB,QAAQ,KAAK,MAAM;GACnC,uBAAuB;GACvB;;EAGF,gBAAgB,QAAQ,oBAAoB;IAE9C;EAAC;EAAqB;EAAkB;EAAsB,CAC/D;CAED,MAAM,SAAS,aACZ,IAAY,YAAoD;EAC/D,MAAM,gBAAgB,UAAU,QAAQ,MAAM,UAAU,MAAM,OAAO,GAAG;EACxE,MAAM,mBAAmB,oBAAoB,GAAG;EAChD,MAAM,cACJ,qBAAqB,KAAK,KAAA,IAAY,gBAAgB,QAAQ;EAGhE,YAFc,kBAAkB;GAAE,GAAG;GAAS;GAAI,EAAE,iBAAiB,YAEpD,EAAE,MAAM;EAEzB,OAAO;GACL;GACA,SAAS,gBAAgB,OAAO,IAAI,YAAY;GAChD,aAAa,KAAK,GAAG;GACtB;IAEH;EAAC;EAAmB;EAAqB;EAAM;EAAY,CAC5D;CAED,MAAM,OAAO,aACV,UAAuC;EACtC,MAAM,UAAU,kBAAkB,MAAM;EACxC,MAAM,KAAK,QAAQ,MAAM,eAAe;EACxC,MAAM,gBAAgB,UAAU,QAAQ,MAAM,UAAU,MAAM,OAAO,GAAG;EACxE,MAAM,mBAAmB,oBAAoB,GAAG;EAChD,MAAM,cACJ,qBAAqB,KAAK,KAAA,IAAY,gBAAgB,QAAQ;EAGhE,YAFc,kBAAkB;GAAE,GAAG;GAAS;GAAI,EAAE,iBAAiB,YAEpD,EAAE,KAAK;EAExB,OAAO;GACL;GACA,SAAS,gBAAgB,OAAO,IAAI,YAAY;GAChD,aAAa,KAAK,GAAG;GACtB;IAEH;EAAC;EAAmB;EAAqB;EAAM;EAAQ;EAAY,CACpE;CAED,MAAM,UAAU,kBAAkB,KAAK,MAAM,EAAE,CAAC,KAAK,CAAC;CAEtD,gBAAgB;EACd,SAAS,UAAU;EAEnB,IAAI,UAAU,QAAQ,SAAS,OAAO;GACpC,MAAM,gBAAgB,UAAU,QAAQ,MAAM,GAAG,MAAM;GACvD,MAAM,eAAe,UAAU,QAAQ,MAAM,MAAM,CAAC,KAAK,WAAW;IAClE,GAAG;IACH,WAAW;IACZ,EAAE;GAEH,aAAa,SAAS,UAAU;IAC9B,gBAAgB,MAAM,GAAG;IACzB,oBAAoB,MAAM,GAAG;KAC7B;GAEF,gBAAgB,UAAU,CAAC,GAAG,cAAc,GAAG,gBAAgB,QAAQ;GACvE,uBAAuB;GACvB,oBAAoB;IAAE,MAAM;IAAO,QAAQ;IAAe,CAAC;GAC3D;;EAGF,mBAAmB;IAClB;EACD;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAaF,OAAO;EACL;EACA;EACA,YAdiB,eACV;GACL;GACA;GACA;GACA;GACA;GACD,GACD;GAAC;GAAmB;GAAM;GAAS;GAAM;GAAO,CAMtC;EACV;EACA;EACD"}
|