@hh.ru/magritte-ui-snackbar 6.4.25 → 6.4.27
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/Snackbar.d.ts +1 -1
- package/Snackbar.js +72 -53
- package/Snackbar.js.map +1 -1
- package/SnackbarContainer.d.ts +1 -1
- package/SnackbarContainer.js +12 -6
- package/SnackbarContainer.js.map +1 -1
- package/SnackbarContextProvider.js +152 -147
- package/SnackbarContextProvider.js.map +1 -1
- package/SnackbarRenderer.d.ts +1 -1
- package/SnackbarRenderer.js +300 -230
- package/SnackbarRenderer.js.map +1 -1
- package/context.d.ts +1 -1
- package/context.js +5 -5
- package/context.js.map +1 -1
- package/index.css +61 -61
- package/index.d.ts +5 -5
- package/index.js +1 -1
- package/package.json +9 -9
- package/snackbar-DxehbKoS.js +5 -0
- package/snackbar-DxehbKoS.js.map +1 -0
- package/types.js +7 -7
- package/types.js.map +1 -1
- package/useAriaSnackbar.d.ts +2 -2
- package/useAriaSnackbar.js +19 -19
- package/useAriaSnackbar.js.map +1 -1
- package/snackbar-ClWKT5ad.js +0 -5
- package/snackbar-ClWKT5ad.js.map +0 -1
package/Snackbar.d.ts
CHANGED
package/Snackbar.js
CHANGED
|
@@ -3,60 +3,79 @@ import { useContext, useId, useRef, useEffect } from 'react';
|
|
|
3
3
|
import { SnackbarContext } from './context.js';
|
|
4
4
|
import { SnackbarTransitionName } from './types.js';
|
|
5
5
|
|
|
6
|
-
const Snackbar = ({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
6
|
+
const Snackbar = ({
|
|
7
|
+
actionLabel,
|
|
8
|
+
align,
|
|
9
|
+
addon,
|
|
10
|
+
autohideTime,
|
|
11
|
+
children,
|
|
12
|
+
containerId,
|
|
13
|
+
"data-qa": dataQa,
|
|
14
|
+
stretched,
|
|
15
|
+
showClose,
|
|
16
|
+
showTimer,
|
|
17
|
+
"aria-label-close": ariaLabelClose,
|
|
18
|
+
"aria-label": ariaLabel,
|
|
19
|
+
role,
|
|
20
|
+
removeOnUnmount = true,
|
|
21
|
+
onAction,
|
|
22
|
+
onClose
|
|
23
|
+
}) => {
|
|
24
|
+
const context = useContext(SnackbarContext);
|
|
25
|
+
const uid = useId();
|
|
26
|
+
const removeOnUnmountRef = useRef(removeOnUnmount);
|
|
27
|
+
removeOnUnmountRef.current = removeOnUnmount;
|
|
28
|
+
const onActionRef = useRef(onAction);
|
|
29
|
+
onActionRef.current = onAction;
|
|
30
|
+
const onCloseRef = useRef(onClose);
|
|
31
|
+
onCloseRef.current = onClose;
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
context.animateIn(uid, {
|
|
34
|
+
actionLabel,
|
|
35
|
+
align,
|
|
36
|
+
addon,
|
|
37
|
+
autohideTime,
|
|
38
|
+
children,
|
|
39
|
+
"data-qa": dataQa,
|
|
40
|
+
containerId,
|
|
41
|
+
stretched,
|
|
42
|
+
showClose,
|
|
43
|
+
showTimer,
|
|
44
|
+
"aria-label-close": ariaLabelClose,
|
|
45
|
+
"aria-label": ariaLabel,
|
|
46
|
+
role,
|
|
47
|
+
onAction: onActionRef.current,
|
|
48
|
+
onClose: onCloseRef.current
|
|
49
|
+
});
|
|
50
|
+
}, [
|
|
51
|
+
context,
|
|
52
|
+
uid,
|
|
53
|
+
actionLabel,
|
|
54
|
+
align,
|
|
55
|
+
addon,
|
|
56
|
+
autohideTime,
|
|
57
|
+
dataQa,
|
|
58
|
+
children,
|
|
59
|
+
containerId,
|
|
60
|
+
stretched,
|
|
61
|
+
showClose,
|
|
62
|
+
showTimer,
|
|
63
|
+
ariaLabelClose,
|
|
64
|
+
ariaLabel,
|
|
65
|
+
role
|
|
66
|
+
]);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
return () => {
|
|
69
|
+
if (!removeOnUnmountRef.current) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
context.animateOut(
|
|
36
73
|
uid,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
children,
|
|
43
|
-
containerId,
|
|
44
|
-
stretched,
|
|
45
|
-
showClose,
|
|
46
|
-
showTimer,
|
|
47
|
-
ariaLabelClose,
|
|
48
|
-
ariaLabel,
|
|
49
|
-
role,
|
|
50
|
-
]);
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
return () => {
|
|
53
|
-
if (!removeOnUnmountRef.current) {
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
context.animateOut(uid, context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately);
|
|
57
|
-
};
|
|
58
|
-
}, [context, uid]);
|
|
59
|
-
return null;
|
|
74
|
+
context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
}, [context, uid]);
|
|
78
|
+
return null;
|
|
60
79
|
};
|
|
61
80
|
|
|
62
81
|
export { Snackbar };
|
package/Snackbar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Snackbar.js","sources":["src/Snackbar.tsx"],"sourcesContent":["import { FC, useContext, useEffect, useId, useRef } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\n\nexport const Snackbar: FC<SnackbarProps> = ({\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n containerId,\n 'data-qa': dataQa,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n removeOnUnmount = true,\n onAction,\n onClose,\n}) => {\n const context = useContext(SnackbarContext);\n const uid = useId();\n const removeOnUnmountRef = useRef(removeOnUnmount);\n removeOnUnmountRef.current = removeOnUnmount;\n\n // коллбэки не мемоизированы => вызывают animateIn\n const onActionRef = useRef<VoidFunction | undefined>(onAction);\n onActionRef.current = onAction;\n const onCloseRef = useRef<SnackbarProps['onClose'] | undefined>(onClose);\n onCloseRef.current = onClose;\n\n useEffect(() => {\n context.animateIn(uid, {\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n 'data-qa': dataQa,\n containerId,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n onAction: onActionRef.current,\n onClose: onCloseRef.current,\n } as SnackbarProps);\n }, [\n context,\n uid,\n actionLabel,\n align,\n addon,\n autohideTime,\n dataQa,\n children,\n containerId,\n stretched,\n showClose,\n showTimer,\n ariaLabelClose,\n ariaLabel,\n role,\n ]);\n\n useEffect(() => {\n return () => {\n if (!removeOnUnmountRef.current) {\n return;\n }\n context.animateOut(\n uid,\n context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately\n );\n };\n }, [context, uid]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"Snackbar.js","sources":["src/Snackbar.tsx"],"sourcesContent":["import { FC, useContext, useEffect, useId, useRef } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\n\nexport const Snackbar: FC<SnackbarProps> = ({\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n containerId,\n 'data-qa': dataQa,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n removeOnUnmount = true,\n onAction,\n onClose,\n}) => {\n const context = useContext(SnackbarContext);\n const uid = useId();\n const removeOnUnmountRef = useRef(removeOnUnmount);\n removeOnUnmountRef.current = removeOnUnmount;\n\n // коллбэки не мемоизированы => вызывают animateIn\n const onActionRef = useRef<VoidFunction | undefined>(onAction);\n onActionRef.current = onAction;\n const onCloseRef = useRef<SnackbarProps['onClose'] | undefined>(onClose);\n onCloseRef.current = onClose;\n\n useEffect(() => {\n context.animateIn(uid, {\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n 'data-qa': dataQa,\n containerId,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n onAction: onActionRef.current,\n onClose: onCloseRef.current,\n } as SnackbarProps);\n }, [\n context,\n uid,\n actionLabel,\n align,\n addon,\n autohideTime,\n dataQa,\n children,\n containerId,\n stretched,\n showClose,\n showTimer,\n ariaLabelClose,\n ariaLabel,\n role,\n ]);\n\n useEffect(() => {\n return () => {\n if (!removeOnUnmountRef.current) {\n return;\n }\n context.animateOut(\n uid,\n context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately\n );\n };\n }, [context, uid]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;AAKO,MAAM,WAA8B,CAAC;AAAA,EACxC,WAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAW,EAAA,MAAA;AAAA,EACX,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAoB,EAAA,cAAA;AAAA,EACpB,YAAc,EAAA,SAAA;AAAA,EACd,IAAA;AAAA,EACA,eAAkB,GAAA,IAAA;AAAA,EAClB,QAAA;AAAA,EACA,OAAA;AACJ,CAAM,KAAA;AACF,EAAM,MAAA,OAAA,GAAU,WAAW,eAAe,CAAA,CAAA;AAC1C,EAAA,MAAM,MAAM,KAAM,EAAA,CAAA;AAClB,EAAM,MAAA,kBAAA,GAAqB,OAAO,eAAe,CAAA,CAAA;AACjD,EAAA,kBAAA,CAAmB,OAAU,GAAA,eAAA,CAAA;AAG7B,EAAM,MAAA,WAAA,GAAc,OAAiC,QAAQ,CAAA,CAAA;AAC7D,EAAA,WAAA,CAAY,OAAU,GAAA,QAAA,CAAA;AACtB,EAAM,MAAA,UAAA,GAAa,OAA6C,OAAO,CAAA,CAAA;AACvE,EAAA,UAAA,CAAW,OAAU,GAAA,OAAA,CAAA;AAErB,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,OAAA,CAAQ,UAAU,GAAK,EAAA;AAAA,MACnB,WAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAW,EAAA,MAAA;AAAA,MACX,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,kBAAoB,EAAA,cAAA;AAAA,MACpB,YAAc,EAAA,SAAA;AAAA,MACd,IAAA;AAAA,MACA,UAAU,WAAY,CAAA,OAAA;AAAA,MACtB,SAAS,UAAW,CAAA,OAAA;AAAA,KACN,CAAA,CAAA;AAAA,GACnB,EAAA;AAAA,IACC,OAAA;AAAA,IACA,GAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,IAAA;AAAA,GACH,CAAA,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,OAAO,MAAM;AACT,MAAI,IAAA,CAAC,mBAAmB,OAAS,EAAA;AAC7B,QAAA,OAAA;AAAA,OACJ;AACA,MAAQ,OAAA,CAAA,UAAA;AAAA,QACJ,GAAA;AAAA,QACA,QAAQ,OAAQ,CAAA,GAAG,CAAI,GAAA,sBAAA,CAAuB,OAAO,sBAAuB,CAAA,iBAAA;AAAA,OAChF,CAAA;AAAA,KACJ,CAAA;AAAA,GACD,EAAA,CAAC,OAAS,EAAA,GAAG,CAAC,CAAA,CAAA;AAEjB,EAAO,OAAA,IAAA,CAAA;AACX;;;;"}
|
package/SnackbarContainer.d.ts
CHANGED
package/SnackbarContainer.js
CHANGED
|
@@ -2,14 +2,20 @@ import './index.css';
|
|
|
2
2
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
3
3
|
import { useContext, useCallback, Fragment } from 'react';
|
|
4
4
|
import { SnackbarContext } from './context.js';
|
|
5
|
-
import { s as styles } from './snackbar-
|
|
5
|
+
import { s as styles } from './snackbar-DxehbKoS.js';
|
|
6
6
|
|
|
7
7
|
const SnackbarContainer = ({ children, id, ...props }) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
8
|
+
const context = useContext(SnackbarContext);
|
|
9
|
+
const ref = useCallback(
|
|
10
|
+
(instance) => {
|
|
11
|
+
context.setContainerRef(id, instance);
|
|
12
|
+
},
|
|
13
|
+
[id, context]
|
|
14
|
+
);
|
|
15
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
16
|
+
/* @__PURE__ */ jsx("div", { ...props, className: styles.snackbarContainer, ref }),
|
|
17
|
+
children
|
|
18
|
+
] });
|
|
13
19
|
};
|
|
14
20
|
|
|
15
21
|
export { SnackbarContainer };
|
package/SnackbarContainer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarContainer.js","sources":["src/SnackbarContainer.tsx"],"sourcesContent":["import { FC, Fragment, RefCallback, useContext, useCallback } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarContainerProps } from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\nexport const SnackbarContainer: FC<SnackbarContainerProps> = ({ children, id, ...props }) => {\n const context = useContext(SnackbarContext);\n\n const ref: RefCallback<HTMLElement> = useCallback(\n (instance) => {\n context.setContainerRef(id, instance);\n },\n [id, context]\n );\n\n return (\n <Fragment>\n <div {...props} className={styles.snackbarContainer} ref={ref} />\n {children}\n </Fragment>\n );\n};\n"],"names":[
|
|
1
|
+
{"version":3,"file":"SnackbarContainer.js","sources":["src/SnackbarContainer.tsx"],"sourcesContent":["import { FC, Fragment, RefCallback, useContext, useCallback } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarContainerProps } from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\nexport const SnackbarContainer: FC<SnackbarContainerProps> = ({ children, id, ...props }) => {\n const context = useContext(SnackbarContext);\n\n const ref: RefCallback<HTMLElement> = useCallback(\n (instance) => {\n context.setContainerRef(id, instance);\n },\n [id, context]\n );\n\n return (\n <Fragment>\n <div {...props} className={styles.snackbarContainer} ref={ref} />\n {children}\n </Fragment>\n );\n};\n"],"names":[],"mappings":";;;;;AAOO,MAAM,oBAAgD,CAAC,EAAE,UAAU,EAAI,EAAA,GAAG,OAAY,KAAA;AACzF,EAAM,MAAA,OAAA,GAAU,WAAW,eAAe,CAAA,CAAA;AAE1C,EAAA,MAAM,GAAgC,GAAA,WAAA;AAAA,IAClC,CAAC,QAAa,KAAA;AACV,MAAQ,OAAA,CAAA,eAAA,CAAgB,IAAI,QAAQ,CAAA,CAAA;AAAA,KACxC;AAAA,IACA,CAAC,IAAI,OAAO,CAAA;AAAA,GAChB,CAAA;AAEA,EAAA,4BACK,QACG,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAK,GAAG,KAAA,EAAO,SAAW,EAAA,MAAA,CAAO,mBAAmB,GAAU,EAAA,CAAA;AAAA,IAC9D,QAAA;AAAA,GACL,EAAA,CAAA,CAAA;AAER;;;;"}
|
|
@@ -5,7 +5,7 @@ import { createPortal } from 'react-dom';
|
|
|
5
5
|
import { SnackbarRenderer } from './SnackbarRenderer.js';
|
|
6
6
|
import { SnackbarContext } from './context.js';
|
|
7
7
|
import { SnackbarTransitionName } from './types.js';
|
|
8
|
-
import { s as styles } from './snackbar-
|
|
8
|
+
import { s as styles } from './snackbar-DxehbKoS.js';
|
|
9
9
|
import 'react-transition-group';
|
|
10
10
|
import 'classnames';
|
|
11
11
|
import '@hh.ru/magritte-common-focus-visible';
|
|
@@ -20,164 +20,169 @@ import './useAriaSnackbar.js';
|
|
|
20
20
|
import '@hh.ru/magritte-ui-theme-wrapper';
|
|
21
21
|
import '@hh.ru/magritte-ui-timer';
|
|
22
22
|
|
|
23
|
-
const DEFAULT_CONTAINER =
|
|
23
|
+
const DEFAULT_CONTAINER = "body";
|
|
24
24
|
const DEFAULT_POSITION = 0;
|
|
25
|
-
const MAX_SNACKBAR_IN_CONTAINER = 2;
|
|
25
|
+
const MAX_SNACKBAR_IN_CONTAINER = 2;
|
|
26
26
|
const getContainerIdByState = (state, uid) => state[uid]?.containerId ?? DEFAULT_CONTAINER;
|
|
27
27
|
const getContainerIdByProps = (props) => props.containerId || DEFAULT_CONTAINER;
|
|
28
28
|
const getContainerWasChanged = (state, props) => {
|
|
29
|
-
|
|
29
|
+
return getContainerIdByState(state, Object.keys(state)[0]) !== getContainerIdByProps(props);
|
|
30
30
|
};
|
|
31
31
|
const getOverridesByState = (state, props) => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
align: alignOverride ?? props.align,
|
|
48
|
-
};
|
|
32
|
+
let stretchedOverride;
|
|
33
|
+
let alignOverride;
|
|
34
|
+
Object.keys(state).forEach((currentUid) => {
|
|
35
|
+
const { stretched: prevStretched, align: prevAlign } = state[currentUid];
|
|
36
|
+
if (stretchedOverride === void 0 && (prevStretched === true || prevStretched === void 0)) {
|
|
37
|
+
stretchedOverride = true;
|
|
38
|
+
}
|
|
39
|
+
if (alignOverride === void 0) {
|
|
40
|
+
alignOverride = prevAlign;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return getContainerWasChanged(state, props) ? {} : {
|
|
44
|
+
stretched: stretchedOverride ?? props.stretched,
|
|
45
|
+
align: alignOverride ?? props.align
|
|
46
|
+
};
|
|
49
47
|
};
|
|
50
48
|
const SnackbarContextProvider = ({ children }) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
const animationTimeoutRef = useRef({
|
|
50
|
+
[SnackbarTransitionName.Show]: 0,
|
|
51
|
+
[SnackbarTransitionName.Hide]: 0,
|
|
52
|
+
[SnackbarTransitionName.Autohide]: 0,
|
|
53
|
+
[SnackbarTransitionName.RemoveImmediately]: 0
|
|
54
|
+
});
|
|
55
|
+
const containerRefs = useRef({});
|
|
56
|
+
const isShownRef = useRef({});
|
|
57
|
+
const [state, setState] = useState({});
|
|
58
|
+
const snackbarsByUidMapRef = useRef({});
|
|
59
|
+
const animateOut = useCallback((uid, transition) => {
|
|
60
|
+
setState((prevState) => {
|
|
61
|
+
if (!(uid in prevState)) {
|
|
62
|
+
return prevState;
|
|
63
|
+
}
|
|
64
|
+
const isCurrentlyVisible = prevState[uid].transition === SnackbarTransitionName.Show;
|
|
65
|
+
const willBeHidden = [SnackbarTransitionName.Hide, SnackbarTransitionName.Autohide].includes(transition);
|
|
66
|
+
if (transition === SnackbarTransitionName.RemoveImmediately || willBeHidden && !isCurrentlyVisible) {
|
|
67
|
+
const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];
|
|
68
|
+
snackbarsByUidMap.delete(uid);
|
|
69
|
+
const uids = [...snackbarsByUidMap].reverse();
|
|
70
|
+
delete isShownRef.current[uid];
|
|
71
|
+
return Object.fromEntries(
|
|
72
|
+
Object.entries(prevState).filter(([key]) => key !== uid).map(([key, state2]) => {
|
|
73
|
+
const index = uids.indexOf(key);
|
|
74
|
+
state2.position = index !== -1 ? index : state2.position;
|
|
75
|
+
return [key, state2];
|
|
76
|
+
})
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return { ...prevState, [uid]: { ...prevState[uid], transition } };
|
|
56
80
|
});
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (transition === SnackbarTransitionName.RemoveImmediately || (willBeHidden && !isCurrentlyVisible)) {
|
|
69
|
-
const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];
|
|
70
|
-
snackbarsByUidMap.delete(uid);
|
|
71
|
-
const uids = [...snackbarsByUidMap].reverse();
|
|
72
|
-
delete isShownRef.current[uid];
|
|
73
|
-
return Object.fromEntries(Object.entries(prevState)
|
|
74
|
-
.filter(([key]) => key !== uid)
|
|
75
|
-
.map(([key, state]) => {
|
|
76
|
-
// обновляем позицию на основе нового сета
|
|
77
|
-
const index = uids.indexOf(key);
|
|
78
|
-
state.position = index !== -1 ? index : state.position;
|
|
79
|
-
return [key, state];
|
|
80
|
-
}));
|
|
81
|
-
}
|
|
82
|
-
return { ...prevState, [uid]: { ...prevState[uid], transition } };
|
|
83
|
-
});
|
|
84
|
-
}, []);
|
|
85
|
-
const animateIn = useCallback((uid, props) => {
|
|
86
|
-
setState((prevState) => {
|
|
87
|
-
if (uid in prevState) {
|
|
88
|
-
// не даем менять некоторые пропсы у существующего снекбара
|
|
89
|
-
const { autohideTime, containerId, showTimer, ..._props } = props;
|
|
90
|
-
// применяем оверайды, так как из пропсов прилетают старые значения
|
|
91
|
-
const overridesProps = getOverridesByState(prevState, props);
|
|
92
|
-
return {
|
|
93
|
-
...prevState,
|
|
94
|
-
[uid]: { ...prevState[uid], ..._props, ...overridesProps },
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
// сохраняем информацию о uid
|
|
98
|
-
const containerIdFromProps = getContainerIdByProps(props);
|
|
99
|
-
const snackbarsByUidMap = snackbarsByUidMapRef.current;
|
|
100
|
-
if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {
|
|
101
|
-
snackbarsByUidMap[containerIdFromProps].add(uid);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
snackbarsByUidMap[containerIdFromProps] = new Set([uid]);
|
|
105
|
-
}
|
|
106
|
-
// если прилетел новый снекбар, то все текущие снеки мы скрываем
|
|
107
|
-
const containerWasChanged = getContainerWasChanged(prevState, props);
|
|
108
|
-
// если stretched есть в новом снакбаре => везде ставим stretched
|
|
109
|
-
// аналогичная логика с align (новому снекбару ставим align из стака)
|
|
110
|
-
const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();
|
|
111
|
-
const stretchedByNewSnackbar = props.stretched === undefined || props.stretched === true;
|
|
112
|
-
// обходим старый стейт и обновлям параметры (align, stretched, position, transition)
|
|
113
|
-
const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {
|
|
114
|
-
const { transition, stretched: prevStretched, position } = prevState[currentUid];
|
|
115
|
-
// если stretched есть в стаке => везде ставим stretched
|
|
116
|
-
const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;
|
|
117
|
-
const positionBySet = uidsFromSet.indexOf(currentUid);
|
|
118
|
-
// скрываем последний снэкбар
|
|
119
|
-
const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;
|
|
120
|
-
const value = {
|
|
121
|
-
...prevState[currentUid],
|
|
122
|
-
transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,
|
|
123
|
-
position: containerWasChanged || limitReached ? position : positionBySet,
|
|
124
|
-
stretched,
|
|
125
|
-
};
|
|
126
|
-
return { ...accumulator, [currentUid]: value };
|
|
127
|
-
}, {});
|
|
128
|
-
// создаем новый snackbar
|
|
129
|
-
const defaultProps = {
|
|
130
|
-
animateOut: (transition) => animateOut(uid, transition),
|
|
131
|
-
isShown: () => !!isShownRef.current[uid],
|
|
132
|
-
onShown: () => (isShownRef.current[uid] = true),
|
|
133
|
-
transition: SnackbarTransitionName.Show,
|
|
134
|
-
position: DEFAULT_POSITION,
|
|
135
|
-
};
|
|
136
|
-
// учитываем оверайды на основе стака
|
|
137
|
-
const overridesProps = getOverridesByState(prevState, props);
|
|
138
|
-
const newState = {
|
|
139
|
-
...prevStateWithUpdatedProps,
|
|
140
|
-
...{ [uid]: { ...defaultProps, ...props, ...overridesProps } },
|
|
141
|
-
};
|
|
142
|
-
return newState;
|
|
143
|
-
});
|
|
144
|
-
}, [animateOut]);
|
|
145
|
-
const renderFunc = useCallback((uid) => {
|
|
146
|
-
const containerId = state[uid].containerId;
|
|
147
|
-
const container = containerId ? containerRefs.current[containerId] : document.body;
|
|
148
|
-
if (!container) {
|
|
149
|
-
return null;
|
|
150
|
-
}
|
|
151
|
-
return createPortal(jsx(SnackbarRenderer, { ...state[uid], timeout: animationTimeoutRef.current[state[uid].transition], container: container }), container, uid);
|
|
152
|
-
}, [state]);
|
|
153
|
-
const setContainerRef = useCallback((containerId, instance) => {
|
|
154
|
-
if (!instance) {
|
|
155
|
-
return;
|
|
81
|
+
}, []);
|
|
82
|
+
const animateIn = useCallback(
|
|
83
|
+
(uid, props) => {
|
|
84
|
+
setState((prevState) => {
|
|
85
|
+
if (uid in prevState) {
|
|
86
|
+
const { autohideTime, containerId, showTimer, ..._props } = props;
|
|
87
|
+
const overridesProps2 = getOverridesByState(prevState, props);
|
|
88
|
+
return {
|
|
89
|
+
...prevState,
|
|
90
|
+
[uid]: { ...prevState[uid], ..._props, ...overridesProps2 }
|
|
91
|
+
};
|
|
156
92
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const style = window.getComputedStyle(animationTimeoutElement);
|
|
164
|
-
for (const transition of Object.values(SnackbarTransitionName)) {
|
|
165
|
-
const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);
|
|
166
|
-
if (Number.isInteger(animationTimeout)) {
|
|
167
|
-
animationTimeoutRef.current[transition] = animationTimeout;
|
|
168
|
-
}
|
|
93
|
+
const containerIdFromProps = getContainerIdByProps(props);
|
|
94
|
+
const snackbarsByUidMap = snackbarsByUidMapRef.current;
|
|
95
|
+
if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {
|
|
96
|
+
snackbarsByUidMap[containerIdFromProps].add(uid);
|
|
97
|
+
} else {
|
|
98
|
+
snackbarsByUidMap[containerIdFromProps] = /* @__PURE__ */ new Set([uid]);
|
|
169
99
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
100
|
+
const containerWasChanged = getContainerWasChanged(prevState, props);
|
|
101
|
+
const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();
|
|
102
|
+
const stretchedByNewSnackbar = props.stretched === void 0 || props.stretched === true;
|
|
103
|
+
const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {
|
|
104
|
+
const { transition, stretched: prevStretched, position } = prevState[currentUid];
|
|
105
|
+
const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;
|
|
106
|
+
const positionBySet = uidsFromSet.indexOf(currentUid);
|
|
107
|
+
const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;
|
|
108
|
+
const value2 = {
|
|
109
|
+
...prevState[currentUid],
|
|
110
|
+
transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,
|
|
111
|
+
position: containerWasChanged || limitReached ? position : positionBySet,
|
|
112
|
+
stretched
|
|
113
|
+
};
|
|
114
|
+
return { ...accumulator, [currentUid]: value2 };
|
|
115
|
+
}, {});
|
|
116
|
+
const defaultProps = {
|
|
117
|
+
animateOut: (transition) => animateOut(uid, transition),
|
|
118
|
+
isShown: () => !!isShownRef.current[uid],
|
|
119
|
+
onShown: () => isShownRef.current[uid] = true,
|
|
120
|
+
transition: SnackbarTransitionName.Show,
|
|
121
|
+
position: DEFAULT_POSITION
|
|
122
|
+
};
|
|
123
|
+
const overridesProps = getOverridesByState(prevState, props);
|
|
124
|
+
const newState = {
|
|
125
|
+
...prevStateWithUpdatedProps,
|
|
126
|
+
...{ [uid]: { ...defaultProps, ...props, ...overridesProps } }
|
|
178
127
|
};
|
|
179
|
-
|
|
180
|
-
|
|
128
|
+
return newState;
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
[animateOut]
|
|
132
|
+
);
|
|
133
|
+
const renderFunc = useCallback(
|
|
134
|
+
(uid) => {
|
|
135
|
+
const containerId = state[uid].containerId;
|
|
136
|
+
const container = containerId ? containerRefs.current[containerId] : document.body;
|
|
137
|
+
if (!container) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
return createPortal(
|
|
141
|
+
/* @__PURE__ */ jsx(
|
|
142
|
+
SnackbarRenderer,
|
|
143
|
+
{
|
|
144
|
+
...state[uid],
|
|
145
|
+
timeout: animationTimeoutRef.current[state[uid].transition],
|
|
146
|
+
container
|
|
147
|
+
}
|
|
148
|
+
),
|
|
149
|
+
container,
|
|
150
|
+
uid
|
|
151
|
+
);
|
|
152
|
+
},
|
|
153
|
+
[state]
|
|
154
|
+
);
|
|
155
|
+
const setContainerRef = useCallback((containerId, instance) => {
|
|
156
|
+
if (!instance) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
containerRefs.current[containerId] = instance;
|
|
160
|
+
}, []);
|
|
161
|
+
useEffect(() => {
|
|
162
|
+
const animationTimeoutElement = document.createElement("div");
|
|
163
|
+
animationTimeoutElement.classList.add(styles["snackbar-animation-timeout"]);
|
|
164
|
+
document.body.appendChild(animationTimeoutElement);
|
|
165
|
+
const style = window.getComputedStyle(animationTimeoutElement);
|
|
166
|
+
for (const transition of Object.values(SnackbarTransitionName)) {
|
|
167
|
+
const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);
|
|
168
|
+
if (Number.isInteger(animationTimeout)) {
|
|
169
|
+
animationTimeoutRef.current[transition] = animationTimeout;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
document.body.removeChild(animationTimeoutElement);
|
|
173
|
+
}, []);
|
|
174
|
+
const value = useMemo(() => {
|
|
175
|
+
return {
|
|
176
|
+
animateIn,
|
|
177
|
+
animateOut,
|
|
178
|
+
isShown: (uid) => isShownRef.current[uid],
|
|
179
|
+
setContainerRef
|
|
180
|
+
};
|
|
181
|
+
}, [animateIn, animateOut, setContainerRef]);
|
|
182
|
+
return /* @__PURE__ */ jsxs(SnackbarContext.Provider, { value, children: [
|
|
183
|
+
Object.keys(state).map(renderFunc),
|
|
184
|
+
children
|
|
185
|
+
] });
|
|
181
186
|
};
|
|
182
187
|
|
|
183
188
|
export { SnackbarContextProvider };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarContextProvider.js","sources":["src/SnackbarContextProvider.tsx"],"sourcesContent":["import { FC, ReactNode, useCallback, useEffect, useMemo, useState, useRef, PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { SnackbarRenderer } from '@hh.ru/magritte-ui-snackbar/SnackbarRenderer';\nimport { SnackbarContext, SnackbarContextProps } from '@hh.ru/magritte-ui-snackbar/context';\nimport {\n Align,\n SnackbarProps,\n SnackbarState,\n SnackbarTransitionName,\n SnackbarInternalState,\n} from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\ntype ProviderState = { [uid: string]: SnackbarState };\ntype SnackbarsByUidMap = Record<string, Set<string>>;\ntype Overrides = { stretched?: boolean; align?: Align };\n\nconst DEFAULT_CONTAINER = 'body';\nconst DEFAULT_POSITION = 0;\nconst MAX_SNACKBAR_IN_CONTAINER = 2; // отсчет с 0\n\nconst getContainerIdByState = (state: ProviderState, uid: string) => state[uid]?.containerId ?? DEFAULT_CONTAINER;\nconst getContainerIdByProps = (props: SnackbarProps) => props.containerId || DEFAULT_CONTAINER;\n\nconst getContainerWasChanged = (state: ProviderState, props: SnackbarProps) => {\n return getContainerIdByState(state, Object.keys(state)[0]) !== getContainerIdByProps(props);\n};\n\nconst getOverridesByState = (state: ProviderState, props: SnackbarProps): Overrides => {\n let stretchedOverride: undefined | boolean;\n let alignOverride: undefined | Align;\n Object.keys(state).forEach((currentUid) => {\n const { stretched: prevStretched, align: prevAlign } = state[currentUid];\n if (stretchedOverride === undefined && (prevStretched === true || prevStretched === undefined)) {\n stretchedOverride = true;\n }\n if (alignOverride === undefined) {\n alignOverride = prevAlign;\n }\n });\n return getContainerWasChanged(state, props)\n ? {}\n : {\n stretched: stretchedOverride ?? props.stretched,\n align: alignOverride ?? props.align,\n };\n};\n\nexport const SnackbarContextProvider: FC<PropsWithChildren> = ({ children }) => {\n const animationTimeoutRef = useRef({\n [SnackbarTransitionName.Show]: 0,\n [SnackbarTransitionName.Hide]: 0,\n [SnackbarTransitionName.Autohide]: 0,\n [SnackbarTransitionName.RemoveImmediately]: 0,\n });\n const containerRefs = useRef<{ [id: string]: HTMLElement }>({});\n const isShownRef = useRef<{ [uid: string]: boolean }>({});\n const [state, setState] = useState<ProviderState>({});\n const snackbarsByUidMapRef = useRef<SnackbarsByUidMap>({});\n\n const animateOut: SnackbarContextProps['animateOut'] = useCallback((uid, transition) => {\n setState((prevState) => {\n if (!(uid in prevState)) {\n return prevState;\n }\n const isCurrentlyVisible = prevState[uid].transition === SnackbarTransitionName.Show;\n const willBeHidden = [SnackbarTransitionName.Hide, SnackbarTransitionName.Autohide].includes(transition);\n\n if (transition === SnackbarTransitionName.RemoveImmediately || (willBeHidden && !isCurrentlyVisible)) {\n const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];\n snackbarsByUidMap.delete(uid);\n const uids = [...snackbarsByUidMap].reverse();\n delete isShownRef.current[uid];\n return Object.fromEntries(\n Object.entries(prevState)\n .filter(([key]) => key !== uid)\n .map(([key, state]) => {\n // обновляем позицию на основе нового сета\n const index = uids.indexOf(key);\n state.position = index !== -1 ? index : state.position;\n return [key, state];\n })\n );\n }\n return { ...prevState, [uid]: { ...prevState[uid], transition } };\n });\n }, []);\n\n const animateIn: SnackbarContextProps['animateIn'] = useCallback(\n (uid: string, props: SnackbarProps) => {\n setState((prevState) => {\n if (uid in prevState) {\n // не даем менять некоторые пропсы у существующего снекбара\n const { autohideTime, containerId, showTimer, ..._props } = props;\n // применяем оверайды, так как из пропсов прилетают старые значения\n const overridesProps = getOverridesByState(prevState, props);\n return {\n ...prevState,\n [uid]: { ...prevState[uid], ..._props, ...overridesProps } as SnackbarState,\n };\n }\n // сохраняем информацию о uid\n const containerIdFromProps = getContainerIdByProps(props);\n const snackbarsByUidMap = snackbarsByUidMapRef.current;\n if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {\n snackbarsByUidMap[containerIdFromProps].add(uid);\n } else {\n snackbarsByUidMap[containerIdFromProps] = new Set([uid]);\n }\n\n // если прилетел новый снекбар, то все текущие снеки мы скрываем\n const containerWasChanged = getContainerWasChanged(prevState, props);\n\n // если stretched есть в новом снакбаре => везде ставим stretched\n // аналогичная логика с align (новому снекбару ставим align из стака)\n const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();\n const stretchedByNewSnackbar = props.stretched === undefined || props.stretched === true;\n\n // обходим старый стейт и обновлям параметры (align, stretched, position, transition)\n const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {\n const { transition, stretched: prevStretched, position } = prevState[currentUid];\n // если stretched есть в стаке => везде ставим stretched\n const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;\n const positionBySet = uidsFromSet.indexOf(currentUid);\n // скрываем последний снэкбар\n const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;\n const value = {\n ...prevState[currentUid],\n transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,\n position: containerWasChanged || limitReached ? position : positionBySet,\n stretched,\n };\n return { ...accumulator, [currentUid]: value };\n }, {});\n\n // создаем новый snackbar\n const defaultProps: SnackbarInternalState = {\n animateOut: (transition) => animateOut(uid, transition),\n isShown: () => !!isShownRef.current[uid],\n onShown: () => (isShownRef.current[uid] = true),\n transition: SnackbarTransitionName.Show,\n position: DEFAULT_POSITION,\n };\n\n // учитываем оверайды на основе стака\n const overridesProps = getOverridesByState(prevState, props);\n const newState = {\n ...prevStateWithUpdatedProps,\n ...{ [uid]: { ...defaultProps, ...props, ...overridesProps } },\n };\n return newState;\n });\n },\n [animateOut]\n );\n\n const renderFunc = useCallback(\n (uid: string): ReactNode => {\n const containerId = state[uid].containerId;\n const container = containerId ? containerRefs.current[containerId] : document.body;\n\n if (!container) {\n return null;\n }\n return createPortal(\n <SnackbarRenderer\n {...state[uid]}\n timeout={animationTimeoutRef.current[state[uid].transition]}\n container={container}\n />,\n container,\n uid\n );\n },\n [state]\n );\n\n const setContainerRef: SnackbarContextProps['setContainerRef'] = useCallback((containerId, instance) => {\n if (!instance) {\n return;\n }\n containerRefs.current[containerId] = instance;\n }, []);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles['snackbar-animation-timeout']);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n\n for (const transition of Object.values(SnackbarTransitionName)) {\n const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n animationTimeoutRef.current[transition] = animationTimeout;\n }\n }\n\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const value = useMemo<SnackbarContextProps>(() => {\n return {\n animateIn,\n animateOut,\n isShown: (uid) => isShownRef.current[uid],\n setContainerRef,\n };\n }, [animateIn, animateOut, setContainerRef]);\n\n return (\n <SnackbarContext.Provider value={value}>\n {Object.keys(state).map(renderFunc)}\n {children}\n </SnackbarContext.Provider>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SnackbarContextProvider.js","sources":["src/SnackbarContextProvider.tsx"],"sourcesContent":["import { FC, ReactNode, useCallback, useEffect, useMemo, useState, useRef, PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { SnackbarRenderer } from '@hh.ru/magritte-ui-snackbar/SnackbarRenderer';\nimport { SnackbarContext, SnackbarContextProps } from '@hh.ru/magritte-ui-snackbar/context';\nimport {\n Align,\n SnackbarProps,\n SnackbarState,\n SnackbarTransitionName,\n SnackbarInternalState,\n} from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\ntype ProviderState = { [uid: string]: SnackbarState };\ntype SnackbarsByUidMap = Record<string, Set<string>>;\ntype Overrides = { stretched?: boolean; align?: Align };\n\nconst DEFAULT_CONTAINER = 'body';\nconst DEFAULT_POSITION = 0;\nconst MAX_SNACKBAR_IN_CONTAINER = 2; // отсчет с 0\n\nconst getContainerIdByState = (state: ProviderState, uid: string) => state[uid]?.containerId ?? DEFAULT_CONTAINER;\nconst getContainerIdByProps = (props: SnackbarProps) => props.containerId || DEFAULT_CONTAINER;\n\nconst getContainerWasChanged = (state: ProviderState, props: SnackbarProps) => {\n return getContainerIdByState(state, Object.keys(state)[0]) !== getContainerIdByProps(props);\n};\n\nconst getOverridesByState = (state: ProviderState, props: SnackbarProps): Overrides => {\n let stretchedOverride: undefined | boolean;\n let alignOverride: undefined | Align;\n Object.keys(state).forEach((currentUid) => {\n const { stretched: prevStretched, align: prevAlign } = state[currentUid];\n if (stretchedOverride === undefined && (prevStretched === true || prevStretched === undefined)) {\n stretchedOverride = true;\n }\n if (alignOverride === undefined) {\n alignOverride = prevAlign;\n }\n });\n return getContainerWasChanged(state, props)\n ? {}\n : {\n stretched: stretchedOverride ?? props.stretched,\n align: alignOverride ?? props.align,\n };\n};\n\nexport const SnackbarContextProvider: FC<PropsWithChildren> = ({ children }) => {\n const animationTimeoutRef = useRef({\n [SnackbarTransitionName.Show]: 0,\n [SnackbarTransitionName.Hide]: 0,\n [SnackbarTransitionName.Autohide]: 0,\n [SnackbarTransitionName.RemoveImmediately]: 0,\n });\n const containerRefs = useRef<{ [id: string]: HTMLElement }>({});\n const isShownRef = useRef<{ [uid: string]: boolean }>({});\n const [state, setState] = useState<ProviderState>({});\n const snackbarsByUidMapRef = useRef<SnackbarsByUidMap>({});\n\n const animateOut: SnackbarContextProps['animateOut'] = useCallback((uid, transition) => {\n setState((prevState) => {\n if (!(uid in prevState)) {\n return prevState;\n }\n const isCurrentlyVisible = prevState[uid].transition === SnackbarTransitionName.Show;\n const willBeHidden = [SnackbarTransitionName.Hide, SnackbarTransitionName.Autohide].includes(transition);\n\n if (transition === SnackbarTransitionName.RemoveImmediately || (willBeHidden && !isCurrentlyVisible)) {\n const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];\n snackbarsByUidMap.delete(uid);\n const uids = [...snackbarsByUidMap].reverse();\n delete isShownRef.current[uid];\n return Object.fromEntries(\n Object.entries(prevState)\n .filter(([key]) => key !== uid)\n .map(([key, state]) => {\n // обновляем позицию на основе нового сета\n const index = uids.indexOf(key);\n state.position = index !== -1 ? index : state.position;\n return [key, state];\n })\n );\n }\n return { ...prevState, [uid]: { ...prevState[uid], transition } };\n });\n }, []);\n\n const animateIn: SnackbarContextProps['animateIn'] = useCallback(\n (uid: string, props: SnackbarProps) => {\n setState((prevState) => {\n if (uid in prevState) {\n // не даем менять некоторые пропсы у существующего снекбара\n const { autohideTime, containerId, showTimer, ..._props } = props;\n // применяем оверайды, так как из пропсов прилетают старые значения\n const overridesProps = getOverridesByState(prevState, props);\n return {\n ...prevState,\n [uid]: { ...prevState[uid], ..._props, ...overridesProps } as SnackbarState,\n };\n }\n // сохраняем информацию о uid\n const containerIdFromProps = getContainerIdByProps(props);\n const snackbarsByUidMap = snackbarsByUidMapRef.current;\n if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {\n snackbarsByUidMap[containerIdFromProps].add(uid);\n } else {\n snackbarsByUidMap[containerIdFromProps] = new Set([uid]);\n }\n\n // если прилетел новый снекбар, то все текущие снеки мы скрываем\n const containerWasChanged = getContainerWasChanged(prevState, props);\n\n // если stretched есть в новом снакбаре => везде ставим stretched\n // аналогичная логика с align (новому снекбару ставим align из стака)\n const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();\n const stretchedByNewSnackbar = props.stretched === undefined || props.stretched === true;\n\n // обходим старый стейт и обновлям параметры (align, stretched, position, transition)\n const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {\n const { transition, stretched: prevStretched, position } = prevState[currentUid];\n // если stretched есть в стаке => везде ставим stretched\n const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;\n const positionBySet = uidsFromSet.indexOf(currentUid);\n // скрываем последний снэкбар\n const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;\n const value = {\n ...prevState[currentUid],\n transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,\n position: containerWasChanged || limitReached ? position : positionBySet,\n stretched,\n };\n return { ...accumulator, [currentUid]: value };\n }, {});\n\n // создаем новый snackbar\n const defaultProps: SnackbarInternalState = {\n animateOut: (transition) => animateOut(uid, transition),\n isShown: () => !!isShownRef.current[uid],\n onShown: () => (isShownRef.current[uid] = true),\n transition: SnackbarTransitionName.Show,\n position: DEFAULT_POSITION,\n };\n\n // учитываем оверайды на основе стака\n const overridesProps = getOverridesByState(prevState, props);\n const newState = {\n ...prevStateWithUpdatedProps,\n ...{ [uid]: { ...defaultProps, ...props, ...overridesProps } },\n };\n return newState;\n });\n },\n [animateOut]\n );\n\n const renderFunc = useCallback(\n (uid: string): ReactNode => {\n const containerId = state[uid].containerId;\n const container = containerId ? containerRefs.current[containerId] : document.body;\n\n if (!container) {\n return null;\n }\n return createPortal(\n <SnackbarRenderer\n {...state[uid]}\n timeout={animationTimeoutRef.current[state[uid].transition]}\n container={container}\n />,\n container,\n uid\n );\n },\n [state]\n );\n\n const setContainerRef: SnackbarContextProps['setContainerRef'] = useCallback((containerId, instance) => {\n if (!instance) {\n return;\n }\n containerRefs.current[containerId] = instance;\n }, []);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles['snackbar-animation-timeout']);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n\n for (const transition of Object.values(SnackbarTransitionName)) {\n const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n animationTimeoutRef.current[transition] = animationTimeout;\n }\n }\n\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const value = useMemo<SnackbarContextProps>(() => {\n return {\n animateIn,\n animateOut,\n isShown: (uid) => isShownRef.current[uid],\n setContainerRef,\n };\n }, [animateIn, animateOut, setContainerRef]);\n\n return (\n <SnackbarContext.Provider value={value}>\n {Object.keys(state).map(renderFunc)}\n {children}\n </SnackbarContext.Provider>\n );\n};\n"],"names":["state","overridesProps","value"],"mappings":"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"}
|
package/SnackbarRenderer.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
2
|
import '@hh.ru/magritte-common-focus-visible';
|
|
3
|
-
import { SnackbarRendererProps } from '
|
|
3
|
+
import { SnackbarRendererProps } from './types';
|
|
4
4
|
export declare const SnackbarRenderer: FC<SnackbarRendererProps>;
|