@aglyn/shared-ui-snackstack 1.0.0-beta.143

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.
Files changed (54) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +7 -0
  3. package/package.json +43 -0
  4. package/src/index.d.ts +17 -0
  5. package/src/index.js +18 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/SnackbarContainer.d.ts +26 -0
  8. package/src/lib/SnackbarContainer.js +130 -0
  9. package/src/lib/SnackbarContainer.js.map +1 -0
  10. package/src/lib/SnackbarContent.d.ts +20 -0
  11. package/src/lib/SnackbarContent.js +42 -0
  12. package/src/lib/SnackbarContent.js.map +1 -0
  13. package/src/lib/SnackbarContext.d.ts +19 -0
  14. package/src/lib/SnackbarContext.js +22 -0
  15. package/src/lib/SnackbarContext.js.map +1 -0
  16. package/src/lib/SnackbarItem/Snackbar.d.ts +29 -0
  17. package/src/lib/SnackbarItem/Snackbar.js +129 -0
  18. package/src/lib/SnackbarItem/Snackbar.js.map +1 -0
  19. package/src/lib/SnackbarItem/SnackbarItem.d.ts +29 -0
  20. package/src/lib/SnackbarItem/SnackbarItem.js +246 -0
  21. package/src/lib/SnackbarItem/SnackbarItem.js.map +1 -0
  22. package/src/lib/SnackbarItem/SnackbarItem.util.d.ts +26 -0
  23. package/src/lib/SnackbarItem/SnackbarItem.util.js +29 -0
  24. package/src/lib/SnackbarItem/SnackbarItem.util.js.map +1 -0
  25. package/src/lib/SnackbarItem/index.d.ts +18 -0
  26. package/src/lib/SnackbarItem/index.js +19 -0
  27. package/src/lib/SnackbarItem/index.js.map +1 -0
  28. package/src/lib/SnackbarProvider.d.ts +80 -0
  29. package/src/lib/SnackbarProvider.js +272 -0
  30. package/src/lib/SnackbarProvider.js.map +1 -0
  31. package/src/lib/types.d.ts +270 -0
  32. package/src/lib/types.js +21 -0
  33. package/src/lib/types.js.map +1 -0
  34. package/src/lib/useSnackbar.d.ts +19 -0
  35. package/src/lib/useSnackbar.js +23 -0
  36. package/src/lib/useSnackbar.js.map +1 -0
  37. package/src/lib/utils/constants.d.ts +68 -0
  38. package/src/lib/utils/constants.js +99 -0
  39. package/src/lib/utils/constants.js.map +1 -0
  40. package/src/lib/utils/defaultIconVariants.d.ts +19 -0
  41. package/src/lib/utils/defaultIconVariants.js +60 -0
  42. package/src/lib/utils/defaultIconVariants.js.map +1 -0
  43. package/src/lib/utils/useEventCallback.d.ts +17 -0
  44. package/src/lib/utils/useEventCallback.js +26 -0
  45. package/src/lib/utils/useEventCallback.js.map +1 -0
  46. package/src/lib/utils/warning.d.ts +18 -0
  47. package/src/lib/utils/warning.js +28 -0
  48. package/src/lib/utils/warning.js.map +1 -0
  49. package/src/lib/withSnackbar.d.ts +19 -0
  50. package/src/lib/withSnackbar.js +37 -0
  51. package/src/lib/withSnackbar.js.map +1 -0
  52. package/src/snackstack.d.ts +21 -0
  53. package/src/snackstack.js +22 -0
  54. package/src/snackstack.js.map +1 -0
