@australiangreens/ag-internal-components 0.0.21 → 0.0.23

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/cjs/index.js CHANGED
@@ -1,384 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __defProps = Object.defineProperties;
4
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
- var __spreadValues = (a, b) => {
10
- for (var prop in b || (b = {}))
11
- if (__hasOwnProp.call(b, prop))
12
- __defNormalProp(a, prop, b[prop]);
13
- if (__getOwnPropSymbols)
14
- for (var prop of __getOwnPropSymbols(b)) {
15
- if (__propIsEnum.call(b, prop))
16
- __defNormalProp(a, prop, b[prop]);
17
- }
18
- return a;
19
- };
20
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
- var __objRest = (source, exclude) => {
22
- var target = {};
23
- for (var prop in source)
24
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
- target[prop] = source[prop];
26
- if (source != null && __getOwnPropSymbols)
27
- for (var prop of __getOwnPropSymbols(source)) {
28
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
- target[prop] = source[prop];
30
- }
31
- return target;
32
- };
33
- var __publicField = (obj, key, value) => {
34
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
35
- return value;
36
- };
37
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
38
- const jsxRuntime = require("react/jsx-runtime");
39
- const react = require("react");
40
- const Button = require("@mui/material/Button");
41
- const Paper = require("@mui/material/Paper");
42
- const Typography = require("@mui/material/Typography");
43
- const styles = require("@mui/material/styles");
44
- const Snackbar = require("@mui/material/Snackbar");
45
- const Alert = require("@mui/material/Alert");
46
- const LinearProgress = require("@mui/material/LinearProgress");
47
- const CircularProgress = require("@mui/material/CircularProgress");
48
- const agError = require("@australiangreens/ag-error");
49
- const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
50
- const Button__default = /* @__PURE__ */ _interopDefault(Button);
51
- const Paper__default = /* @__PURE__ */ _interopDefault(Paper);
52
- const Typography__default = /* @__PURE__ */ _interopDefault(Typography);
53
- const Snackbar__default = /* @__PURE__ */ _interopDefault(Snackbar);
54
- const Alert__default = /* @__PURE__ */ _interopDefault(Alert);
55
- const LinearProgress__default = /* @__PURE__ */ _interopDefault(LinearProgress);
56
- const CircularProgress__default = /* @__PURE__ */ _interopDefault(CircularProgress);
57
- function ExampleComponent({ text }) {
58
- const [num, setNum] = react.useState(0);
59
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
60
- /* @__PURE__ */ jsxRuntime.jsx(Typography__default.default, { variant: "h6", color: "inherit", component: "div", sx: { fontSize: "22px" }, children: "Hello world" }),
61
- /* @__PURE__ */ jsxRuntime.jsx(Typography__default.default, { variant: "caption", display: "block", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Just ensuring MUI is working as planned as a peer dependency. v0.0.11" }) }),
62
- /* @__PURE__ */ jsxRuntime.jsx(
63
- Button__default.default,
64
- {
65
- variant: "outlined",
66
- onClick: () => setNum((oldNum) => oldNum + 1),
67
- "aria-label": "Increment",
68
- children: "Hello I am a button"
69
- }
70
- ),
71
- /* @__PURE__ */ jsxRuntime.jsxs("p", { children: [
72
- "This is some text: ",
73
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: text })
74
- ] }),
75
- /* @__PURE__ */ jsxRuntime.jsxs(Paper__default.default, { children: [
76
- "This number will incremember when button pressed: ",
77
- num
78
- ] })
79
- ] });
80
- }
81
- const internalAGSystemsTheme = styles.createTheme({
82
- palette: {
83
- primary: {
84
- main: "#007236",
85
- dark: "#005221",
86
- light: "#00A04E",
87
- contrastText: "#FFFFFF"
88
- },
89
- secondary: {
90
- main: "#662D91",
91
- dark: "#440E62",
92
- light: "#93268F",
93
- contrastText: "#FFFFFF"
94
- },
95
- error: {
96
- main: "#D32F2F",
97
- dark: "#C62828",
98
- light: "#EF5350"
99
- },
100
- info: {
101
- main: "#0288D1",
102
- dark: "#01579B",
103
- light: "#03A9F4"
104
- },
105
- success: {
106
- main: "#0288D1",
107
- dark: "#01579B",
108
- light: "#03A9F4"
109
- }
110
- },
111
- components: {
112
- MuiTextField: {
113
- defaultProps: { color: "secondary" }
114
- },
115
- MuiToggleButtonGroup: {
116
- defaultProps: { color: "secondary" }
117
- },
118
- MuiCheckbox: {
119
- defaultProps: { color: "secondary" }
120
- },
121
- MuiSelect: {
122
- defaultProps: { color: "secondary" }
123
- },
124
- MuiSwitch: {
125
- defaultProps: { color: "secondary" }
126
- },
127
- MuiFormControl: {
128
- defaultProps: { color: "secondary" }
129
- },
130
- MuiMenuItem: {
131
- // Setting defaultProps for color on MenuItem does not work, so update manually
132
- styleOverrides: {
133
- root: ({ theme }) => ({
134
- "&.Mui-selected": {
135
- backgroundColor: styles.alpha(
136
- theme.palette.secondary.main,
137
- theme.palette.action.selectedOpacity
138
- ),
139
- "&:hover": {
140
- backgroundColor: styles.alpha(
141
- theme.palette.secondary.main,
142
- theme.palette.action.selectedOpacity
143
- )
144
- },
145
- "&.Mui-focusVisible": {
146
- backgroundColor: styles.alpha(
147
- theme.palette.secondary.main,
148
- theme.palette.action.focusOpacity
149
- )
150
- }
151
- }
152
- })
153
- }
154
- }
155
- },
156
- typography: {
157
- // I couldn't think of what to call this. It is an attempt to match
158
- // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730
159
- // but not sure if line height should be changed
160
- explainer: {
161
- fontSize: "14px",
162
- marginBlockStart: "1em"
163
- },
164
- h3: {
165
- fontSize: "1rem",
166
- fontWeight: 700
167
- }
168
- }
169
- });
170
- const fed21Theme = styles.createTheme({
171
- palette: {
172
- primary: {
173
- dark: "#00A651",
174
- light: "#A3D39C",
175
- main: "#007236",
176
- contrastText: "#FFF"
177
- },
178
- warning: {
179
- main: "#F5871F",
180
- light: "#FCC589",
181
- dark: "#A2590A",
182
- contrastText: "#FFF"
183
- },
184
- secondary: {
185
- main: "#662D91",
186
- light: "#BD8CBF",
187
- dark: "#440E62",
188
- contrastText: "#FFF"
189
- },
190
- error: {
191
- main: "#D43C95",
192
- light: "#8F2064",
193
- dark: "#F9CDE0",
194
- contrastText: "#FFF"
195
- },
196
- info: {
197
- main: "#00A88D",
198
- light: "#ADDCCF",
199
- dark: "#005243",
200
- contrastText: "#FFF"
201
- },
202
- success: {
203
- main: "#00A651",
204
- light: "#A3D39C",
205
- dark: "#007236",
206
- contrastText: "#FFF"
207
- }
208
- },
209
- typography: {
210
- // I couldn't think of what to call this. It is an attempt to match
211
- // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730
212
- // but not sure if line height should be changed
213
- explainer: {
214
- fontSize: "14px",
215
- marginBlockStart: "1em"
216
- }
217
- }
218
- });
219
- function AgThemeProvider({
220
- name = "internal",
221
- children
222
- }) {
223
- const theme = name === "internal" ? internalAGSystemsTheme : name === "fed21" ? fed21Theme : void 0;
224
- return /* @__PURE__ */ jsxRuntime.jsx(styles.ThemeProvider, { theme, children });
225
- }
226
- class ContextError extends agError.AgError {
227
- }
228
- __publicField(ContextError, "errorName", "ContextError");
229
- const stub = () => {
230
- throw new ContextError("SaladBarContext can only be used in a child of a <SaladBarProvider>");
231
- };
232
- const notstub = (key) => {
233
- throw new ContextError("SaladBarContext can only be used in a child of a <SaladBarProvider>");
234
- };
235
- const defaultValue = {
236
- enqueueNotification: stub,
237
- enqueueSuccessNotification: stub,
238
- enqueueInfoNotification: stub,
239
- enqueueWarningNotification: stub,
240
- enqueueErrorNotification: stub,
241
- removeNotification: notstub
242
- };
243
- const SaladBarContext = react.createContext(defaultValue);
244
- const defaultSnackbarProps = {
245
- autoHideDuration: 6e3,
246
- anchorOrigin: { vertical: "top", horizontal: "center" },
247
- // The default is false. If we prefer timer to continue when window loses
248
- // focus, change to true
249
- disableWindowBlurListener: false
250
- };
251
- const defaultEnqueueNotificationOptions = {
252
- message: "",
253
- severity: "info",
254
- variant: "standard",
255
- progressIndicator: void 0
256
- // Can use 'circular' or 'linear'
257
- };
258
- const MAX_QUEUE_LENGTH = 100;
259
- const MAX_QUEUE_HIT_REPORT_INTERVAL = 2e3;
260
- const SALADBAR_INDEX = 2e3;
261
- const generateNotificationKey = (() => {
262
- let previousKey = 0;
263
- return () => {
264
- previousKey += 1;
265
- return previousKey;
266
- };
267
- })();
268
- const alertWithLinearProgressStyle = {
269
- borderBottomLeftRadius: "0px",
270
- borderBottomRightRadius: "0px"
271
- };
272
- function SaladBarProvider(_a) {
273
- var _b = _a, { children } = _b, snackbarProps = __objRest(_b, ["children"]);
274
- var _a2;
275
- const [open, setOpen] = react.useState(false);
276
- const queueRef = react.useRef([]);
277
- const limitLastHitAt = react.useRef(Date.now());
278
- const limitHitCountSinceLastReport = react.useRef(0);
279
- const enqueueNotification = (notification = {}) => {
280
- limitHitCountSinceLastReport.current += 1;
281
- if (queueRef.current.length >= MAX_QUEUE_LENGTH) {
282
- if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {
283
- limitLastHitAt.current = Date.now();
284
- console.error(
285
- `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`
286
- );
287
- limitHitCountSinceLastReport.current = 0;
288
- }
289
- }
290
- const newNotification = __spreadValues(__spreadProps(__spreadValues({}, defaultEnqueueNotificationOptions), {
291
- key: generateNotificationKey()
292
- }), notification);
293
- queueRef.current.push(newNotification);
294
- if (queueRef.current.length === 1)
295
- setOpen(true);
296
- return newNotification.key;
297
- };
298
- const enqueueSuccessNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "success" }, options));
299
- const enqueueInfoNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "info" }, options));
300
- const enqueueWarningNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "warning" }, options));
301
- const enqueueErrorNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "error" }, options));
302
- const removeNotification = (key) => {
303
- const index = queueRef.current.findIndex((x) => x.key === key);
304
- if (index === -1)
305
- return;
306
- if (index === 0) {
307
- setOpen(false);
308
- return queueRef.current[0];
309
- }
310
- return queueRef.current.splice(index, 1);
311
- };
312
- const handleClose = (_event) => {
313
- setOpen(false);
314
- };
315
- const handleExit = () => {
316
- };
317
- const handleExited = () => {
318
- queueRef.current.shift();
319
- if (queueRef.current.length > 0)
320
- setOpen(true);
321
- };
322
- const currentNotification = (_a2 = queueRef.current[0]) != null ? _a2 : __spreadValues({}, defaultEnqueueNotificationOptions);
323
- const currentNotificationSnackbarProps = {};
324
- if ("autoHideDuration" in currentNotification) {
325
- currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;
326
- }
327
- const snackbarFinalProps = __spreadValues(__spreadValues({}, defaultSnackbarProps), snackbarProps);
328
- return (
329
- // Should be resolved when we move to React >= 18
330
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
331
- // @ts-ignore
332
- /* @__PURE__ */ jsxRuntime.jsxs(
333
- SaladBarContext.Provider,
334
- {
335
- value: {
336
- enqueueNotification,
337
- enqueueSuccessNotification,
338
- enqueueInfoNotification,
339
- enqueueWarningNotification,
340
- enqueueErrorNotification,
341
- removeNotification
342
- },
343
- children: [
344
- children,
345
- /* @__PURE__ */ jsxRuntime.jsx(
346
- Snackbar__default.default,
347
- __spreadProps(__spreadValues(__spreadValues({}, snackbarFinalProps), currentNotificationSnackbarProps), {
348
- open,
349
- onClose: handleClose,
350
- TransitionProps: {
351
- onExited: handleExited,
352
- onExit: handleExit
353
- },
354
- sx: { zIndex: SALADBAR_INDEX },
355
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
356
- /* @__PURE__ */ jsxRuntime.jsx(
357
- Alert__default.default,
358
- {
359
- onClose: handleClose,
360
- severity: currentNotification.severity,
361
- variant: "filled",
362
- icon: currentNotification.progressIndicator === "circular" ? /* @__PURE__ */ jsxRuntime.jsx(CircularProgress__default.default, { size: "1em" }) : void 0,
363
- style: currentNotification.progressIndicator === "linear" ? alertWithLinearProgressStyle : void 0,
364
- children: currentNotification.message
365
- }
366
- ),
367
- currentNotification.progressIndicator === "linear" && /* @__PURE__ */ jsxRuntime.jsx(LinearProgress__default.default, { color: "primary" })
368
- ] })
369
- })
370
- )
371
- ]
372
- }
373
- )
374
- );
375
- }
376
- function useSaladBar() {
377
- return react.useContext(SaladBarContext);
378
- }
379
- exports.AgThemeProvider = AgThemeProvider;
380
- exports.ContextError = ContextError;
381
- exports.ExampleComponent = ExampleComponent;
382
- exports.SaladBarProvider = SaladBarProvider;
383
- exports.useSaladBar = useSaladBar;
1
+ "use strict";var G=Object.defineProperty,X=Object.defineProperties;var Q=Object.getOwnPropertyDescriptors;var g=Object.getOwnPropertySymbols;var T=Object.prototype.hasOwnProperty,_=Object.prototype.propertyIsEnumerable;var F=(e,t,r)=>t in e?G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,s=(e,t)=>{for(var r in t||(t={}))T.call(t,r)&&F(e,r,t[r]);if(g)for(var r of g(t))_.call(t,r)&&F(e,r,t[r]);return e},v=(e,t)=>X(e,Q(t));var A=(e,t)=>{var r={};for(var i in e)T.call(e,i)&&t.indexOf(i)<0&&(r[i]=e[i]);if(e!=null&&g)for(var i of g(e))t.indexOf(i)<0&&_.call(e,i)&&(r[i]=e[i]);return r};var b=(e,t,r)=>(F(e,typeof t!="symbol"?t+"":t,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),u=require("react"),V=require("@mui/material/Button"),$=require("@mui/material/Paper"),K=require("@mui/material/Typography"),f=require("@mui/material/styles"),J=require("@mui/material/Snackbar"),Y=require("@mui/material/Alert"),Z=require("@mui/material/LinearProgress"),ee=require("@mui/material/CircularProgress"),te=require("@australiangreens/ag-error"),d=e=>e&&e.__esModule?e:{default:e},re=d(V),ne=d($),B=d(K),oe=d(J),ae=d(Y),ie=d(Z),se=d(ee);function ce({text:e}){const[t,r]=u.useState(0);return o.jsxs(o.Fragment,{children:[o.jsx(B.default,{variant:"h6",color:"inherit",component:"div",sx:{fontSize:"22px"},children:"Hello world"}),o.jsx(B.default,{variant:"caption",display:"block",children:o.jsx("span",{children:"Just ensuring MUI is working as planned as a peer dependency. v0.0.11"})}),o.jsx(re.default,{variant:"outlined",onClick:()=>r(i=>i+1),"aria-label":"Increment",children:"Hello I am a button"}),o.jsxs("p",{children:["This is some text: ",o.jsx("span",{children:e})]}),o.jsxs(ne.default,{children:["This number will incremember when button pressed: ",t]})]})}const le=f.createTheme({palette:{primary:{main:"#007236",dark:"#005221",light:"#00A04E",contrastText:"#FFFFFF"},secondary:{main:"#662D91",dark:"#440E62",light:"#93268F",contrastText:"#FFFFFF"},error:{main:"#D32F2F",dark:"#C62828",light:"#EF5350"},info:{main:"#0288D1",dark:"#01579B",light:"#03A9F4"},success:{main:"#0288D1",dark:"#01579B",light:"#03A9F4"}},components:{MuiTextField:{defaultProps:{color:"secondary"}},MuiToggleButtonGroup:{defaultProps:{color:"secondary"}},MuiCheckbox:{defaultProps:{color:"secondary"}},MuiSelect:{defaultProps:{color:"secondary"}},MuiSwitch:{defaultProps:{color:"secondary"}},MuiFormControl:{defaultProps:{color:"secondary"}},MuiMenuItem:{styleOverrides:{root:({theme:e})=>({"&.Mui-selected":{backgroundColor:f.alpha(e.palette.secondary.main,e.palette.action.selectedOpacity),"&:hover":{backgroundColor:f.alpha(e.palette.secondary.main,e.palette.action.selectedOpacity)},"&.Mui-focusVisible":{backgroundColor:f.alpha(e.palette.secondary.main,e.palette.action.focusOpacity)}}})}}},typography:{explainer:{fontSize:"14px",marginBlockStart:"1em"},h3:{fontSize:"1rem",fontWeight:700}}}),ue=f.createTheme({palette:{primary:{dark:"#00A651",light:"#A3D39C",main:"#007236",contrastText:"#FFF"},warning:{main:"#F5871F",light:"#FCC589",dark:"#A2590A",contrastText:"#FFF"},secondary:{main:"#662D91",light:"#BD8CBF",dark:"#440E62",contrastText:"#FFF"},error:{main:"#D43C95",light:"#8F2064",dark:"#F9CDE0",contrastText:"#FFF"},info:{main:"#00A88D",light:"#ADDCCF",dark:"#005243",contrastText:"#FFF"},success:{main:"#00A651",light:"#A3D39C",dark:"#007236",contrastText:"#FFF"}},typography:{explainer:{fontSize:"14px",marginBlockStart:"1em"}}});function de({name:e="internal",children:t}){const r=e==="internal"?le:e==="fed21"?ue:void 0;return o.jsx(f.ThemeProvider,{theme:r,children:t})}class x extends te.AgError{}b(x,"errorName","ContextError");const h=()=>{throw new x("SaladBarContext can only be used in a child of a <SaladBarProvider>")},fe=e=>{throw new x("SaladBarContext can only be used in a child of a <SaladBarProvider>")},pe={enqueueNotification:h,enqueueSuccessNotification:h,enqueueInfoNotification:h,enqueueWarningNotification:h,enqueueErrorNotification:h,removeNotification:fe},j=u.createContext(pe),he={autoHideDuration:6e3,anchorOrigin:{vertical:"top",horizontal:"center"},disableWindowBlurListener:!1},me={shouldClose:(e,t)=>t!=="clickaway"},q={message:"",severity:"info",variant:"standard",progressIndicator:void 0},D=100,N=2e3,ge=2e3,xe=(()=>{let e=0;return()=>(e+=1,e)})(),ye={borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px"};function Fe(i){var C=i,{children:e,shouldClose:t=me.shouldClose}=C,r=A(C,["children","shouldClose"]);var P;const[w,m]=u.useState(!1),c=u.useRef([]),S=u.useRef(Date.now()),y=u.useRef(0),p=(a={})=>{y.current+=1,c.current.length>=D&&Date.now()-S.current>=N&&(S.current=Date.now(),console.error(`SaladBarProvider: MAX_QUEUE_LENGTH (${D}) hit ${y.current} times in last ${N}ms)`),y.current=0);const n=s(v(s({},q),{key:xe()}),a);return c.current.push(n),c.current.length===1&&m(!0),n.key},M=(a="",n={})=>p(s({message:a,severity:"success"},n)),I=(a="",n={})=>p(s({message:a,severity:"info"},n)),R=(a="",n={})=>p(s({message:a,severity:"warning"},n)),H=(a="",n={})=>p(s({message:a,severity:"error"},n)),L=a=>{const n=c.current.findIndex(W=>W.key===a);if(n!==-1)return n===0?(m(!1),c.current[0]):c.current.splice(n,1)},k=(a,n)=>{t(a,n)&&m(!1)},O=()=>{},z=()=>{c.current.shift(),c.current.length>0&&m(!0)},l=(P=c.current[0])!=null?P:s({},q),E={};"autoHideDuration"in l&&(E.autoHideDuration=l.autoHideDuration);const U=s(s({},he),r);return o.jsxs(j.Provider,{value:{enqueueNotification:p,enqueueSuccessNotification:M,enqueueInfoNotification:I,enqueueWarningNotification:R,enqueueErrorNotification:H,removeNotification:L},children:[e,o.jsx(oe.default,v(s(s({},U),E),{open:w,onClose:k,TransitionProps:{onExited:z,onExit:O},sx:{zIndex:ge},children:o.jsxs("div",{children:[o.jsx(ae.default,{onClose:a=>k(a,"closeAlert"),severity:l.severity,variant:"filled",icon:l.progressIndicator==="circular"?o.jsx(se.default,{size:"1em"}):void 0,style:l.progressIndicator==="linear"?ye:void 0,children:l.message}),l.progressIndicator==="linear"&&o.jsx(ie.default,{color:"primary"})]})}))]})}function ve(){return u.useContext(j)}exports.AgThemeProvider=de;exports.ContextError=x;exports.ExampleComponent=ce;exports.SaladBarProvider=Fe;exports.useSaladBar=ve;
384
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/providers/AgTheme/themes.ts","../../src/providers/AgTheme/index.tsx","../../src/errors/ContextError.ts","../../src/providers/SaladBar/SaladBarContext.ts","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarProvider.tsx","../../src/providers/SaladBar/useSaladBar.ts"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\nexport interface ExampleComponentProps {\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { alpha, createTheme } from '@mui/material/styles';\n\nexport const internalAGSystemsTheme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n});\n\nexport const fed21Theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n});\n","import { PropsWithChildren } from 'react';\nimport { ThemeProvider } from '@mui/material/styles';\n\nimport { internalAGSystemsTheme, fed21Theme } from './themes';\n\nexport type AgThemeName = 'internal' | 'fed21';\n\nexport interface AgThemeProviderProps {\n name?: AgThemeName;\n}\n\nexport default function AgThemeProvider({\n name = 'internal',\n children,\n}: PropsWithChildren<AgThemeProviderProps>) {\n const theme =\n name === 'internal' ? internalAGSystemsTheme : name === 'fed21' ? fed21Theme : undefined;\n\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext } from 'react';\n\nimport { ContextError } from '../../errors/ContextError';\n\nconst stub: () => void = () => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\nexport type NotificationType = {\n key: number;\n message: string;\n severity: 'success' | 'info' | 'warning' | 'error' | undefined;\n variant: 'standard' | 'outlined' | 'filled' | undefined;\n progressIndicator: string | undefined;\n autoHideDuration: number | undefined;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst notstub = (key: unknown): NotificationType | NotificationType[] | void => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\ntype SaladBarContextFunction = typeof stub | typeof notstub;\n\ntype SaladBarContextType = {\n enqueueNotification: SaladBarContextFunction; // Call as enqueueNotification(options)\n // where options include message and severity of 'error' ,'warning', 'info' or\n // 'success'\n enqueueSuccessNotification: SaladBarContextFunction; // Call as const key =\n // enqueueSuccessNotification(msg),\n enqueueInfoNotification: SaladBarContextFunction; // Call as const key =\n // enqueueInfoNotification(msg),\n enqueueWarningNotification: SaladBarContextFunction; // Call as const key =\n // enqueueWarningNotification(msg),\n enqueueErrorNotification: SaladBarContextFunction; // Call as const key =\n // enqueueErrorNotification(msg),\n removeNotification: SaladBarContextFunction; // Call as enqueueErrorNotification(key),\n};\n\n// The defaultValue argument is only used when a component does not have a\n// matching Provider above it in the tree. See\n// https://reactjs.org/docs/context.html#reactcreatecontext\n// Using createContext doesn't itself maintain any type of state exactly, it\n// just provides a way for children to access shared references.\nconst defaultValue = {\n enqueueNotification: stub,\n enqueueSuccessNotification: stub,\n enqueueInfoNotification: stub,\n enqueueWarningNotification: stub,\n enqueueErrorNotification: stub,\n removeNotification: notstub,\n} as SaladBarContextType;\n\n/**\n * @returns A SaladBarContext\n */\nconst SaladBarContext = createContext(defaultValue);\n\nexport default SaladBarContext;\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState } from 'react';\nimport Snackbar, { SnackbarProps } from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport SaladBarContext, { NotificationType } from './SaladBarContext';\nimport { defaultSnackbarProps, defaultEnqueueNotificationOptions } from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\nexport interface SaladBarProviderProps extends SnackbarProps {}\n\nexport default function SaladBarProvider({ children, ...snackbarProps }: SaladBarProviderProps) {\n const [open, setOpen] = useState(false);\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<NotificationType[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const enqueueNotification = (notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as NotificationType);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setOpen(true);\n\n return newNotification.key;\n };\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: unknown) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setOpen(false);\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n // Callback fired when the component requests to be closed\n // const handleClose = (_event, reason) => {\n // // We ignore click away, letting user continue with UI while its still\n // // displayed\n // if (reason === 'clickaway') return;\n\n // setOpen(false);\n // };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const handleClose = (_event: Event | React.SyntheticEvent<Element, Event>) => {\n // We ignore click away, letting user continue with UI while its still\n // displayed\n\n setOpen(false);\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setOpen(true);\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose.\n\n const snackbarFinalProps = { ...defaultSnackbarProps, ...snackbarProps };\n\n return (\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n <SaladBarContext.Provider\n value={{\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n }}\n >\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={handleClose}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </SaladBarContext.Provider>\n );\n}\n","import { useContext } from 'react';\nimport SaladBarContext from './SaladBarContext';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport default function useSaladBar() {\n return useContext(SaladBarContext);\n}\n"],"names":["useState","jsxs","Fragment","jsx","Typography","Button","Paper","createTheme","alpha","ThemeProvider","AgError","createContext","useRef","_a","Snackbar","Alert","CircularProgress","LinearProgress","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/providers/AgTheme/themes.ts","../../src/providers/AgTheme/index.tsx","../../src/errors/ContextError.ts","../../src/providers/SaladBar/SaladBarContext.ts","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarProvider.tsx","../../src/providers/SaladBar/useSaladBar.ts"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\nexport interface ExampleComponentProps {\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { alpha, createTheme } from '@mui/material/styles';\n\nexport const internalAGSystemsTheme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n});\n\nexport const fed21Theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n});\n","import { PropsWithChildren } from 'react';\nimport { ThemeProvider } from '@mui/material/styles';\n\nimport { internalAGSystemsTheme, fed21Theme } from './themes';\n\nexport type AgThemeName = 'internal' | 'fed21';\n\nexport interface AgThemeProviderProps {\n name?: AgThemeName;\n}\n\nexport default function AgThemeProvider({\n name = 'internal',\n children,\n}: PropsWithChildren<AgThemeProviderProps>) {\n const theme =\n name === 'internal' ? internalAGSystemsTheme : name === 'fed21' ? fed21Theme : undefined;\n\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext } from 'react';\n\nimport { ContextError } from '../../errors/ContextError';\n\nconst stub: () => void = () => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\nexport type NotificationType = {\n key: number;\n message: string;\n severity: 'success' | 'info' | 'warning' | 'error' | undefined;\n variant: 'standard' | 'outlined' | 'filled' | undefined;\n progressIndicator: string | undefined;\n autoHideDuration: number | undefined;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst notstub = (key: unknown): NotificationType | NotificationType[] | void => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\ntype SaladBarContextFunction = typeof stub | typeof notstub;\n\ntype SaladBarContextType = {\n enqueueNotification: SaladBarContextFunction; // Call as enqueueNotification(options)\n // where options include message and severity of 'error' ,'warning', 'info' or\n // 'success'\n enqueueSuccessNotification: SaladBarContextFunction; // Call as const key =\n // enqueueSuccessNotification(msg),\n enqueueInfoNotification: SaladBarContextFunction; // Call as const key =\n // enqueueInfoNotification(msg),\n enqueueWarningNotification: SaladBarContextFunction; // Call as const key =\n // enqueueWarningNotification(msg),\n enqueueErrorNotification: SaladBarContextFunction; // Call as const key =\n // enqueueErrorNotification(msg),\n removeNotification: SaladBarContextFunction; // Call as enqueueErrorNotification(key),\n};\n\n// The defaultValue argument is only used when a component does not have a\n// matching Provider above it in the tree. See\n// https://reactjs.org/docs/context.html#reactcreatecontext\n// Using createContext doesn't itself maintain any type of state exactly, it\n// just provides a way for children to access shared references.\nconst defaultValue = {\n enqueueNotification: stub,\n enqueueSuccessNotification: stub,\n enqueueInfoNotification: stub,\n enqueueWarningNotification: stub,\n enqueueErrorNotification: stub,\n removeNotification: notstub,\n} as SaladBarContextType;\n\n/**\n * @returns A SaladBarContext\n */\nconst SaladBarContext = createContext(defaultValue);\n\nexport default SaladBarContext;\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultSaladBarProps = {\n shouldClose: (_event: Event | React.SyntheticEvent<Element, Event>, reason: string) => {\n return reason !== 'clickaway';\n },\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState } from 'react';\nimport Snackbar, { SnackbarProps, SnackbarCloseReason } from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport SaladBarContext, { NotificationType } from './SaladBarContext';\nimport {\n defaultSaladBarProps,\n defaultSnackbarProps,\n defaultEnqueueNotificationOptions,\n} from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\nexport type SaladBarCloseReason = SnackbarCloseReason | 'closeAlert';\n\nexport interface SaladBarProviderProps extends SnackbarProps {\n /** Called when an event triggers closing of currently displayed snackbar.\n * Default implementation returns false if reason is 'clickaway', otherwise\n * true.*/\n shouldClose?: (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => boolean;\n}\n\nexport default function SaladBarProvider({\n children,\n shouldClose = defaultSaladBarProps.shouldClose,\n ...snackbarProps\n}: SaladBarProviderProps) {\n const [open, setOpen] = useState(false);\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<NotificationType[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const enqueueNotification = (notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as NotificationType);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setOpen(true);\n\n return newNotification.key;\n };\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: unknown) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setOpen(false);\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n const handleClose = (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => {\n if (shouldClose(event, reason)) setOpen(false);\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setOpen(true);\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose.\n\n const snackbarFinalProps = { ...defaultSnackbarProps, ...snackbarProps };\n\n return (\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n <SaladBarContext.Provider\n value={{\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n }}\n >\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={(event) => handleClose(event, 'closeAlert')}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </SaladBarContext.Provider>\n );\n}\n","import { useContext } from 'react';\nimport SaladBarContext from './SaladBarContext';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport default function useSaladBar() {\n return useContext(SaladBarContext);\n}\n"],"names":["ExampleComponent","text","num","setNum","useState","jsxs","Fragment","jsx","Typography","Button","oldNum","Paper","internalAGSystemsTheme","createTheme","theme","alpha","fed21Theme","AgThemeProvider","name","children","ThemeProvider","ContextError","AgError","__publicField","stub","notstub","key","defaultValue","SaladBarContext","createContext","defaultSnackbarProps","defaultSaladBarProps","_event","reason","defaultEnqueueNotificationOptions","MAX_QUEUE_LENGTH","MAX_QUEUE_HIT_REPORT_INTERVAL","SALADBAR_INDEX","generateNotificationKey","previousKey","alertWithLinearProgressStyle","SaladBarProvider","_a","_b","shouldClose","snackbarProps","__objRest","open","setOpen","queueRef","useRef","limitLastHitAt","limitHitCountSinceLastReport","enqueueNotification","notification","newNotification","__spreadValues","__spreadProps","enqueueSuccessNotification","message","options","enqueueInfoNotification","enqueueWarningNotification","enqueueErrorNotification","removeNotification","index","x","handleClose","event","handleExit","handleExited","currentNotification","currentNotificationSnackbarProps","snackbarFinalProps","Snackbar","Alert","CircularProgress","LinearProgress","useSaladBar","useContext"],"mappings":"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"}
package/dist/esm/index.js CHANGED
@@ -1,74 +1,61 @@
1
- var __defProp = Object.defineProperty;
2
- var __defProps = Object.defineProperties;
3
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
- var __spreadValues = (a, b) => {
9
- for (var prop in b || (b = {}))
10
- if (__hasOwnProp.call(b, prop))
11
- __defNormalProp(a, prop, b[prop]);
12
- if (__getOwnPropSymbols)
13
- for (var prop of __getOwnPropSymbols(b)) {
14
- if (__propIsEnum.call(b, prop))
15
- __defNormalProp(a, prop, b[prop]);
16
- }
17
- return a;
18
- };
19
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
- var __objRest = (source, exclude) => {
21
- var target = {};
22
- for (var prop in source)
23
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
- target[prop] = source[prop];
25
- if (source != null && __getOwnPropSymbols)
26
- for (var prop of __getOwnPropSymbols(source)) {
27
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
- target[prop] = source[prop];
29
- }
30
- return target;
31
- };
32
- var __publicField = (obj, key, value) => {
33
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
34
- return value;
1
+ var V = Object.defineProperty, $ = Object.defineProperties;
2
+ var j = Object.getOwnPropertyDescriptors;
3
+ var m = Object.getOwnPropertySymbols;
4
+ var T = Object.prototype.hasOwnProperty, N = Object.prototype.propertyIsEnumerable;
5
+ var F = (e, t, r) => t in e ? V(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r, a = (e, t) => {
6
+ for (var r in t || (t = {}))
7
+ T.call(t, r) && F(e, r, t[r]);
8
+ if (m)
9
+ for (var r of m(t))
10
+ N.call(t, r) && F(e, r, t[r]);
11
+ return e;
12
+ }, g = (e, t) => $(e, j(t));
13
+ var P = (e, t) => {
14
+ var r = {};
15
+ for (var i in e)
16
+ T.call(e, i) && t.indexOf(i) < 0 && (r[i] = e[i]);
17
+ if (e != null && m)
18
+ for (var i of m(e))
19
+ t.indexOf(i) < 0 && N.call(e, i) && (r[i] = e[i]);
20
+ return r;
35
21
  };
36
- import { jsxs, Fragment, jsx } from "react/jsx-runtime";
37
- import { useState, createContext, useRef, useContext } from "react";
38
- import Button from "@mui/material/Button";
39
- import Paper from "@mui/material/Paper";
40
- import Typography from "@mui/material/Typography";
41
- import { createTheme, alpha, ThemeProvider } from "@mui/material/styles";
42
- import Snackbar from "@mui/material/Snackbar";
43
- import Alert from "@mui/material/Alert";
44
- import LinearProgress from "@mui/material/LinearProgress";
45
- import CircularProgress from "@mui/material/CircularProgress";
46
- import { AgError } from "@australiangreens/ag-error";
47
- function ExampleComponent({ text }) {
48
- const [num, setNum] = useState(0);
49
- return /* @__PURE__ */ jsxs(Fragment, { children: [
50
- /* @__PURE__ */ jsx(Typography, { variant: "h6", color: "inherit", component: "div", sx: { fontSize: "22px" }, children: "Hello world" }),
51
- /* @__PURE__ */ jsx(Typography, { variant: "caption", display: "block", children: /* @__PURE__ */ jsx("span", { children: "Just ensuring MUI is working as planned as a peer dependency. v0.0.11" }) }),
52
- /* @__PURE__ */ jsx(
53
- Button,
22
+ var b = (e, t, r) => (F(e, typeof t != "symbol" ? t + "" : t, r), r);
23
+ import { jsxs as p, Fragment as K, jsx as s } from "react/jsx-runtime";
24
+ import { useState as M, createContext as J, useRef as y, useContext as Y } from "react";
25
+ import Z from "@mui/material/Button";
26
+ import ee from "@mui/material/Paper";
27
+ import D from "@mui/material/Typography";
28
+ import { createTheme as q, alpha as x, ThemeProvider as te } from "@mui/material/styles";
29
+ import re from "@mui/material/Snackbar";
30
+ import oe from "@mui/material/Alert";
31
+ import ne from "@mui/material/LinearProgress";
32
+ import ie from "@mui/material/CircularProgress";
33
+ import { AgError as ae } from "@australiangreens/ag-error";
34
+ function Pe({ text: e }) {
35
+ const [t, r] = M(0);
36
+ return /* @__PURE__ */ p(K, { children: [
37
+ /* @__PURE__ */ s(D, { variant: "h6", color: "inherit", component: "div", sx: { fontSize: "22px" }, children: "Hello world" }),
38
+ /* @__PURE__ */ s(D, { variant: "caption", display: "block", children: /* @__PURE__ */ s("span", { children: "Just ensuring MUI is working as planned as a peer dependency. v0.0.11" }) }),
39
+ /* @__PURE__ */ s(
40
+ Z,
54
41
  {
55
42
  variant: "outlined",
56
- onClick: () => setNum((oldNum) => oldNum + 1),
43
+ onClick: () => r((i) => i + 1),
57
44
  "aria-label": "Increment",
58
45
  children: "Hello I am a button"
59
46
  }
60
47
  ),
61
- /* @__PURE__ */ jsxs("p", { children: [
48
+ /* @__PURE__ */ p("p", { children: [
62
49
  "This is some text: ",
63
- /* @__PURE__ */ jsx("span", { children: text })
50
+ /* @__PURE__ */ s("span", { children: e })
64
51
  ] }),
65
- /* @__PURE__ */ jsxs(Paper, { children: [
52
+ /* @__PURE__ */ p(ee, { children: [
66
53
  "This number will incremember when button pressed: ",
67
- num
54
+ t
68
55
  ] })
69
56
  ] });
70
57
  }
71
- const internalAGSystemsTheme = createTheme({
58
+ const se = q({
72
59
  palette: {
73
60
  primary: {
74
61
  main: "#007236",
@@ -120,22 +107,22 @@ const internalAGSystemsTheme = createTheme({
120
107
  MuiMenuItem: {
121
108
  // Setting defaultProps for color on MenuItem does not work, so update manually
122
109
  styleOverrides: {
123
- root: ({ theme }) => ({
110
+ root: ({ theme: e }) => ({
124
111
  "&.Mui-selected": {
125
- backgroundColor: alpha(
126
- theme.palette.secondary.main,
127
- theme.palette.action.selectedOpacity
112
+ backgroundColor: x(
113
+ e.palette.secondary.main,
114
+ e.palette.action.selectedOpacity
128
115
  ),
129
116
  "&:hover": {
130
- backgroundColor: alpha(
131
- theme.palette.secondary.main,
132
- theme.palette.action.selectedOpacity
117
+ backgroundColor: x(
118
+ e.palette.secondary.main,
119
+ e.palette.action.selectedOpacity
133
120
  )
134
121
  },
135
122
  "&.Mui-focusVisible": {
136
- backgroundColor: alpha(
137
- theme.palette.secondary.main,
138
- theme.palette.action.focusOpacity
123
+ backgroundColor: x(
124
+ e.palette.secondary.main,
125
+ e.palette.action.focusOpacity
139
126
  )
140
127
  }
141
128
  }
@@ -156,8 +143,7 @@ const internalAGSystemsTheme = createTheme({
156
143
  fontWeight: 700
157
144
  }
158
145
  }
159
- });
160
- const fed21Theme = createTheme({
146
+ }), ce = q({
161
147
  palette: {
162
148
  primary: {
163
149
  dark: "#00A651",
@@ -206,155 +192,116 @@ const fed21Theme = createTheme({
206
192
  }
207
193
  }
208
194
  });
209
- function AgThemeProvider({
210
- name = "internal",
211
- children
195
+ function be({
196
+ name: e = "internal",
197
+ children: t
212
198
  }) {
213
- const theme = name === "internal" ? internalAGSystemsTheme : name === "fed21" ? fed21Theme : void 0;
214
- return /* @__PURE__ */ jsx(ThemeProvider, { theme, children });
199
+ return /* @__PURE__ */ s(te, { theme: e === "internal" ? se : e === "fed21" ? ce : void 0, children: t });
215
200
  }
216
- class ContextError extends AgError {
201
+ class v extends ae {
217
202
  }
218
- __publicField(ContextError, "errorName", "ContextError");
219
- const stub = () => {
220
- throw new ContextError("SaladBarContext can only be used in a child of a <SaladBarProvider>");
221
- };
222
- const notstub = (key) => {
223
- throw new ContextError("SaladBarContext can only be used in a child of a <SaladBarProvider>");
224
- };
225
- const defaultValue = {
226
- enqueueNotification: stub,
227
- enqueueSuccessNotification: stub,
228
- enqueueInfoNotification: stub,
229
- enqueueWarningNotification: stub,
230
- enqueueErrorNotification: stub,
231
- removeNotification: notstub
232
- };
233
- const SaladBarContext = createContext(defaultValue);
234
- const defaultSnackbarProps = {
203
+ b(v, "errorName", "ContextError");
204
+ const d = () => {
205
+ throw new v("SaladBarContext can only be used in a child of a <SaladBarProvider>");
206
+ }, le = (e) => {
207
+ throw new v("SaladBarContext can only be used in a child of a <SaladBarProvider>");
208
+ }, ue = {
209
+ enqueueNotification: d,
210
+ enqueueSuccessNotification: d,
211
+ enqueueInfoNotification: d,
212
+ enqueueWarningNotification: d,
213
+ enqueueErrorNotification: d,
214
+ removeNotification: le
215
+ }, H = J(ue), de = {
235
216
  autoHideDuration: 6e3,
236
217
  anchorOrigin: { vertical: "top", horizontal: "center" },
237
218
  // The default is false. If we prefer timer to continue when window loses
238
219
  // focus, change to true
239
- disableWindowBlurListener: false
240
- };
241
- const defaultEnqueueNotificationOptions = {
220
+ disableWindowBlurListener: !1
221
+ }, pe = {
222
+ shouldClose: (e, t) => t !== "clickaway"
223
+ }, B = {
242
224
  message: "",
243
225
  severity: "info",
244
226
  variant: "standard",
245
227
  progressIndicator: void 0
246
228
  // Can use 'circular' or 'linear'
247
- };
248
- const MAX_QUEUE_LENGTH = 100;
249
- const MAX_QUEUE_HIT_REPORT_INTERVAL = 2e3;
250
- const SALADBAR_INDEX = 2e3;
251
- const generateNotificationKey = (() => {
252
- let previousKey = 0;
253
- return () => {
254
- previousKey += 1;
255
- return previousKey;
256
- };
257
- })();
258
- const alertWithLinearProgressStyle = {
229
+ }, w = 100, I = 2e3, fe = 2e3, me = (() => {
230
+ let e = 0;
231
+ return () => (e += 1, e);
232
+ })(), he = {
259
233
  borderBottomLeftRadius: "0px",
260
234
  borderBottomRightRadius: "0px"
261
235
  };
262
- function SaladBarProvider(_a) {
263
- var _b = _a, { children } = _b, snackbarProps = __objRest(_b, ["children"]);
264
- var _a2;
265
- const [open, setOpen] = useState(false);
266
- const queueRef = useRef([]);
267
- const limitLastHitAt = useRef(Date.now());
268
- const limitHitCountSinceLastReport = useRef(0);
269
- const enqueueNotification = (notification = {}) => {
270
- limitHitCountSinceLastReport.current += 1;
271
- if (queueRef.current.length >= MAX_QUEUE_LENGTH) {
272
- if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {
273
- limitLastHitAt.current = Date.now();
274
- console.error(
275
- `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`
276
- );
277
- limitHitCountSinceLastReport.current = 0;
278
- }
279
- }
280
- const newNotification = __spreadValues(__spreadProps(__spreadValues({}, defaultEnqueueNotificationOptions), {
281
- key: generateNotificationKey()
282
- }), notification);
283
- queueRef.current.push(newNotification);
284
- if (queueRef.current.length === 1)
285
- setOpen(true);
286
- return newNotification.key;
287
- };
288
- const enqueueSuccessNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "success" }, options));
289
- const enqueueInfoNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "info" }, options));
290
- const enqueueWarningNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "warning" }, options));
291
- const enqueueErrorNotification = (message = "", options = {}) => enqueueNotification(__spreadValues({ message, severity: "error" }, options));
292
- const removeNotification = (key) => {
293
- const index = queueRef.current.findIndex((x) => x.key === key);
294
- if (index === -1)
295
- return;
296
- if (index === 0) {
297
- setOpen(false);
298
- return queueRef.current[0];
299
- }
300
- return queueRef.current.splice(index, 1);
301
- };
302
- const handleClose = (_event) => {
303
- setOpen(false);
304
- };
305
- const handleExit = () => {
306
- };
307
- const handleExited = () => {
308
- queueRef.current.shift();
309
- if (queueRef.current.length > 0)
310
- setOpen(true);
311
- };
312
- const currentNotification = (_a2 = queueRef.current[0]) != null ? _a2 : __spreadValues({}, defaultEnqueueNotificationOptions);
313
- const currentNotificationSnackbarProps = {};
314
- if ("autoHideDuration" in currentNotification) {
315
- currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;
316
- }
317
- const snackbarFinalProps = __spreadValues(__spreadValues({}, defaultSnackbarProps), snackbarProps);
236
+ function De(i) {
237
+ var C = i, {
238
+ children: e,
239
+ shouldClose: t = pe.shouldClose
240
+ } = C, r = P(C, [
241
+ "children",
242
+ "shouldClose"
243
+ ]);
244
+ var A;
245
+ const [L, f] = M(!1), c = y([]), k = y(Date.now()), h = y(0), u = (n = {}) => {
246
+ h.current += 1, c.current.length >= w && Date.now() - k.current >= I && (k.current = Date.now(), console.error(
247
+ `SaladBarProvider: MAX_QUEUE_LENGTH (${w}) hit ${h.current} times in last ${I}ms)`
248
+ ), h.current = 0);
249
+ const o = a(g(a({}, B), {
250
+ key: me()
251
+ }), n);
252
+ return c.current.push(o), c.current.length === 1 && f(!0), o.key;
253
+ }, R = (n = "", o = {}) => u(a({ message: n, severity: "success" }, o)), _ = (n = "", o = {}) => u(a({ message: n, severity: "info" }, o)), O = (n = "", o = {}) => u(a({ message: n, severity: "warning" }, o)), z = (n = "", o = {}) => u(a({ message: n, severity: "error" }, o)), U = (n) => {
254
+ const o = c.current.findIndex((Q) => Q.key === n);
255
+ if (o !== -1)
256
+ return o === 0 ? (f(!1), c.current[0]) : c.current.splice(o, 1);
257
+ }, S = (n, o) => {
258
+ t(n, o) && f(!1);
259
+ }, W = () => {
260
+ }, G = () => {
261
+ c.current.shift(), c.current.length > 0 && f(!0);
262
+ }, l = (A = c.current[0]) != null ? A : a({}, B), E = {};
263
+ "autoHideDuration" in l && (E.autoHideDuration = l.autoHideDuration);
264
+ const X = a(a({}, de), r);
318
265
  return (
319
266
  // Should be resolved when we move to React >= 18
320
267
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
321
268
  // @ts-ignore
322
- /* @__PURE__ */ jsxs(
323
- SaladBarContext.Provider,
269
+ /* @__PURE__ */ p(
270
+ H.Provider,
324
271
  {
325
272
  value: {
326
- enqueueNotification,
327
- enqueueSuccessNotification,
328
- enqueueInfoNotification,
329
- enqueueWarningNotification,
330
- enqueueErrorNotification,
331
- removeNotification
273
+ enqueueNotification: u,
274
+ enqueueSuccessNotification: R,
275
+ enqueueInfoNotification: _,
276
+ enqueueWarningNotification: O,
277
+ enqueueErrorNotification: z,
278
+ removeNotification: U
332
279
  },
333
280
  children: [
334
- children,
335
- /* @__PURE__ */ jsx(
336
- Snackbar,
337
- __spreadProps(__spreadValues(__spreadValues({}, snackbarFinalProps), currentNotificationSnackbarProps), {
338
- open,
339
- onClose: handleClose,
281
+ e,
282
+ /* @__PURE__ */ s(
283
+ re,
284
+ g(a(a({}, X), E), {
285
+ open: L,
286
+ onClose: S,
340
287
  TransitionProps: {
341
- onExited: handleExited,
342
- onExit: handleExit
288
+ onExited: G,
289
+ onExit: W
343
290
  },
344
- sx: { zIndex: SALADBAR_INDEX },
345
- children: /* @__PURE__ */ jsxs("div", { children: [
346
- /* @__PURE__ */ jsx(
347
- Alert,
291
+ sx: { zIndex: fe },
292
+ children: /* @__PURE__ */ p("div", { children: [
293
+ /* @__PURE__ */ s(
294
+ oe,
348
295
  {
349
- onClose: handleClose,
350
- severity: currentNotification.severity,
296
+ onClose: (n) => S(n, "closeAlert"),
297
+ severity: l.severity,
351
298
  variant: "filled",
352
- icon: currentNotification.progressIndicator === "circular" ? /* @__PURE__ */ jsx(CircularProgress, { size: "1em" }) : void 0,
353
- style: currentNotification.progressIndicator === "linear" ? alertWithLinearProgressStyle : void 0,
354
- children: currentNotification.message
299
+ icon: l.progressIndicator === "circular" ? /* @__PURE__ */ s(ie, { size: "1em" }) : void 0,
300
+ style: l.progressIndicator === "linear" ? he : void 0,
301
+ children: l.message
355
302
  }
356
303
  ),
357
- currentNotification.progressIndicator === "linear" && /* @__PURE__ */ jsx(LinearProgress, { color: "primary" })
304
+ l.progressIndicator === "linear" && /* @__PURE__ */ s(ne, { color: "primary" })
358
305
  ] })
359
306
  })
360
307
  )
@@ -363,14 +310,14 @@ function SaladBarProvider(_a) {
363
310
  )
364
311
  );
365
312
  }
366
- function useSaladBar() {
367
- return useContext(SaladBarContext);
313
+ function Be() {
314
+ return Y(H);
368
315
  }
369
316
  export {
370
- AgThemeProvider,
371
- ContextError,
372
- ExampleComponent,
373
- SaladBarProvider,
374
- useSaladBar
317
+ be as AgThemeProvider,
318
+ v as ContextError,
319
+ Pe as ExampleComponent,
320
+ De as SaladBarProvider,
321
+ Be as useSaladBar
375
322
  };
376
323
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/providers/AgTheme/themes.ts","../../src/providers/AgTheme/index.tsx","../../src/errors/ContextError.ts","../../src/providers/SaladBar/SaladBarContext.ts","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarProvider.tsx","../../src/providers/SaladBar/useSaladBar.ts"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\nexport interface ExampleComponentProps {\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { alpha, createTheme } from '@mui/material/styles';\n\nexport const internalAGSystemsTheme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n});\n\nexport const fed21Theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n});\n","import { PropsWithChildren } from 'react';\nimport { ThemeProvider } from '@mui/material/styles';\n\nimport { internalAGSystemsTheme, fed21Theme } from './themes';\n\nexport type AgThemeName = 'internal' | 'fed21';\n\nexport interface AgThemeProviderProps {\n name?: AgThemeName;\n}\n\nexport default function AgThemeProvider({\n name = 'internal',\n children,\n}: PropsWithChildren<AgThemeProviderProps>) {\n const theme =\n name === 'internal' ? internalAGSystemsTheme : name === 'fed21' ? fed21Theme : undefined;\n\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext } from 'react';\n\nimport { ContextError } from '../../errors/ContextError';\n\nconst stub: () => void = () => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\nexport type NotificationType = {\n key: number;\n message: string;\n severity: 'success' | 'info' | 'warning' | 'error' | undefined;\n variant: 'standard' | 'outlined' | 'filled' | undefined;\n progressIndicator: string | undefined;\n autoHideDuration: number | undefined;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst notstub = (key: unknown): NotificationType | NotificationType[] | void => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\ntype SaladBarContextFunction = typeof stub | typeof notstub;\n\ntype SaladBarContextType = {\n enqueueNotification: SaladBarContextFunction; // Call as enqueueNotification(options)\n // where options include message and severity of 'error' ,'warning', 'info' or\n // 'success'\n enqueueSuccessNotification: SaladBarContextFunction; // Call as const key =\n // enqueueSuccessNotification(msg),\n enqueueInfoNotification: SaladBarContextFunction; // Call as const key =\n // enqueueInfoNotification(msg),\n enqueueWarningNotification: SaladBarContextFunction; // Call as const key =\n // enqueueWarningNotification(msg),\n enqueueErrorNotification: SaladBarContextFunction; // Call as const key =\n // enqueueErrorNotification(msg),\n removeNotification: SaladBarContextFunction; // Call as enqueueErrorNotification(key),\n};\n\n// The defaultValue argument is only used when a component does not have a\n// matching Provider above it in the tree. See\n// https://reactjs.org/docs/context.html#reactcreatecontext\n// Using createContext doesn't itself maintain any type of state exactly, it\n// just provides a way for children to access shared references.\nconst defaultValue = {\n enqueueNotification: stub,\n enqueueSuccessNotification: stub,\n enqueueInfoNotification: stub,\n enqueueWarningNotification: stub,\n enqueueErrorNotification: stub,\n removeNotification: notstub,\n} as SaladBarContextType;\n\n/**\n * @returns A SaladBarContext\n */\nconst SaladBarContext = createContext(defaultValue);\n\nexport default SaladBarContext;\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState } from 'react';\nimport Snackbar, { SnackbarProps } from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport SaladBarContext, { NotificationType } from './SaladBarContext';\nimport { defaultSnackbarProps, defaultEnqueueNotificationOptions } from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\nexport interface SaladBarProviderProps extends SnackbarProps {}\n\nexport default function SaladBarProvider({ children, ...snackbarProps }: SaladBarProviderProps) {\n const [open, setOpen] = useState(false);\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<NotificationType[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const enqueueNotification = (notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as NotificationType);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setOpen(true);\n\n return newNotification.key;\n };\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: unknown) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setOpen(false);\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n // Callback fired when the component requests to be closed\n // const handleClose = (_event, reason) => {\n // // We ignore click away, letting user continue with UI while its still\n // // displayed\n // if (reason === 'clickaway') return;\n\n // setOpen(false);\n // };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const handleClose = (_event: Event | React.SyntheticEvent<Element, Event>) => {\n // We ignore click away, letting user continue with UI while its still\n // displayed\n\n setOpen(false);\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setOpen(true);\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose.\n\n const snackbarFinalProps = { ...defaultSnackbarProps, ...snackbarProps };\n\n return (\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n <SaladBarContext.Provider\n value={{\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n }}\n >\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={handleClose}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </SaladBarContext.Provider>\n );\n}\n","import { useContext } from 'react';\nimport SaladBarContext from './SaladBarContext';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport default function useSaladBar() {\n return useContext(SaladBarContext);\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/components/ExampleComponent/index.tsx","../../src/providers/AgTheme/themes.ts","../../src/providers/AgTheme/index.tsx","../../src/errors/ContextError.ts","../../src/providers/SaladBar/SaladBarContext.ts","../../src/providers/SaladBar/defaults.ts","../../src/providers/SaladBar/SaladBarProvider.tsx","../../src/providers/SaladBar/useSaladBar.ts"],"sourcesContent":["import { useState } from 'react';\nimport Button from '@mui/material/Button';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\n\nexport interface ExampleComponentProps {\n text: string;\n}\n\nexport default function ExampleComponent({ text }: ExampleComponentProps) {\n const [num, setNum] = useState(0);\n\n return (\n <>\n <Typography variant=\"h6\" color=\"inherit\" component=\"div\" sx={{ fontSize: '22px' }}>\n Hello world\n </Typography>\n\n <Typography variant=\"caption\" display=\"block\">\n <span>Just ensuring MUI is working as planned as a peer dependency. v0.0.11</span>\n </Typography>\n <Button\n variant=\"outlined\"\n onClick={() => setNum((oldNum) => oldNum + 1)}\n aria-label=\"Increment\"\n >\n Hello I am a button\n </Button>\n <p>\n This is some text: <span>{text}</span>\n </p>\n <Paper>This number will incremember when button pressed: {num}</Paper>\n </>\n );\n}\n","import { alpha, createTheme } from '@mui/material/styles';\n\nexport const internalAGSystemsTheme = createTheme({\n palette: {\n primary: {\n main: '#007236',\n dark: '#005221',\n light: '#00A04E',\n contrastText: '#FFFFFF',\n },\n secondary: {\n main: '#662D91',\n dark: '#440E62',\n light: '#93268F',\n contrastText: '#FFFFFF',\n },\n error: {\n main: '#D32F2F',\n dark: '#C62828',\n light: '#EF5350',\n },\n info: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n success: {\n main: '#0288D1',\n dark: '#01579B',\n light: '#03A9F4',\n },\n },\n components: {\n MuiTextField: {\n defaultProps: { color: 'secondary' },\n },\n MuiToggleButtonGroup: {\n defaultProps: { color: 'secondary' },\n },\n MuiCheckbox: {\n defaultProps: { color: 'secondary' },\n },\n MuiSelect: {\n defaultProps: { color: 'secondary' },\n },\n MuiSwitch: {\n defaultProps: { color: 'secondary' },\n },\n MuiFormControl: {\n defaultProps: { color: 'secondary' },\n },\n MuiMenuItem: {\n // Setting defaultProps for color on MenuItem does not work, so update manually\n styleOverrides: {\n root: ({ theme }) => ({\n '&.Mui-selected': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n '&:hover': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.selectedOpacity\n ),\n },\n '&.Mui-focusVisible': {\n backgroundColor: alpha(\n theme.palette.secondary.main,\n theme.palette.action.focusOpacity\n ),\n },\n },\n }),\n },\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n h3: {\n fontSize: '1rem',\n fontWeight: 700,\n },\n },\n});\n\nexport const fed21Theme = createTheme({\n palette: {\n primary: {\n dark: '#00A651',\n light: '#A3D39C',\n main: '#007236',\n contrastText: '#FFF',\n },\n warning: {\n main: '#F5871F',\n light: '#FCC589',\n dark: '#A2590A',\n contrastText: '#FFF',\n },\n secondary: {\n main: '#662D91',\n light: '#BD8CBF',\n dark: '#440E62',\n contrastText: '#FFF',\n },\n error: {\n main: '#D43C95',\n light: '#8F2064',\n dark: '#F9CDE0',\n contrastText: '#FFF',\n },\n info: {\n main: '#00A88D',\n light: '#ADDCCF',\n dark: '#005243',\n contrastText: '#FFF',\n },\n success: {\n main: '#00A651',\n light: '#A3D39C',\n dark: '#007236',\n contrastText: '#FFF',\n },\n },\n typography: {\n // I couldn't think of what to call this. It is an attempt to match\n // https://www.figma.com/file/atonRPl2YD9A1NCntbDtKR/List-Filter-and-Product-Concept?node-id=1187%3A43730\n // but not sure if line height should be changed\n explainer: {\n fontSize: '14px',\n marginBlockStart: '1em',\n },\n },\n});\n","import { PropsWithChildren } from 'react';\nimport { ThemeProvider } from '@mui/material/styles';\n\nimport { internalAGSystemsTheme, fed21Theme } from './themes';\n\nexport type AgThemeName = 'internal' | 'fed21';\n\nexport interface AgThemeProviderProps {\n name?: AgThemeName;\n}\n\nexport default function AgThemeProvider({\n name = 'internal',\n children,\n}: PropsWithChildren<AgThemeProviderProps>) {\n const theme =\n name === 'internal' ? internalAGSystemsTheme : name === 'fed21' ? fed21Theme : undefined;\n\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n","import { AgError } from '@australiangreens/ag-error';\n\n// Superclass for errors involving React context.\nexport class ContextError extends AgError {\n static errorName = 'ContextError';\n}\n","import { createContext } from 'react';\n\nimport { ContextError } from '../../errors/ContextError';\n\nconst stub: () => void = () => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\nexport type NotificationType = {\n key: number;\n message: string;\n severity: 'success' | 'info' | 'warning' | 'error' | undefined;\n variant: 'standard' | 'outlined' | 'filled' | undefined;\n progressIndicator: string | undefined;\n autoHideDuration: number | undefined;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst notstub = (key: unknown): NotificationType | NotificationType[] | void => {\n throw new ContextError('SaladBarContext can only be used in a child of a <SaladBarProvider>');\n};\n\ntype SaladBarContextFunction = typeof stub | typeof notstub;\n\ntype SaladBarContextType = {\n enqueueNotification: SaladBarContextFunction; // Call as enqueueNotification(options)\n // where options include message and severity of 'error' ,'warning', 'info' or\n // 'success'\n enqueueSuccessNotification: SaladBarContextFunction; // Call as const key =\n // enqueueSuccessNotification(msg),\n enqueueInfoNotification: SaladBarContextFunction; // Call as const key =\n // enqueueInfoNotification(msg),\n enqueueWarningNotification: SaladBarContextFunction; // Call as const key =\n // enqueueWarningNotification(msg),\n enqueueErrorNotification: SaladBarContextFunction; // Call as const key =\n // enqueueErrorNotification(msg),\n removeNotification: SaladBarContextFunction; // Call as enqueueErrorNotification(key),\n};\n\n// The defaultValue argument is only used when a component does not have a\n// matching Provider above it in the tree. See\n// https://reactjs.org/docs/context.html#reactcreatecontext\n// Using createContext doesn't itself maintain any type of state exactly, it\n// just provides a way for children to access shared references.\nconst defaultValue = {\n enqueueNotification: stub,\n enqueueSuccessNotification: stub,\n enqueueInfoNotification: stub,\n enqueueWarningNotification: stub,\n enqueueErrorNotification: stub,\n removeNotification: notstub,\n} as SaladBarContextType;\n\n/**\n * @returns A SaladBarContext\n */\nconst SaladBarContext = createContext(defaultValue);\n\nexport default SaladBarContext;\n","// The default props passed to the underlying Snackbar component\nimport { SnackbarOrigin } from '@mui/material/Snackbar';\n\nexport const defaultSnackbarProps = {\n autoHideDuration: 6000,\n anchorOrigin: { vertical: 'top', horizontal: 'center' } as SnackbarOrigin,\n\n // The default is false. If we prefer timer to continue when window loses\n // focus, change to true\n disableWindowBlurListener: false,\n};\n\nexport const defaultSaladBarProps = {\n shouldClose: (_event: Event | React.SyntheticEvent<Element, Event>, reason: string) => {\n return reason !== 'clickaway';\n },\n};\n\nexport const defaultEnqueueNotificationOptions = {\n message: '',\n severity: 'info',\n variant: 'standard',\n progressIndicator: undefined, // Can use 'circular' or 'linear'\n};\n","import React, { useRef, useState } from 'react';\nimport Snackbar, { SnackbarProps, SnackbarCloseReason } from '@mui/material/Snackbar';\nimport Alert from '@mui/material/Alert';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport CircularProgress from '@mui/material/CircularProgress';\n\nimport SaladBarContext, { NotificationType } from './SaladBarContext';\nimport {\n defaultSaladBarProps,\n defaultSnackbarProps,\n defaultEnqueueNotificationOptions,\n} from './defaults';\n\nconst MAX_QUEUE_LENGTH = 100;\nconst MAX_QUEUE_HIT_REPORT_INTERVAL = 2000;\nconst SALADBAR_INDEX = 2000;\n\n// No need to use uuids, just use an incremented value\nconst generateNotificationKey = (() => {\n let previousKey = 0;\n return () => {\n previousKey += 1;\n return previousKey;\n };\n})();\n\nconst alertWithLinearProgressStyle = {\n borderBottomLeftRadius: '0px',\n borderBottomRightRadius: '0px',\n};\n\nexport type SaladBarCloseReason = SnackbarCloseReason | 'closeAlert';\n\nexport interface SaladBarProviderProps extends SnackbarProps {\n /** Called when an event triggers closing of currently displayed snackbar.\n * Default implementation returns false if reason is 'clickaway', otherwise\n * true.*/\n shouldClose?: (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => boolean;\n}\n\nexport default function SaladBarProvider({\n children,\n shouldClose = defaultSaladBarProps.shouldClose,\n ...snackbarProps\n}: SaladBarProviderProps) {\n const [open, setOpen] = useState(false);\n\n // We use a ref instead of a state to store the actual data, because we want\n // queue to be persistent across the whole lifetime of component. I considered\n // using yocto-queue because it would be O(1) instead of O(n), but its not\n // designed to access the head without removing it and its not going to make\n // much difference anyway.\n const queueRef = useRef<NotificationType[]>([]);\n\n const limitLastHitAt = useRef(Date.now());\n const limitHitCountSinceLastReport = useRef(0);\n\n const enqueueNotification = (notification = {}) => {\n limitHitCountSinceLastReport.current += 1;\n if (queueRef.current.length >= MAX_QUEUE_LENGTH) {\n // If the queue length is hit, probably stuck in some sort of loop, so\n // don't want to spam logs instantly so space it out\n if (Date.now() - limitLastHitAt.current >= MAX_QUEUE_HIT_REPORT_INTERVAL) {\n limitLastHitAt.current = Date.now();\n console.error(\n `SaladBarProvider: MAX_QUEUE_LENGTH (${MAX_QUEUE_LENGTH}) hit ${limitHitCountSinceLastReport.current} times in last ${MAX_QUEUE_HIT_REPORT_INTERVAL}ms)`\n );\n limitHitCountSinceLastReport.current = 0;\n }\n }\n\n const newNotification = {\n ...defaultEnqueueNotificationOptions,\n key: generateNotificationKey(), // Can be overridden.\n ...notification, // This could result in collisons, but unlikely.\n };\n\n // Add to the end of queue\n queueRef.current.push(newNotification as NotificationType);\n\n // If the queue was previously empty, then open the snackbar. We don't do it\n // whenever enqueueNotification is called since it will mess up transitions\n if (queueRef.current.length === 1) setOpen(true);\n\n return newNotification.key;\n };\n\n const enqueueSuccessNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'success', ...options });\n\n const enqueueInfoNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'info', ...options });\n\n const enqueueWarningNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'warning', ...options });\n\n const enqueueErrorNotification = (message = '', options = {}) =>\n enqueueNotification({ message, severity: 'error', ...options });\n\n /**\n * Remove the notification with specified key from the queue. If the key is\n * not found, immediately returns null.\n *\n * @param key - The key as returned from enqueue...() function.\n *\n * @returns The removed notification\n */\n const removeNotification = (key: unknown) => {\n const index = queueRef.current.findIndex((x) => x.key === key);\n if (index === -1) return;\n\n if (index === 0) {\n // If its at the front of the queue, it is either currently being\n // displayed or in process of being closed. Either way, we can just set\n // open to false\n setOpen(false);\n return queueRef.current[0];\n }\n // Otherwise we just remove it from the queue, it won't need to transition\n return queueRef.current.splice(index, 1);\n };\n\n const handleClose = (\n event: Event | React.SyntheticEvent<Element, Event>,\n reason: SaladBarCloseReason\n ) => {\n if (shouldClose(event, reason)) setOpen(false);\n };\n\n // Callback fired before the transition is exiting.\n const handleExit = () => {};\n\n // Callback fired when the transition has exited.\n const handleExited = () => {\n // Remove head of queue\n queueRef.current.shift();\n\n // If there is still something on the queue, then re-open\n if (queueRef.current.length > 0) setOpen(true);\n };\n\n // The notification to display is the one at head of queue\n const currentNotification = queueRef.current[0] ?? {\n ...defaultEnqueueNotificationOptions,\n };\n\n // Can also override certain props on a notification level\n const currentNotificationSnackbarProps: { autoHideDuration?: number } = {};\n // Probably a better way of doing this\n if ('autoHideDuration' in currentNotification) {\n currentNotificationSnackbarProps.autoHideDuration = currentNotification.autoHideDuration;\n }\n\n // Note the order of props in Snackbar, we don't allow overriding open and\n // onClose.\n\n const snackbarFinalProps = { ...defaultSnackbarProps, ...snackbarProps };\n\n return (\n // Should be resolved when we move to React >= 18\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n <SaladBarContext.Provider\n value={{\n enqueueNotification,\n enqueueSuccessNotification,\n enqueueInfoNotification,\n enqueueWarningNotification,\n enqueueErrorNotification,\n removeNotification,\n }}\n >\n {children}\n <Snackbar\n {...snackbarFinalProps}\n {...currentNotificationSnackbarProps}\n open={open}\n onClose={handleClose}\n TransitionProps={{\n onExited: handleExited,\n onExit: handleExit,\n }}\n sx={{ zIndex: SALADBAR_INDEX }}\n >\n <div>\n <Alert\n onClose={(event) => handleClose(event, 'closeAlert')}\n severity={currentNotification.severity}\n variant={'filled'}\n icon={\n currentNotification.progressIndicator === 'circular' ? (\n <CircularProgress size=\"1em\" />\n ) : undefined\n }\n style={\n currentNotification.progressIndicator === 'linear'\n ? alertWithLinearProgressStyle\n : undefined\n }\n >\n {currentNotification.message}\n </Alert>\n {currentNotification.progressIndicator === 'linear' && <LinearProgress color=\"primary\" />}\n </div>\n </Snackbar>\n </SaladBarContext.Provider>\n );\n}\n","import { useContext } from 'react';\nimport SaladBarContext from './SaladBarContext';\n\n/**\n * Use the `useSaladBar` hook in components to access the enqueueNotification()\n * method to add a snackbar message to queue.\n *\n * Example:\n *\n * ```js\n * const {\n * enqueueNotification,\n * enqueueSuccessNotification,\n * enqueueInfoNotification,\n * enqueueWarningNotification,\n * enqueueErrorNotification,\n * } = useSaladBar();\n * ...\n * enqueueNotification({message: 'hello', severity: 'info'});\n * // or\n * enqueueInfoNotification('hello');\n * ```\n */\nexport default function useSaladBar() {\n return useContext(SaladBarContext);\n}\n"],"names":["ExampleComponent","text","num","setNum","useState","jsxs","Fragment","jsx","Typography","Button","oldNum","Paper","internalAGSystemsTheme","createTheme","theme","alpha","fed21Theme","AgThemeProvider","name","children","ThemeProvider","ContextError","AgError","__publicField","stub","notstub","key","defaultValue","SaladBarContext","createContext","defaultSnackbarProps","defaultSaladBarProps","_event","reason","defaultEnqueueNotificationOptions","MAX_QUEUE_LENGTH","MAX_QUEUE_HIT_REPORT_INTERVAL","SALADBAR_INDEX","generateNotificationKey","previousKey","alertWithLinearProgressStyle","SaladBarProvider","_a","_b","shouldClose","snackbarProps","__objRest","open","setOpen","queueRef","useRef","limitLastHitAt","limitHitCountSinceLastReport","enqueueNotification","notification","newNotification","__spreadValues","__spreadProps","enqueueSuccessNotification","message","options","enqueueInfoNotification","enqueueWarningNotification","enqueueErrorNotification","removeNotification","index","x","handleClose","event","handleExit","handleExited","currentNotification","currentNotificationSnackbarProps","snackbarFinalProps","Snackbar","Alert","CircularProgress","LinearProgress","useSaladBar","useContext"],"mappings":"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"}
@@ -1,5 +1,11 @@
1
- import { SnackbarProps } from '@mui/material/Snackbar';
1
+ import React from 'react';
2
+ import { SnackbarProps, SnackbarCloseReason } from '@mui/material/Snackbar';
3
+ export type SaladBarCloseReason = SnackbarCloseReason | 'closeAlert';
2
4
  export interface SaladBarProviderProps extends SnackbarProps {
5
+ /** Called when an event triggers closing of currently displayed snackbar.
6
+ * Default implementation returns false if reason is 'clickaway', otherwise
7
+ * true.*/
8
+ shouldClose?: (event: Event | React.SyntheticEvent<Element, Event>, reason: SaladBarCloseReason) => boolean;
3
9
  }
4
- export default function SaladBarProvider({ children, ...snackbarProps }: SaladBarProviderProps): JSX.Element;
10
+ export default function SaladBarProvider({ children, shouldClose, ...snackbarProps }: SaladBarProviderProps): JSX.Element;
5
11
  //# sourceMappingURL=SaladBarProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SaladBarProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/SaladBar/SaladBarProvider.tsx"],"names":[],"mappings":"AACA,OAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA0BjE,MAAM,WAAW,qBAAsB,SAAQ,aAAa;CAAG;AAE/D,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EAAE,QAAQ,EAAE,GAAG,aAAa,EAAE,EAAE,qBAAqB,eA6K7F"}
1
+ {"version":3,"file":"SaladBarProvider.d.ts","sourceRoot":"","sources":["../../../../src/providers/SaladBar/SaladBarProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAChD,OAAiB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AA8BtF,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,YAAY,CAAC;AAErE,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D;;cAEU;IACV,WAAW,CAAC,EAAE,CACZ,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,EACnD,MAAM,EAAE,mBAAmB,KACxB,OAAO,CAAC;CACd;AAED,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,EACvC,QAAQ,EACR,WAA8C,EAC9C,GAAG,aAAa,EACjB,EAAE,qBAAqB,eAmKvB"}
@@ -4,6 +4,9 @@ export declare const defaultSnackbarProps: {
4
4
  anchorOrigin: SnackbarOrigin;
5
5
  disableWindowBlurListener: boolean;
6
6
  };
7
+ export declare const defaultSaladBarProps: {
8
+ shouldClose: (_event: Event | React.SyntheticEvent<Element, Event>, reason: string) => boolean;
9
+ };
7
10
  export declare const defaultEnqueueNotificationOptions: {
8
11
  message: string;
9
12
  severity: string;
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../../src/providers/SaladBar/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;CAOhC,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;CAK7C,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../../../src/providers/SaladBar/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,eAAO,MAAM,oBAAoB;;;;CAOhC,CAAC;AAEF,eAAO,MAAM,oBAAoB;0BACT,KAAK,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,MAAM;CAGnF,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;CAK7C,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@australiangreens/ag-internal-components",
3
3
  "private": false,
4
- "version": "0.0.21",
4
+ "version": "0.0.23",
5
5
  "type": "module",
6
6
  "homepage": "https://github.com/australiangreens/ag-internal-components#readme",
7
7
  "license": "MIT",