@@ -0,0 +1,272 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ import { _ as _object_without_properties_loose } from "@swc/helpers/_/_object_without_properties_loose";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { createElement as _createElement } from "react";
5
+ /**
6
+ * @license
7
+ * Copyright 2022 Aglyn LLC
8
+ *
9
+ * Licensed under the Apache License, Version 2.0 (the "License");
10
+ * you may not use this file except in compliance with the License.
11
+ * You may obtain a copy of the License at
12
+ *
13
+ * http://www.apache.org/licenses/LICENSE-2.0
14
+ *
15
+ * Unless required by applicable law or agreed to in writing, software
16
+ * distributed under the License is distributed on an "AS IS" BASIS,
17
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ * See the License for the specific language governing permissions and
19
+ * limitations under the License.
20
+ */ import { createChainedFunction } from "@aglyn/shared-util-tools";
21
+ import clsx from "clsx";
22
+ import { Component } from "react";
23
+ import { createPortal } from "react-dom";
24
+ import SnackbarContainer from "./SnackbarContainer.js";
25
+ import SnackbarContext from "./SnackbarContext.js";
26
+ import SnackbarItem from "./SnackbarItem/index.js";
27
+ import { DEFAULTS, isDefined, merge, MESSAGES, omitContainerKeys, originKeyExtractor, REASONS, transformer } from "./utils/constants.js";
28
+ import warning from "./utils/warning.js";
29
+ let SnackbarProvider = class SnackbarProvider extends Component {
30
+ get maxSnack() {
31
+ return this.props.maxSnack || DEFAULTS.maxSnack;
32
+ }
33
+ render() {
34
+ const { contextValue } = this.state;
35
+ const _this_props = this.props, { maxSnack: dontspread1, allowDuplicate: dontspread2, variant: dontspread3, anchorOrigin: dontspread4, iconVariant, dense, hideIconVariant, domRoot, children, classes = {} } = _this_props, props = _object_without_properties_loose(_this_props, [
36
+ "maxSnack",
37
+ "allowDuplicate",
38
+ "variant",
39
+ "anchorOrigin",
40
+ "iconVariant",
41
+ "dense",
42
+ "hideIconVariant",
43
+ "domRoot",
44
+ "children",
45
+ "classes"
46
+ ]);
47
+ const categ = this.state.snacks.reduce((acc, current)=>{
48
+ const category = originKeyExtractor(current.anchorOrigin);
49
+ const existingOfCategory = acc[category] || [];
50
+ return _extends({}, acc, {
51
+ [category]: [
52
+ ...existingOfCategory,
53
+ current
54
+ ]
55
+ });
56
+ }, {});
57
+ const snackbars = Object.keys(categ).map((origin)=>{
58
+ const snacks = categ[origin];
59
+ return /*#__PURE__*/ _jsx(SnackbarContainer, {
60
+ dense: Boolean(dense),
61
+ anchorOrigin: snacks[0].anchorOrigin,
62
+ className: clsx(classes.containerRoot, classes[transformer.toContainerAnchorOrigin(origin)]),
63
+ children: snacks.map((snack)=>/*#__PURE__*/ _createElement(SnackbarItem, _extends({}, props, {
64
+ key: snack.snackbarId,
65
+ snack: snack,
66
+ dense: Boolean(dense),
67
+ iconVariant: iconVariant,
68
+ hideIconVariant: hideIconVariant,
69
+ classes: omitContainerKeys(classes),
70
+ onClose: this.handleCloseSnack,
71
+ onExited: createChainedFunction([
72
+ this.handleExitedSnack,
73
+ this.props.onExited
74
+ ]),
75
+ onEntered: createChainedFunction([
76
+ this.handleEnteredSnack,
77
+ this.props.onEntered
78
+ ])
79
+ })))
80
+ }, origin);
81
+ });
82
+ return /*#__PURE__*/ _jsxs(SnackbarContext.Provider, {
83
+ value: contextValue,
84
+ children: [
85
+ children,
86
+ domRoot ? /*#__PURE__*/ createPortal(snackbars, domRoot) : snackbars
87
+ ]
88
+ });
89
+ }
90
+ constructor(props){
91
+ super(props), /**
92
+ * Adds a new snackbar to the queue to be presented. Returns generated or user
93
+ * defined snackbarId referencing the new snackbar or null
94
+ */ this.enqueueSnackbar = (message, opts = {})=>{
95
+ const { snackbarId, allowDuplicate } = opts, options = _object_without_properties_loose(opts, [
96
+ "snackbarId",
97
+ "allowDuplicate"
98
+ ]);
99
+ const hasSpecifiedKey = isDefined(snackbarId);
100
+ const id = hasSpecifiedKey ? snackbarId : new Date().getTime() + Math.random();
101
+ const merger = merge(options, this.props, DEFAULTS);
102
+ const snack = _extends({
103
+ snackbarId: id
104
+ }, options, {
105
+ message,
106
+ open: true,
107
+ entered: false,
108
+ requestClose: false,
109
+ variant: merger('variant'),
110
+ anchorOrigin: merger('anchorOrigin'),
111
+ autoHideDuration: merger('autoHideDuration')
112
+ });
113
+ if (options.persist) {
114
+ snack.autoHideDuration = undefined;
115
+ }
116
+ this.setState((state)=>{
117
+ if (allowDuplicate === undefined && this.props.allowDuplicate || allowDuplicate) {
118
+ const compareFunction = (item)=>hasSpecifiedKey ? item.snackbarId === snackbarId : item.message === message;
119
+ const inQueue = state.queue.findIndex(compareFunction) > -1;
120
+ const inView = state.snacks.findIndex(compareFunction) > -1;
121
+ if (inQueue || inView) {
122
+ return state;
123
+ }
124
+ }
125
+ return this.handleDisplaySnack(_extends({}, state, {
126
+ queue: [
127
+ ...state.queue,
128
+ snack
129
+ ]
130
+ }));
131
+ });
132
+ return id;
133
+ }, /**
134
+ * Close snackbar with the given snackbarId
135
+ */ this.closeSnackbar = (snackbarId)=>{
136
+ // call individual snackbar onClose callback passed through options parameter
137
+ const toBeClosed = this.state.snacks.find((item)=>item.snackbarId === snackbarId);
138
+ if (isDefined(snackbarId) && toBeClosed && toBeClosed.onClose) {
139
+ toBeClosed.onClose(null, REASONS.INSTRUCTED, snackbarId);
140
+ }
141
+ this.handleCloseSnack(null, REASONS.INSTRUCTED, snackbarId);
142
+ }, /**
143
+ * Reducer: Display snack if there's space for it. Otherwise, immediately
144
+ * begin dismissing the oldest message to start showing the new one.
145
+ */ this.handleDisplaySnack = (state)=>{
146
+ const { snacks } = state;
147
+ if (snacks.length >= this.maxSnack) {
148
+ return this.handleDismissOldest(state);
149
+ }
150
+ return this.processQueue(state);
151
+ }, /**
152
+ * Reducer: Display items (notifications) in the queue if there's space for them.
153
+ */ this.processQueue = (state)=>{
154
+ const { queue, snacks } = state;
155
+ if (queue.length > 0) {
156
+ return _extends({}, state, {
157
+ snacks: [
158
+ ...snacks,
159
+ queue[0]
160
+ ],
161
+ queue: queue.slice(1, queue.length)
162
+ });
163
+ }
164
+ return state;
165
+ }, /**
166
+ * Reducer: Hide oldest snackbar on the screen because there exists a new one which we have to
167
+ * display.
168
+ * (ignoring the one with 'persist' flag. i.e. explicitly told by user not to get dismissed).
169
+ *
170
+ * Note 1: If there is already a message leaving the screen, no new messages are dismissed.
171
+ * Note 2: If the oldest message has not yet entered the screen, only a request to close the
172
+ * snackbar is made. Once it entered the screen, it will be immediately dismissed.
173
+ */ this.handleDismissOldest = (state)=>{
174
+ if (state.snacks.some((item)=>!item.open || item.requestClose)) {
175
+ return state;
176
+ }
177
+ let popped = false;
178
+ let ignore = false;
179
+ const persistentCount = state.snacks.reduce((acc, current)=>acc + (current.open && current.persist ? 1 : 0), 0);
180
+ if (persistentCount === this.maxSnack) {
181
+ warning(MESSAGES.NO_PERSIST_ALL);
182
+ ignore = true;
183
+ }
184
+ const snacks = state.snacks.map((item)=>{
185
+ if (!popped && (!item.persist || ignore)) {
186
+ popped = true;
187
+ if (!item.entered) {
188
+ return _extends({}, item, {
189
+ requestClose: true
190
+ });
191
+ }
192
+ if (item.onClose) item.onClose(null, REASONS.MAXSNACK, item.snackbarId);
193
+ if (this.props.onClose) this.props.onClose(null, REASONS.MAXSNACK, item.snackbarId);
194
+ return _extends({}, item, {
195
+ open: false
196
+ });
197
+ }
198
+ return _extends({}, item);
199
+ });
200
+ return _extends({}, state, {
201
+ snacks
202
+ });
203
+ }, /**
204
+ * Set the entered state of the snackbar with the given snackbarId.
205
+ */ this.handleEnteredSnack = (node, isAppearing, snackbarId)=>{
206
+ if (!isDefined(snackbarId)) {
207
+ throw new Error('handleEnteredSnack Cannot be called with undefined snackbarId');
208
+ }
209
+ this.setState(({ snacks })=>({
210
+ snacks: snacks.map((item)=>item.snackbarId === snackbarId ? _extends({}, item, {
211
+ entered: true
212
+ }) : _extends({}, item))
213
+ }));
214
+ }, /**
215
+ * Hide a snackbar after its timeout.
216
+ */ this.handleCloseSnack = (event, reason, snackbarId)=>{
217
+ // should not use createChainedFunction for onClose.
218
+ // because this.closeSnackbar called this function
219
+ if (this.props.onClose) {
220
+ this.props.onClose(event, reason, snackbarId);
221
+ }
222
+ if (reason === REASONS.CLICKAWAY) return;
223
+ const shouldCloseAll = snackbarId === undefined;
224
+ this.setState(({ snacks, queue })=>({
225
+ snacks: snacks.map((item)=>{
226
+ if (!shouldCloseAll && item.snackbarId !== snackbarId) {
227
+ return _extends({}, item);
228
+ }
229
+ return item.entered ? _extends({}, item, {
230
+ open: false
231
+ }) : _extends({}, item, {
232
+ requestClose: true
233
+ });
234
+ }),
235
+ queue: queue.filter((item)=>item.snackbarId !== snackbarId)
236
+ }));
237
+ }, /**
238
+ * When we set open attribute of a snackbar to false (i.e. after we hide a snackbar),
239
+ * it leaves the screen and immediately after leaving animation is done, this method
240
+ * gets called. We remove the hidden snackbar from state and then display notifications
241
+ * waiting in the queue (if any). If after this process the queue is not empty, the
242
+ * oldest message is dismissed.
243
+ */ // @ts-expect-error — handler accepts extra snackbarId params beyond the typed signature
244
+ this.handleExitedSnack = (event, snackbarId1, snackbarId2)=>{
245
+ const snackbarId = snackbarId1 || snackbarId2;
246
+ if (!isDefined(snackbarId)) {
247
+ throw new Error('handleExitedSnack Cannot be called with undefined snackbarId');
248
+ }
249
+ this.setState((state)=>{
250
+ const newState = this.processQueue(_extends({}, state, {
251
+ snacks: state.snacks.filter((item)=>item.snackbarId !== snackbarId)
252
+ }));
253
+ if (newState.queue.length === 0) {
254
+ return newState;
255
+ }
256
+ return this.handleDismissOldest(newState);
257
+ });
258
+ };
259
+ this.state = {
260
+ snacks: [],
261
+ queue: [],
262
+ contextValue: {
263
+ enqueueSnackbar: this.enqueueSnackbar.bind(this),
264
+ closeSnackbar: this.closeSnackbar.bind(this)
265
+ }
266
+ };
267
+ }
268
+ };
269
+ export { SnackbarProvider };
270
+ export default SnackbarProvider;
271
+
272
+ //# sourceMappingURL=SnackbarProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/shared/ui/snackstack/src/lib/SnackbarProvider.tsx"],"sourcesContent":["/**\n * @license\n * Copyright 2022 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {createChainedFunction} from '@aglyn/shared-util-tools'\nimport clsx from 'clsx'\nimport {Component} from 'react'\nimport {createPortal} from 'react-dom'\nimport SnackbarContainer from './SnackbarContainer'\nimport SnackbarContext from './SnackbarContext'\nimport SnackbarItem from './SnackbarItem'\nimport type {\n OptionsObject,\n ProviderContext,\n RequiredBy,\n SnackbarId,\n SnackbarMessage,\n SnackbarProviderProps,\n TransitionHandlerProps,\n} from './types'\nimport {\n DEFAULTS,\n isDefined,\n merge,\n MESSAGES,\n omitContainerKeys,\n originKeyExtractor,\n REASONS,\n transformer,\n} from './utils/constants'\nimport warning from './utils/warning'\n\n\ntype Reducer = (state: State) => State;\ntype SnacksByPosition = {[snackbarId: string]: Snack[]};\n\nexport interface Snack extends RequiredBy<OptionsObject, 'snackbarId' | 'variant' | 'anchorOrigin'> {\n message: SnackbarMessage;\n open: boolean;\n entered: boolean;\n requestClose: boolean;\n}\n\ninterface State {\n snacks: Snack[];\n queue: Snack[];\n contextValue: ProviderContext;\n}\n\nclass SnackbarProvider extends Component<SnackbarProviderProps, State> {\n\n get maxSnack(): number {\n return this.props.maxSnack || DEFAULTS.maxSnack\n }\n\n constructor(props: SnackbarProviderProps) {\n super(props)\n this.state = {\n snacks: [],\n queue: [],\n contextValue: {\n enqueueSnackbar: this.enqueueSnackbar.bind(this),\n closeSnackbar: this.closeSnackbar.bind(this),\n },\n }\n }\n\n /**\n * Adds a new snackbar to the queue to be presented. Returns generated or user\n * defined snackbarId referencing the new snackbar or null\n */\n public enqueueSnackbar = (message: SnackbarMessage, opts: OptionsObject = {}): SnackbarId => {\n const {\n snackbarId,\n allowDuplicate,\n ...options\n } = opts\n\n const hasSpecifiedKey = isDefined(snackbarId)\n const id = hasSpecifiedKey ? (snackbarId as SnackbarId) : new Date().getTime() + Math.random()\n\n const merger = merge(options, this.props, DEFAULTS)\n const snack: Snack = {\n snackbarId: id,\n ...options,\n message,\n open: true,\n entered: false,\n requestClose: false,\n variant: merger('variant'),\n anchorOrigin: merger('anchorOrigin'),\n autoHideDuration: merger('autoHideDuration'),\n }\n\n if (options.persist) {\n snack.autoHideDuration = undefined\n }\n\n this.setState((state) => {\n if ((allowDuplicate === undefined && this.props.allowDuplicate) || allowDuplicate) {\n const compareFunction = (item: Snack): boolean => (\n hasSpecifiedKey ? item.snackbarId === snackbarId : item.message === message\n )\n\n const inQueue = state.queue.findIndex(compareFunction) > -1\n const inView = state.snacks.findIndex(compareFunction) > -1\n if (inQueue || inView) {\n return state\n }\n }\n\n return this.handleDisplaySnack({\n ...state,\n queue: [...state.queue, snack],\n })\n })\n\n return id\n }\n\n /**\n * Close snackbar with the given snackbarId\n */\n public closeSnackbar: ProviderContext['closeSnackbar'] = (snackbarId) => {\n // call individual snackbar onClose callback passed through options parameter\n const toBeClosed = this.state.snacks.find(item => item.snackbarId === snackbarId)\n if (isDefined(snackbarId) && toBeClosed && toBeClosed.onClose) {\n toBeClosed.onClose(null, REASONS.INSTRUCTED, snackbarId)\n }\n\n this.handleCloseSnack(null, REASONS.INSTRUCTED, snackbarId)\n }\n\n public render(): JSX.Element {\n const {contextValue} = this.state\n const {\n maxSnack: dontspread1,\n allowDuplicate: dontspread2,\n variant: dontspread3,\n anchorOrigin: dontspread4,\n iconVariant,\n dense,\n hideIconVariant,\n domRoot,\n children,\n classes = {},\n ...props\n } = this.props\n\n const categ = this.state.snacks.reduce<SnacksByPosition>((acc, current) => {\n const category = originKeyExtractor(current.anchorOrigin)\n const existingOfCategory = acc[category] || []\n return {\n ...acc,\n [category]: [...existingOfCategory, current],\n }\n }, {})\n\n const snackbars = Object.keys(categ).map((origin) => {\n const snacks = categ[origin]\n return (\n <SnackbarContainer\n key={origin}\n dense={Boolean(dense)}\n anchorOrigin={snacks[0].anchorOrigin}\n className={clsx(\n classes.containerRoot,\n classes[transformer.toContainerAnchorOrigin(origin)],\n )}\n >\n {snacks.map(snack => (\n <SnackbarItem\n {...props}\n key={snack.snackbarId}\n snack={snack}\n dense={Boolean(dense)}\n iconVariant={iconVariant}\n hideIconVariant={hideIconVariant}\n classes={omitContainerKeys(classes)}\n onClose={this.handleCloseSnack}\n onExited={createChainedFunction([this.handleExitedSnack, this.props.onExited])}\n onEntered={createChainedFunction([this.handleEnteredSnack, this.props.onEntered])}\n />\n ))}\n </SnackbarContainer>\n )\n })\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {children}\n {domRoot ? createPortal(snackbars, domRoot) : snackbars}\n </SnackbarContext.Provider>\n )\n }\n\n\n /**\n * Reducer: Display snack if there's space for it. Otherwise, immediately\n * begin dismissing the oldest message to start showing the new one.\n */\n private handleDisplaySnack: Reducer = (state) => {\n const {snacks} = state\n if (snacks.length >= this.maxSnack) {\n return this.handleDismissOldest(state)\n }\n return this.processQueue(state)\n }\n\n /**\n * Reducer: Display items (notifications) in the queue if there's space for them.\n */\n private processQueue: Reducer = (state) => {\n const {queue, snacks} = state\n if (queue.length > 0) {\n return {\n ...state,\n snacks: [...snacks, queue[0]],\n queue: queue.slice(1, queue.length),\n }\n }\n return state\n }\n\n /**\n * Reducer: Hide oldest snackbar on the screen because there exists a new one which we have to\n * display.\n * (ignoring the one with 'persist' flag. i.e. explicitly told by user not to get dismissed).\n *\n * Note 1: If there is already a message leaving the screen, no new messages are dismissed.\n * Note 2: If the oldest message has not yet entered the screen, only a request to close the\n * snackbar is made. Once it entered the screen, it will be immediately dismissed.\n */\n private handleDismissOldest: Reducer = (state) => {\n if (state.snacks.some(item => !item.open || item.requestClose)) {\n return state\n }\n\n let popped = false\n let ignore = false\n\n const persistentCount = state.snacks.reduce((acc, current) => (\n acc + (current.open && current.persist ? 1 : 0)\n ), 0)\n\n if (persistentCount === this.maxSnack) {\n warning(MESSAGES.NO_PERSIST_ALL)\n ignore = true\n }\n\n const snacks = state.snacks.map((item) => {\n if (!popped && (!item.persist || ignore)) {\n popped = true\n\n if (!item.entered) {\n return {\n ...item,\n requestClose: true,\n }\n }\n\n if (item.onClose) item.onClose(null, REASONS.MAXSNACK, item.snackbarId)\n if (this.props.onClose) this.props.onClose(null, REASONS.MAXSNACK, item.snackbarId)\n\n return {\n ...item,\n open: false,\n }\n }\n\n return {...item}\n })\n\n return {...state, snacks}\n }\n\n /**\n * Set the entered state of the snackbar with the given snackbarId.\n */\n private handleEnteredSnack: TransitionHandlerProps['onEntered'] = (node, isAppearing, snackbarId) => {\n if (!isDefined(snackbarId)) {\n throw new Error('handleEnteredSnack Cannot be called with undefined snackbarId')\n }\n\n this.setState(({snacks}) => ({\n snacks: snacks.map(item => (\n item.snackbarId === snackbarId ? {...item, entered: true} : {...item}\n )),\n }))\n }\n\n /**\n * Hide a snackbar after its timeout.\n */\n private handleCloseSnack: TransitionHandlerProps['onClose'] = (event, reason, snackbarId) => {\n // should not use createChainedFunction for onClose.\n // because this.closeSnackbar called this function\n if (this.props.onClose) {\n this.props.onClose(event, reason, snackbarId)\n }\n\n if (reason === REASONS.CLICKAWAY) return\n const shouldCloseAll = snackbarId === undefined\n\n this.setState(({snacks, queue}) => ({\n snacks: snacks.map((item) => {\n if (!shouldCloseAll && item.snackbarId !== snackbarId) {\n return {...item}\n }\n\n return item.entered\n ? {...item, open: false}\n : {...item, requestClose: true}\n }),\n queue: queue.filter(item => item.snackbarId !== snackbarId),\n }))\n }\n\n /**\n * When we set open attribute of a snackbar to false (i.e. after we hide a snackbar),\n * it leaves the screen and immediately after leaving animation is done, this method\n * gets called. We remove the hidden snackbar from state and then display notifications\n * waiting in the queue (if any). If after this process the queue is not empty, the\n * oldest message is dismissed.\n */\n // @ts-expect-error — handler accepts extra snackbarId params beyond the typed signature\n private handleExitedSnack: TransitionHandlerProps['onExited'] = (event, snackbarId1, snackbarId2) => {\n const snackbarId = snackbarId1 || snackbarId2\n if (!isDefined(snackbarId)) {\n throw new Error('handleExitedSnack Cannot be called with undefined snackbarId')\n }\n\n this.setState((state) => {\n const newState = this.processQueue({\n ...state,\n snacks: state.snacks.filter(item => item.snackbarId !== snackbarId),\n })\n\n if (newState.queue.length === 0) {\n return newState\n }\n\n return this.handleDismissOldest(newState)\n })\n }\n}\n\n\nexport {SnackbarProvider}\nexport default SnackbarProvider\n"],"names":["createChainedFunction","clsx","Component","createPortal","SnackbarContainer","SnackbarContext","SnackbarItem","DEFAULTS","isDefined","merge","MESSAGES","omitContainerKeys","originKeyExtractor","REASONS","transformer","warning","SnackbarProvider","maxSnack","props","render","contextValue","state","dontspread1","allowDuplicate","dontspread2","variant","dontspread3","anchorOrigin","dontspread4","iconVariant","dense","hideIconVariant","domRoot","children","classes","categ","snacks","reduce","acc","current","category","existingOfCategory","snackbars","Object","keys","map","origin","Boolean","className","containerRoot","toContainerAnchorOrigin","snack","key","snackbarId","onClose","handleCloseSnack","onExited","handleExitedSnack","onEntered","handleEnteredSnack","Provider","value","enqueueSnackbar","message","opts","options","hasSpecifiedKey","id","Date","getTime","Math","random","merger","open","entered","requestClose","autoHideDuration","persist","undefined","setState","compareFunction","item","inQueue","queue","findIndex","inView","handleDisplaySnack","closeSnackbar","toBeClosed","find","INSTRUCTED","length","handleDismissOldest","processQueue","slice","some","popped","ignore","persistentCount","NO_PERSIST_ALL","MAXSNACK","node","isAppearing","Error","event","reason","CLICKAWAY","shouldCloseAll","filter","snackbarId1","snackbarId2","newState","bind"],"mappings":"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"}
@@ -0,0 +1,270 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * Part of the following typing and documentation is from
19
+ * material-ui/src/Snackbar/Snackbar.d.ts
20
+ */
21
+ import type { ClickAwayListenerProps, SnackbarClassKey, StandardProps } from '@mui/material';
22
+ import { TransitionProps } from '@mui/material/transitions';
23
+ import type { AriaAttributes, ComponentType, HTMLAttributes, Ref, SyntheticEvent } from 'react';
24
+ import type SnackbarProvider from './SnackbarProvider';
25
+ export type RequiredBy<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>;
26
+ export type ClassNameMap<ClassKey extends string = string> = Record<ClassKey, string>;
27
+ type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
28
+ export type SnackbarId = string | number;
29
+ export type VariantType = 'default' | 'error' | 'success' | 'warning' | 'info';
30
+ export type CloseReason = 'timeout' | 'clickaway' | 'maxsnack' | 'instructed';
31
+ export type SnackbarMessage = string | JSX.Node;
32
+ export type SnackbarAction = JSX.Node | ((snackbarId: SnackbarId) => JSX.Node);
33
+ export type SnackbarContentCallback = JSX.Node | ((snackbarId: SnackbarId, message: SnackbarMessage) => JSX.Node);
34
+ export type TransitionCloseHandler = (event: SyntheticEvent<any> | null, reason: CloseReason, snackbarId?: SnackbarId) => void;
35
+ export type TransitionEnterHandler = (node: HTMLElement, isAppearing: boolean, snackbarId: SnackbarId) => void;
36
+ export type TransitionHandler = (node: HTMLElement, snackbarId: SnackbarId) => void;
37
+ export type ContainerClassKey = 'containerRoot' | 'containerAnchorOriginTopCenter' | 'containerAnchorOriginBottomCenter' | 'containerAnchorOriginTopRight' | 'containerAnchorOriginBottomRight' | 'containerAnchorOriginTopLeft' | 'containerAnchorOriginBottomLeft';
38
+ export type VariantClassKey = 'variantSuccess' | 'variantError' | 'variantInfo' | 'variantWarning';
39
+ export type CombinedClassKey = VariantClassKey | ContainerClassKey | SnackbarClassKey;
40
+ export interface SnackbarOrigin {
41
+ vertical: 'top' | 'bottom';
42
+ horizontal: 'left' | 'center' | 'right';
43
+ }
44
+ export interface IconVariant {
45
+ /**
46
+ * Icon displayed when variant of a snackbar is set to `default`.
47
+ */
48
+ default: JSX.Node;
49
+ /**
50
+ * Icon displayed when variant of a snackbar is set to `error`.
51
+ */
52
+ error: JSX.Node;
53
+ /**
54
+ * Icon displayed when variant of a snackbar is set to `success`.
55
+ */
56
+ success: JSX.Node;
57
+ /**
58
+ * Icon displayed when variant of a snackbar is set to `warning`.
59
+ */
60
+ warning: JSX.Node;
61
+ /**
62
+ * Icon displayed when variant of a snackbar is set to `info`.
63
+ */
64
+ info: JSX.Node;
65
+ }
66
+ /**
67
+ * @category Shared
68
+ */
69
+ export interface TransitionHandlerProps {
70
+ /**
71
+ * Callback fired before snackbar requests to get closed.
72
+ * The `reason` parameter can optionally be used to control the response to
73
+ * `onClose`.
74
+ *
75
+ * @param {object} event The event source of the callback
76
+ * @param {string} reason Can be:`"timeout"` (`autoHideDuration` expired) or:
77
+ * `"clickaway"` or: `"maxsnack"` (snackbar was closed because `maxSnack`
78
+ * has reached) or: `"instructed"`
79
+ * (snackbar was closed programmatically)
80
+ * @param {string|number|undefined} snackbarId ID of a Snackbar. snackbarId
81
+ * will be `undefined` if closeSnackbar is called with no snackbarId (user
82
+ * requested all the snackbars to be closed)
83
+ */
84
+ onClose: TransitionCloseHandler;
85
+ /**
86
+ * Callback fired before the transition is entering.
87
+ */
88
+ onEnter: TransitionHandler;
89
+ /**
90
+ * Callback fired when the transition is entering.
91
+ */
92
+ onEntering: TransitionHandler;
93
+ /**
94
+ * Callback fired when the transition has entered.
95
+ */
96
+ onEntered: TransitionEnterHandler;
97
+ /**
98
+ * Callback fired before the transition is exiting.
99
+ */
100
+ onExit: TransitionHandler;
101
+ /**
102
+ * Callback fired when the transition is exiting.
103
+ */
104
+ onExiting: TransitionHandler;
105
+ /**
106
+ * Callback fired when the transition has exited.
107
+ */
108
+ onExited: TransitionHandler;
109
+ }
110
+ export type SnackbarContentProps = HTMLAttributes<HTMLDivElement>;
111
+ export type WithSnackbarProps = ProviderContext;
112
+ /**
113
+ * @category Shared
114
+ */
115
+ export interface SnackbarProps extends StandardProps<HTMLAttributes<HTMLDivElement>, SnackbarClassKey> {
116
+ /**
117
+ * The anchor of the `Snackbar`.
118
+ * @default { horizontal: left, vertical: bottom }
119
+ */
120
+ anchorOrigin?: SnackbarOrigin;
121
+ /**
122
+ * The number of milliseconds to wait before automatically calling the
123
+ * `onClose` function. By default snackbars get closed after 5000
124
+ * milliseconds. Set autoHideDuration to 'null' if you don't want snackbars
125
+ * to automatically close. Alternatively pass `persist: true` in the options
126
+ * parameter of enqueueSnackbar.
127
+ * @default 5000
128
+ */
129
+ autoHideDuration?: number | null;
130
+ /**
131
+ * @ignore
132
+ * Properties applied to ClickAwayListener component
133
+ */
134
+ ClickAwayListenerProps?: Partial<ClickAwayListenerProps>;
135
+ /**
136
+ * Aria attributes applied to snackbar's content component
137
+ */
138
+ ariaAttributes?: AriaAttributes;
139
+ /**
140
+ * If `true`, the `autoHideDuration` timer will expire even if the window is
141
+ * not focused.
142
+ * @default false
143
+ */
144
+ disableWindowBlurListener?: boolean;
145
+ /**
146
+ * The number of milliseconds to wait before dismissing after user
147
+ * interaction. If `autoHideDuration` property isn't specified, it does
148
+ * nothing. If `autoHideDuration` property is specified but
149
+ * `resumeHideDuration` isn't, we use the default value.
150
+ * @default autoHideDuration / 2 ms.
151
+ */
152
+ resumeHideDuration?: number;
153
+ /**
154
+ * The component used for the transition. (e.g. Slide, Grow, Zoom, etc.)
155
+ * @default Slide
156
+ */
157
+ TransitionComponent?: ComponentType<TransitionProps>;
158
+ /**
159
+ * The duration for the transition, in milliseconds.
160
+ * You may specify the duration with an object in the following shape:
161
+ * ```js
162
+ * transitionDuration={{ enter: 300, exit: 500 }}
163
+ * ```
164
+ * @default { enter: 225, exit: 195 }
165
+ */
166
+ transitionDuration?: {
167
+ appear?: number;
168
+ enter?: number;
169
+ exit?: number;
170
+ };
171
+ /**
172
+ * Properties applied to Transition component (e.g. Slide, Grow, Zoom, etc.)
173
+ */
174
+ TransitionProps?: TransitionProps;
175
+ }
176
+ /**
177
+ * @category Shared
178
+ */
179
+ export interface SharedProps extends Omit<SnackbarProps, 'classes' | 'content'>, Partial<TransitionHandlerProps> {
180
+ /**
181
+ * Used to easily display different variant of snackbars. When passed to
182
+ * `SnackbarProvider` all snackbars inherit the `variant`, unless you
183
+ * override it in `enqueueSnackbar` options.
184
+ * @default default
185
+ */
186
+ variant?: VariantType;
187
+ /**
188
+ * Ignores displaying multiple snackbars with the same `message`
189
+ * @default false
190
+ */
191
+ allowDuplicate?: boolean;
192
+ /**
193
+ * Replace the snackbar. Callback used for displaying entirely customized
194
+ * snackbar.
195
+ * @param {string|number} snackbarId ID of a snackbar
196
+ */
197
+ content?: SnackbarContentCallback;
198
+ /**
199
+ * Callback used for getting action(s). actions are mostly buttons displayed
200
+ * in Snackbar.
201
+ * @param {string|number} snackbarId ID of a snackbar
202
+ */
203
+ action?: SnackbarAction;
204
+ }
205
+ /**
206
+ * @category Enqueue
207
+ */
208
+ export interface OptionsObject extends SharedProps {
209
+ /**
210
+ * Unique identifier to reference a snackbar.
211
+ * @default random unique string
212
+ */
213
+ snackbarId?: SnackbarId;
214
+ /**
215
+ * Snackbar stays on the screen, unless it is dismissed (programmatically or
216
+ * through user interaction).
217
+ * @default false
218
+ */
219
+ persist?: boolean;
220
+ }
221
+ /**
222
+ * All material-ui props, including class keys for notistack and material-ui
223
+ * with additional notistack props
224
+ * @category Provider
225
+ */
226
+ export interface SnackbarProviderProps extends SharedProps {
227
+ /**
228
+ * Most of the time this is your App. every component from this point onward
229
+ * will be able to show snackbars.
230
+ */
231
+ children: JSX.Children;
232
+ /**
233
+ * Denser margins for snackbars. Recommended to be used on mobile devices.
234
+ * @default false
235
+ */
236
+ dense?: boolean;
237
+ /**
238
+ * Maximum snackbars that can be stacked on top of one another.
239
+ * @default 3
240
+ */
241
+ maxSnack?: number;
242
+ /**
243
+ * Hides iconVariant if set to `true`.
244
+ * @default false
245
+ */
246
+ hideIconVariant?: boolean;
247
+ /**
248
+ * Valid and exist HTML Node element, used to target `ReactDOM.createPortal`
249
+ */
250
+ domRoot?: HTMLElement;
251
+ /**
252
+ * Override or extend the styles applied to the container component or
253
+ * Snackbars.
254
+ */
255
+ classes?: Partial<ClassNameMap<CombinedClassKey>>;
256
+ /**
257
+ * Little icon that is displayed at left corner of a snackbar.
258
+ */
259
+ iconVariant?: Partial<IconVariant>;
260
+ /**
261
+ * @ignore
262
+ * SnackbarProvider's ref
263
+ */
264
+ ref?: Ref<SnackbarProvider>;
265
+ }
266
+ export interface ProviderContext {
267
+ enqueueSnackbar: (message: SnackbarMessage, options?: OptionsObject) => SnackbarId;
268
+ closeSnackbar: (snackbarId?: SnackbarId) => void;
269
+ }
270
+ export {};
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /**
17
+ * Part of the following typing and documentation is from
18
+ * material-ui/src/Snackbar/Snackbar.d.ts
19
+ */ export { };
20
+
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/shared/ui/snackstack/src/lib/types.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2022 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Part of the following typing and documentation is from\n * material-ui/src/Snackbar/Snackbar.d.ts\n */\nimport type {\n ClickAwayListenerProps,\n SnackbarClassKey,\n StandardProps,\n} from '@mui/material'\nimport { TransitionProps } from '@mui/material/transitions'\nimport type {\n AriaAttributes,\n ComponentType,\n HTMLAttributes,\n Ref,\n SyntheticEvent,\n} from 'react'\nimport type SnackbarProvider from './SnackbarProvider'\n\nexport type RequiredBy<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>\nexport type ClassNameMap<ClassKey extends string = string> = Record<\n ClassKey,\n string\n>\ntype Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>\ntype Modify<T, R> = Pick<T, Exclude<keyof T, keyof R>> & R\n\nexport type SnackbarId = string | number\nexport type VariantType = 'default' | 'error' | 'success' | 'warning' | 'info'\nexport type CloseReason = 'timeout' | 'clickaway' | 'maxsnack' | 'instructed'\n\nexport type SnackbarMessage = string | JSX.Node\nexport type SnackbarAction = JSX.Node | ((snackbarId: SnackbarId) => JSX.Node)\nexport type SnackbarContentCallback =\n | JSX.Node\n | ((snackbarId: SnackbarId, message: SnackbarMessage) => JSX.Node)\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TransitionCloseHandler = (\n event: SyntheticEvent<any> | null,\n reason: CloseReason,\n snackbarId?: SnackbarId,\n) => void\nexport type TransitionEnterHandler = (\n node: HTMLElement,\n isAppearing: boolean,\n snackbarId: SnackbarId,\n) => void\nexport type TransitionHandler = (\n node: HTMLElement,\n snackbarId: SnackbarId,\n) => void\n\nexport type ContainerClassKey =\n | 'containerRoot'\n | 'containerAnchorOriginTopCenter'\n | 'containerAnchorOriginBottomCenter'\n | 'containerAnchorOriginTopRight'\n | 'containerAnchorOriginBottomRight'\n | 'containerAnchorOriginTopLeft'\n | 'containerAnchorOriginBottomLeft'\n\nexport type VariantClassKey =\n | 'variantSuccess'\n | 'variantError'\n | 'variantInfo'\n | 'variantWarning'\nexport type CombinedClassKey =\n | VariantClassKey\n | ContainerClassKey\n | SnackbarClassKey\n\nexport interface SnackbarOrigin {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n}\n\nexport interface IconVariant {\n /**\n * Icon displayed when variant of a snackbar is set to `default`.\n */\n default: JSX.Node\n /**\n * Icon displayed when variant of a snackbar is set to `error`.\n */\n error: JSX.Node\n /**\n * Icon displayed when variant of a snackbar is set to `success`.\n */\n success: JSX.Node\n /**\n * Icon displayed when variant of a snackbar is set to `warning`.\n */\n warning: JSX.Node\n /**\n * Icon displayed when variant of a snackbar is set to `info`.\n */\n info: JSX.Node\n}\n\n/**\n * @category Shared\n */\nexport interface TransitionHandlerProps {\n /**\n * Callback fired before snackbar requests to get closed.\n * The `reason` parameter can optionally be used to control the response to\n * `onClose`.\n *\n * @param {object} event The event source of the callback\n * @param {string} reason Can be:`\"timeout\"` (`autoHideDuration` expired) or:\n * `\"clickaway\"` or: `\"maxsnack\"` (snackbar was closed because `maxSnack`\n * has reached) or: `\"instructed\"`\n * (snackbar was closed programmatically)\n * @param {string|number|undefined} snackbarId ID of a Snackbar. snackbarId\n * will be `undefined` if closeSnackbar is called with no snackbarId (user\n * requested all the snackbars to be closed)\n */\n onClose: TransitionCloseHandler\n /**\n * Callback fired before the transition is entering.\n */\n onEnter: TransitionHandler\n /**\n * Callback fired when the transition is entering.\n */\n onEntering: TransitionHandler\n /**\n * Callback fired when the transition has entered.\n */\n onEntered: TransitionEnterHandler\n /**\n * Callback fired before the transition is exiting.\n */\n onExit: TransitionHandler\n /**\n * Callback fired when the transition is exiting.\n */\n onExiting: TransitionHandler\n /**\n * Callback fired when the transition has exited.\n */\n onExited: TransitionHandler\n}\n\nexport type SnackbarContentProps = HTMLAttributes<HTMLDivElement>\n\n// backwards compatibility\nexport type WithSnackbarProps = ProviderContext\n\n/**\n * @category Shared\n */\nexport interface SnackbarProps\n extends StandardProps<HTMLAttributes<HTMLDivElement>, SnackbarClassKey> {\n /**\n * The anchor of the `Snackbar`.\n * @default { horizontal: left, vertical: bottom }\n */\n anchorOrigin?: SnackbarOrigin\n /**\n * The number of milliseconds to wait before automatically calling the\n * `onClose` function. By default snackbars get closed after 5000\n * milliseconds. Set autoHideDuration to 'null' if you don't want snackbars\n * to automatically close. Alternatively pass `persist: true` in the options\n * parameter of enqueueSnackbar.\n * @default 5000\n */\n autoHideDuration?: number | null\n /**\n * @ignore\n * Properties applied to ClickAwayListener component\n */\n ClickAwayListenerProps?: Partial<ClickAwayListenerProps>\n /**\n * Aria attributes applied to snackbar's content component\n */\n ariaAttributes?: AriaAttributes\n /**\n * If `true`, the `autoHideDuration` timer will expire even if the window is\n * not focused.\n * @default false\n */\n disableWindowBlurListener?: boolean\n /**\n * The number of milliseconds to wait before dismissing after user\n * interaction. If `autoHideDuration` property isn't specified, it does\n * nothing. If `autoHideDuration` property is specified but\n * `resumeHideDuration` isn't, we use the default value.\n * @default autoHideDuration / 2 ms.\n */\n resumeHideDuration?: number\n /**\n * The component used for the transition. (e.g. Slide, Grow, Zoom, etc.)\n * @default Slide\n */\n TransitionComponent?: ComponentType<TransitionProps>\n /**\n * The duration for the transition, in milliseconds.\n * You may specify the duration with an object in the following shape:\n * ```js\n * transitionDuration={{ enter: 300, exit: 500 }}\n * ```\n * @default { enter: 225, exit: 195 }\n */\n transitionDuration?: { appear?: number; enter?: number; exit?: number }\n /**\n * Properties applied to Transition component (e.g. Slide, Grow, Zoom, etc.)\n */\n TransitionProps?: TransitionProps\n}\n\n/**\n * @category Shared\n */\nexport interface SharedProps\n extends Omit<SnackbarProps, 'classes' | 'content'>,\n Partial<TransitionHandlerProps> {\n /**\n * Used to easily display different variant of snackbars. When passed to\n * `SnackbarProvider` all snackbars inherit the `variant`, unless you\n * override it in `enqueueSnackbar` options.\n * @default default\n */\n variant?: VariantType\n /**\n * Ignores displaying multiple snackbars with the same `message`\n * @default false\n */\n allowDuplicate?: boolean\n /**\n * Replace the snackbar. Callback used for displaying entirely customized\n * snackbar.\n * @param {string|number} snackbarId ID of a snackbar\n */\n content?: SnackbarContentCallback\n /**\n * Callback used for getting action(s). actions are mostly buttons displayed\n * in Snackbar.\n * @param {string|number} snackbarId ID of a snackbar\n */\n action?: SnackbarAction\n}\n\n/**\n * @category Enqueue\n */\nexport interface OptionsObject extends SharedProps {\n /**\n * Unique identifier to reference a snackbar.\n * @default random unique string\n */\n snackbarId?: SnackbarId\n /**\n * Snackbar stays on the screen, unless it is dismissed (programmatically or\n * through user interaction).\n * @default false\n */\n persist?: boolean\n}\n\n/**\n * All material-ui props, including class keys for notistack and material-ui\n * with additional notistack props\n * @category Provider\n */\nexport interface SnackbarProviderProps extends SharedProps {\n /**\n * Most of the time this is your App. every component from this point onward\n * will be able to show snackbars.\n */\n children: JSX.Children\n /**\n * Denser margins for snackbars. Recommended to be used on mobile devices.\n * @default false\n */\n dense?: boolean\n /**\n * Maximum snackbars that can be stacked on top of one another.\n * @default 3\n */\n maxSnack?: number\n /**\n * Hides iconVariant if set to `true`.\n * @default false\n */\n hideIconVariant?: boolean\n /**\n * Valid and exist HTML Node element, used to target `ReactDOM.createPortal`\n */\n domRoot?: HTMLElement\n /**\n * Override or extend the styles applied to the container component or\n * Snackbars.\n */\n classes?: Partial<ClassNameMap<CombinedClassKey>>\n /**\n * Little icon that is displayed at left corner of a snackbar.\n */\n iconVariant?: Partial<IconVariant>\n /**\n * @ignore\n * SnackbarProvider's ref\n */\n ref?: Ref<SnackbarProvider>\n}\n\nexport interface ProviderContext {\n enqueueSnackbar: (\n message: SnackbarMessage,\n options?: OptionsObject,\n ) => SnackbarId\n closeSnackbar: (snackbarId?: SnackbarId) => void\n}\n"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;CAGC,GAgTD,WAMC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import type { ProviderContext } from './types';
18
+ export declare function useSnackbar(): ProviderContext;
19
+ export default useSnackbar;