@soyfri/shared-library 4.1.1-beta.1 → 4.1.1-beta.3
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/components/StatusMessage/StatusMessageRenderer.d.cts +27 -0
- package/components/StatusMessage/StatusMessageRenderer.d.mts +27 -0
- package/components/StatusMessage/StatusMessageRenderer.d.ts +27 -0
- package/components/StatusMessage/index.cjs +32 -29
- package/components/StatusMessage/index.cjs.map +1 -1
- package/components/StatusMessage/index.d.cts +1 -0
- package/components/StatusMessage/index.d.mts +1 -0
- package/components/StatusMessage/index.d.ts +1 -0
- package/components/StatusMessage/index.mjs +33 -30
- package/components/StatusMessage/index.mjs.map +1 -1
- package/components/StatusMessage/useStatusMessage.d.cts +34 -4
- package/components/StatusMessage/useStatusMessage.d.mts +34 -4
- package/components/StatusMessage/useStatusMessage.d.ts +34 -4
- package/package.json +1 -1
|
@@ -1 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pinta el mensaje vigente del `StatusMessageProvider` en el lugar donde se monte.
|
|
3
|
+
*
|
|
4
|
+
* Separa el *disparo* del mensaje (`useStatusMessage().showMessage`, desde un
|
|
5
|
+
* handler cualquiera) del *lugar* donde se muestra: el consumidor monta un único
|
|
6
|
+
* `<StatusMessageRenderer />` donde quiere ver el feedback (arriba del form, en
|
|
7
|
+
* el layout de la página) y no tiene que llevar `state` ni `close` a mano hasta
|
|
8
|
+
* cada `<StatusMessage>`.
|
|
9
|
+
*
|
|
10
|
+
* - Sin mensaje en el contexto renderiza `null`, así que puede quedar montado
|
|
11
|
+
* siempre sin reservar espacio.
|
|
12
|
+
* - `close` se conecta a `clearMessage`: cerrar limpia el contexto y el
|
|
13
|
+
* componente se desmonta. Por eso el `StatusMessage` queda en modo
|
|
14
|
+
* *uncontrolled* (sin `open`): su visibilidad la decide la existencia del
|
|
15
|
+
* `state`, no un booleano aparte.
|
|
16
|
+
* - El auto-cierre (`autoReset`, 6s) lo resuelve el Provider, no este componente.
|
|
17
|
+
*
|
|
18
|
+
* Debe montarse dentro de un `StatusMessageProvider`; fuera de él el contexto
|
|
19
|
+
* devuelve su valor por defecto (`state: undefined`) y nunca muestra nada, sin
|
|
20
|
+
* error que lo avise.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* <StatusMessageProvider>
|
|
24
|
+
* <StatusMessageRenderer />
|
|
25
|
+
* <MiFormulario /> // adentro: useStatusMessage().showMessage({ messageType: 'danger', description })
|
|
26
|
+
* </StatusMessageProvider>
|
|
27
|
+
*/
|
|
1
28
|
export declare const StatusMessageRenderer: () => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -1 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pinta el mensaje vigente del `StatusMessageProvider` en el lugar donde se monte.
|
|
3
|
+
*
|
|
4
|
+
* Separa el *disparo* del mensaje (`useStatusMessage().showMessage`, desde un
|
|
5
|
+
* handler cualquiera) del *lugar* donde se muestra: el consumidor monta un único
|
|
6
|
+
* `<StatusMessageRenderer />` donde quiere ver el feedback (arriba del form, en
|
|
7
|
+
* el layout de la página) y no tiene que llevar `state` ni `close` a mano hasta
|
|
8
|
+
* cada `<StatusMessage>`.
|
|
9
|
+
*
|
|
10
|
+
* - Sin mensaje en el contexto renderiza `null`, así que puede quedar montado
|
|
11
|
+
* siempre sin reservar espacio.
|
|
12
|
+
* - `close` se conecta a `clearMessage`: cerrar limpia el contexto y el
|
|
13
|
+
* componente se desmonta. Por eso el `StatusMessage` queda en modo
|
|
14
|
+
* *uncontrolled* (sin `open`): su visibilidad la decide la existencia del
|
|
15
|
+
* `state`, no un booleano aparte.
|
|
16
|
+
* - El auto-cierre (`autoReset`, 6s) lo resuelve el Provider, no este componente.
|
|
17
|
+
*
|
|
18
|
+
* Debe montarse dentro de un `StatusMessageProvider`; fuera de él el contexto
|
|
19
|
+
* devuelve su valor por defecto (`state: undefined`) y nunca muestra nada, sin
|
|
20
|
+
* error que lo avise.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* <StatusMessageProvider>
|
|
24
|
+
* <StatusMessageRenderer />
|
|
25
|
+
* <MiFormulario /> // adentro: useStatusMessage().showMessage({ messageType: 'danger', description })
|
|
26
|
+
* </StatusMessageProvider>
|
|
27
|
+
*/
|
|
1
28
|
export declare const StatusMessageRenderer: () => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -1 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pinta el mensaje vigente del `StatusMessageProvider` en el lugar donde se monte.
|
|
3
|
+
*
|
|
4
|
+
* Separa el *disparo* del mensaje (`useStatusMessage().showMessage`, desde un
|
|
5
|
+
* handler cualquiera) del *lugar* donde se muestra: el consumidor monta un único
|
|
6
|
+
* `<StatusMessageRenderer />` donde quiere ver el feedback (arriba del form, en
|
|
7
|
+
* el layout de la página) y no tiene que llevar `state` ni `close` a mano hasta
|
|
8
|
+
* cada `<StatusMessage>`.
|
|
9
|
+
*
|
|
10
|
+
* - Sin mensaje en el contexto renderiza `null`, así que puede quedar montado
|
|
11
|
+
* siempre sin reservar espacio.
|
|
12
|
+
* - `close` se conecta a `clearMessage`: cerrar limpia el contexto y el
|
|
13
|
+
* componente se desmonta. Por eso el `StatusMessage` queda en modo
|
|
14
|
+
* *uncontrolled* (sin `open`): su visibilidad la decide la existencia del
|
|
15
|
+
* `state`, no un booleano aparte.
|
|
16
|
+
* - El auto-cierre (`autoReset`, 6s) lo resuelve el Provider, no este componente.
|
|
17
|
+
*
|
|
18
|
+
* Debe montarse dentro de un `StatusMessageProvider`; fuera de él el contexto
|
|
19
|
+
* devuelve su valor por defecto (`state: undefined`) y nunca muestra nada, sin
|
|
20
|
+
* error que lo avise.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* <StatusMessageProvider>
|
|
24
|
+
* <StatusMessageRenderer />
|
|
25
|
+
* <MiFormulario /> // adentro: useStatusMessage().showMessage({ messageType: 'danger', description })
|
|
26
|
+
* </StatusMessageProvider>
|
|
27
|
+
*/
|
|
1
28
|
export declare const StatusMessageRenderer: () => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -18,6 +18,18 @@ var __spreadValues = (a, b) => {
|
|
|
18
18
|
return a;
|
|
19
19
|
};
|
|
20
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
|
+
};
|
|
21
33
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
22
34
|
const StatusMessage = require("../../chunks/StatusMessage-Bl_E83nN.cjs");
|
|
23
35
|
const jsxRuntime = require("react/jsx-runtime");
|
|
@@ -33,9 +45,13 @@ const StatusMessageContext = React.createContext(initialValues);
|
|
|
33
45
|
const useStatusMessageContext = () => React.useContext(StatusMessageContext);
|
|
34
46
|
const StatusMessageProvider = ({ children }) => {
|
|
35
47
|
const [stateMessage, setMessage] = React.useState(void 0);
|
|
36
|
-
const cleanMessage = () => {
|
|
48
|
+
const cleanMessage = React.useCallback(() => {
|
|
37
49
|
setMessage(void 0);
|
|
38
|
-
};
|
|
50
|
+
}, []);
|
|
51
|
+
const value = React.useMemo(
|
|
52
|
+
() => ({ setMessage, cleanMessage, state: stateMessage }),
|
|
53
|
+
[cleanMessage, stateMessage]
|
|
54
|
+
);
|
|
39
55
|
React.useEffect(() => {
|
|
40
56
|
if (!stateMessage || stateMessage.autoReset === false) return;
|
|
41
57
|
const timeout = setTimeout(() => {
|
|
@@ -43,39 +59,26 @@ const StatusMessageProvider = ({ children }) => {
|
|
|
43
59
|
}, 6e3);
|
|
44
60
|
return () => clearTimeout(timeout);
|
|
45
61
|
}, [stateMessage]);
|
|
46
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StatusMessageContext.Provider, { value
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StatusMessageContext.Provider, { value, children });
|
|
47
63
|
};
|
|
48
64
|
const useStatusMessage = () => {
|
|
49
65
|
const { state, setMessage, cleanMessage } = useStatusMessageContext();
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
title,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
title,
|
|
62
|
-
description,
|
|
63
|
-
messageType: "danger",
|
|
64
|
-
displayType: "alert",
|
|
65
|
-
autoReset
|
|
66
|
-
});
|
|
67
|
-
};
|
|
68
|
-
return {
|
|
69
|
-
state,
|
|
70
|
-
success,
|
|
71
|
-
error,
|
|
72
|
-
cleanMessage
|
|
73
|
-
};
|
|
66
|
+
const showMessage = React.useCallback(
|
|
67
|
+
(_a) => {
|
|
68
|
+
var _b = _a, { displayType = "alert", autoReset = true, title } = _b, rest = __objRest(_b, ["displayType", "autoReset", "title"]);
|
|
69
|
+
setMessage(__spreadProps(__spreadValues({}, rest), { title, displayType, autoReset }));
|
|
70
|
+
},
|
|
71
|
+
[setMessage]
|
|
72
|
+
);
|
|
73
|
+
return React.useMemo(
|
|
74
|
+
() => ({ state, showMessage, clearMessage: cleanMessage }),
|
|
75
|
+
[state, showMessage, cleanMessage]
|
|
76
|
+
);
|
|
74
77
|
};
|
|
75
78
|
const StatusMessageRenderer = () => {
|
|
76
|
-
const { state,
|
|
79
|
+
const { state, clearMessage } = useStatusMessage();
|
|
77
80
|
if (!state) return null;
|
|
78
|
-
return /* @__PURE__ */ jsxRuntime.jsx(StatusMessage.StatusMessage, __spreadProps(__spreadValues({}, state), { close:
|
|
81
|
+
return /* @__PURE__ */ jsxRuntime.jsx(StatusMessage.StatusMessage, __spreadProps(__spreadValues({}, state), { close: clearMessage }));
|
|
79
82
|
};
|
|
80
83
|
exports.StatusMessage = StatusMessage.StatusMessage;
|
|
81
84
|
exports.default = StatusMessage.StatusMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/StatusMessage/StatusMessageContext.tsx","../../../src/components/StatusMessage/useStatusMessage.ts","../../../src/components/StatusMessage/StatusMessageRenderer.tsx"],"sourcesContent":["import {\n createContext,\n useState,\n useContext,\n type Dispatch,\n type SetStateAction,\n type ReactNode,\n useEffect,\n} from 'react';\nimport type { StatusMessageProps } from './StatusMessage';\n\nexport type StatusMessageState = {\n [K in 'title' | 'description' | 'messageType']: StatusMessageProps[K] | undefined;\n} & Pick<StatusMessageProps, 'displayType'> & {\n autoReset?: boolean;\n };\n\ninterface StatusMessageContextValue {\n state: StatusMessageState | undefined;\n setMessage: Dispatch<SetStateAction<StatusMessageState | undefined>>;\n cleanMessage: () => void;\n}\n\nconst initialValues: StatusMessageContextValue = {\n state: undefined,\n setMessage: () => {},\n cleanMessage: () => {},\n};\n\nconst StatusMessageContext = createContext<StatusMessageContextValue>(initialValues);\n\nexport const useStatusMessageContext = () => useContext(StatusMessageContext);\n\ninterface StatusMessageProviderProps {\n children: ReactNode;\n}\n\nexport const StatusMessageProvider = ({ children }: StatusMessageProviderProps) => {\n const [stateMessage, setMessage] = useState<StatusMessageState | undefined>(undefined);\n const cleanMessage = () => {\n setMessage(undefined);\n };\n\n useEffect(() => {\n if (!stateMessage || stateMessage.autoReset === false) return;\n const timeout = setTimeout(() => {\n setMessage(undefined);\n }, 6000);\n return () => clearTimeout(timeout);\n }, [stateMessage]);\n\n return (\n <StatusMessageContext.Provider value={
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/StatusMessage/StatusMessageContext.tsx","../../../src/components/StatusMessage/useStatusMessage.ts","../../../src/components/StatusMessage/StatusMessageRenderer.tsx"],"sourcesContent":["import {\n createContext,\n useState,\n useContext,\n type Dispatch,\n type SetStateAction,\n type ReactNode,\n useEffect,\n useCallback,\n useMemo,\n} from 'react';\nimport type { StatusMessageProps } from './StatusMessage';\n\nexport type StatusMessageState = {\n [K in 'title' | 'description' | 'messageType']: StatusMessageProps[K] | undefined;\n} & Pick<StatusMessageProps, 'displayType'> & {\n autoReset?: boolean;\n };\n\ninterface StatusMessageContextValue {\n state: StatusMessageState | undefined;\n setMessage: Dispatch<SetStateAction<StatusMessageState | undefined>>;\n cleanMessage: () => void;\n}\n\nconst initialValues: StatusMessageContextValue = {\n state: undefined,\n setMessage: () => {},\n cleanMessage: () => {},\n};\n\nconst StatusMessageContext = createContext<StatusMessageContextValue>(initialValues);\n\nexport const useStatusMessageContext = () => useContext(StatusMessageContext);\n\ninterface StatusMessageProviderProps {\n children: ReactNode;\n}\n\nexport const StatusMessageProvider = ({ children }: StatusMessageProviderProps) => {\n const [stateMessage, setMessage] = useState<StatusMessageState | undefined>(undefined);\n // Estables para que los consumidores puedan usarlas como deps de un efecto\n // sin re-dispararlo en cada render del Provider.\n const cleanMessage = useCallback(() => {\n setMessage(undefined);\n }, []);\n \n const value = useMemo(\n () => ({ setMessage, cleanMessage, state: stateMessage }),\n [cleanMessage, stateMessage],\n );\n\n useEffect(() => {\n if (!stateMessage || stateMessage.autoReset === false) return;\n const timeout = setTimeout(() => {\n setMessage(undefined);\n }, 6000);\n return () => clearTimeout(timeout);\n }, [stateMessage]);\n\n return (\n <StatusMessageContext.Provider value={value}>\n {children}\n </StatusMessageContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useStatusMessageContext, type StatusMessageState } from \"./StatusMessageContext\";\n\n/**\n * Lo que recibe `showMessage`. Mismos nombres que las props de `StatusMessage`\n * para que lo que entra sea lo que el componente termina recibiendo.\n * `messageType` y `description` son obligatorios: sin tipo no hay color/icono\n * y sin descripción `StatusMessage` no renderiza.\n */\nexport type ShowMessageOptions = {\n messageType: NonNullable<StatusMessageState[\"messageType\"]>;\n description: string;\n title?: string;\n /** Default: `'alert'`. */\n displayType?: StatusMessageState[\"displayType\"];\n /** Si es `true` el Provider limpia el mensaje a los 6s. Default: `true`. */\n autoReset?: boolean;\n};\n\n/**\n * API recomendada para disparar feedback desde un handler. Se monta sobre el\n * contexto para no exponer el `setMessage` crudo (un `Dispatch` que obliga al\n * consumidor a armar el estado completo) y para centralizar los defaults.\n *\n * Recibe un objeto y no parámetros posicionales: con `title`/`autoReset`\n * opcionales, el orden se volvía ilegible (`fn('Ok', undefined, false)`).\n *\n * `showMessage` y `clearMessage` tienen identidad estable, así que se pueden\n * usar como dependencias de un efecto sin re-dispararlo en cada render.\n *\n * @example\n * const { showMessage } = useStatusMessage();\n * showMessage({ messageType: 'success', description: 'Cambios guardados' });\n */\nexport const useStatusMessage = () => {\n const { state, setMessage, cleanMessage } = useStatusMessageContext();\n\n const showMessage = useCallback(\n ({ displayType = \"alert\", autoReset = true, title, ...rest }: ShowMessageOptions) => {\n setMessage({ ...rest, title, displayType, autoReset });\n },\n [setMessage],\n );\n\n return useMemo(\n () => ({ state, showMessage, clearMessage: cleanMessage }),\n [state, showMessage, cleanMessage],\n );\n};\n","import StatusMessage from \"./StatusMessage\";\nimport { useStatusMessage } from \"./useStatusMessage\";\n\n/**\n * Pinta el mensaje vigente del `StatusMessageProvider` en el lugar donde se monte.\n *\n * Separa el *disparo* del mensaje (`useStatusMessage().showMessage`, desde un\n * handler cualquiera) del *lugar* donde se muestra: el consumidor monta un único\n * `<StatusMessageRenderer />` donde quiere ver el feedback (arriba del form, en\n * el layout de la página) y no tiene que llevar `state` ni `close` a mano hasta\n * cada `<StatusMessage>`.\n *\n * - Sin mensaje en el contexto renderiza `null`, así que puede quedar montado\n * siempre sin reservar espacio.\n * - `close` se conecta a `clearMessage`: cerrar limpia el contexto y el\n * componente se desmonta. Por eso el `StatusMessage` queda en modo\n * *uncontrolled* (sin `open`): su visibilidad la decide la existencia del\n * `state`, no un booleano aparte.\n * - El auto-cierre (`autoReset`, 6s) lo resuelve el Provider, no este componente.\n *\n * Debe montarse dentro de un `StatusMessageProvider`; fuera de él el contexto\n * devuelve su valor por defecto (`state: undefined`) y nunca muestra nada, sin\n * error que lo avise.\n *\n * @example\n * <StatusMessageProvider>\n * <StatusMessageRenderer />\n * <MiFormulario /> // adentro: useStatusMessage().showMessage({ messageType: 'danger', description })\n * </StatusMessageProvider>\n */\nexport const StatusMessageRenderer = () => {\n const { state, clearMessage } = useStatusMessage();\n\n if (!state) return null;\n\n return <StatusMessage {...state} close={clearMessage} />;\n};\n"],"names":["createContext","useContext","useState","useCallback","useMemo","useEffect","jsx","StatusMessage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,gBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,cAAc,MAAM;AAAA,EAAC;AACvB;AAEA,MAAM,uBAAuBA,MAAAA,cAAyC,aAAa;AAE5E,MAAM,0BAA0B,MAAMC,MAAAA,WAAW,oBAAoB;AAMrE,MAAM,wBAAwB,CAAC,EAAE,eAA2C;AACjF,QAAM,CAAC,cAAc,UAAU,IAAIC,MAAAA,SAAyC,MAAS;AAGrF,QAAM,eAAeC,MAAAA,YAAY,MAAM;AACrC,eAAW,MAAS;AAAA,EACtB,GAAG,CAAA,CAAE;AAEL,QAAM,QAAQC,MAAAA;AAAAA,IACZ,OAAO,EAAE,YAAY,cAAc,OAAO,aAAA;AAAA,IAC1C,CAAC,cAAc,YAAY;AAAA,EAAA;AAG5BC,QAAAA,UAAU,MAAM;AACb,QAAI,CAAC,gBAAgB,aAAa,cAAc,MAAO;AACvD,UAAM,UAAU,WAAW,MAAM;AAC9B,iBAAW,MAAS;AAAA,IACvB,GAAG,GAAI;AACP,WAAO,MAAM,aAAa,OAAO;AAAA,EACpC,GAAG,CAAC,YAAY,CAAC;AAElB,SACEC,2BAAAA,IAAC,qBAAqB,UAArB,EAA8B,OAC5B,SAAA,CACH;AAEJ;AC/BO,MAAM,mBAAmB,MAAM;AACnC,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB,wBAAA;AAE5C,QAAM,cAAcH,MAAAA;AAAAA,IACjB,CAAC,OAAoF;AAApF,mBAAE,gBAAc,SAAS,YAAY,MAAM,UAA3C,IAAqD,iBAArD,IAAqD,CAAnD,eAAuB,aAAkB;AACzC,iBAAW,iCAAK,OAAL,EAAW,OAAO,aAAa,YAAW;AAAA,IACxD;AAAA,IACA,CAAC,UAAU;AAAA,EAAA;AAGd,SAAOC,MAAAA;AAAAA,IACJ,OAAO,EAAE,OAAO,aAAa,cAAc,aAAA;AAAA,IAC3C,CAAC,OAAO,aAAa,YAAY;AAAA,EAAA;AAEvC;AClBO,MAAM,wBAAwB,MAAM;AACxC,QAAM,EAAE,OAAO,aAAA,IAAiB,iBAAA;AAEhC,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAOE,2BAAAA,IAACC,cAAAA,eAAA,iCAAkB,QAAlB,EAAyB,OAAO,eAAc;AACzD;;;;;;;"}
|
|
@@ -4,3 +4,4 @@ export { StatusMessageProvider, useStatusMessageContext, } from './StatusMessage
|
|
|
4
4
|
export type { StatusMessageState } from './StatusMessageContext';
|
|
5
5
|
export { StatusMessageRenderer } from './StatusMessageRenderer';
|
|
6
6
|
export { useStatusMessage } from './useStatusMessage';
|
|
7
|
+
export type { ShowMessageOptions } from './useStatusMessage';
|
|
@@ -4,3 +4,4 @@ export { StatusMessageProvider, useStatusMessageContext, } from './StatusMessage
|
|
|
4
4
|
export type { StatusMessageState } from './StatusMessageContext.mjs';
|
|
5
5
|
export { StatusMessageRenderer } from './StatusMessageRenderer.mjs';
|
|
6
6
|
export { useStatusMessage } from './useStatusMessage.mjs';
|
|
7
|
+
export type { ShowMessageOptions } from './useStatusMessage.mjs';
|
|
@@ -4,3 +4,4 @@ export { StatusMessageProvider, useStatusMessageContext, } from './StatusMessage
|
|
|
4
4
|
export type { StatusMessageState } from './StatusMessageContext';
|
|
5
5
|
export { StatusMessageRenderer } from './StatusMessageRenderer';
|
|
6
6
|
export { useStatusMessage } from './useStatusMessage';
|
|
7
|
+
export type { ShowMessageOptions } from './useStatusMessage';
|
|
@@ -17,9 +17,21 @@ var __spreadValues = (a, b) => {
|
|
|
17
17
|
return a;
|
|
18
18
|
};
|
|
19
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
|
+
};
|
|
20
32
|
import { S as StatusMessage } from "../../chunks/StatusMessage-Pa5IutUR.mjs";
|
|
21
33
|
import { jsx } from "react/jsx-runtime";
|
|
22
|
-
import { useContext, useState, useEffect, createContext } from "react";
|
|
34
|
+
import { useContext, useState, useCallback, useMemo, useEffect, createContext } from "react";
|
|
23
35
|
const initialValues = {
|
|
24
36
|
state: void 0,
|
|
25
37
|
setMessage: () => {
|
|
@@ -31,9 +43,13 @@ const StatusMessageContext = createContext(initialValues);
|
|
|
31
43
|
const useStatusMessageContext = () => useContext(StatusMessageContext);
|
|
32
44
|
const StatusMessageProvider = ({ children }) => {
|
|
33
45
|
const [stateMessage, setMessage] = useState(void 0);
|
|
34
|
-
const cleanMessage = () => {
|
|
46
|
+
const cleanMessage = useCallback(() => {
|
|
35
47
|
setMessage(void 0);
|
|
36
|
-
};
|
|
48
|
+
}, []);
|
|
49
|
+
const value = useMemo(
|
|
50
|
+
() => ({ setMessage, cleanMessage, state: stateMessage }),
|
|
51
|
+
[cleanMessage, stateMessage]
|
|
52
|
+
);
|
|
37
53
|
useEffect(() => {
|
|
38
54
|
if (!stateMessage || stateMessage.autoReset === false) return;
|
|
39
55
|
const timeout = setTimeout(() => {
|
|
@@ -41,39 +57,26 @@ const StatusMessageProvider = ({ children }) => {
|
|
|
41
57
|
}, 6e3);
|
|
42
58
|
return () => clearTimeout(timeout);
|
|
43
59
|
}, [stateMessage]);
|
|
44
|
-
return /* @__PURE__ */ jsx(StatusMessageContext.Provider, { value
|
|
60
|
+
return /* @__PURE__ */ jsx(StatusMessageContext.Provider, { value, children });
|
|
45
61
|
};
|
|
46
62
|
const useStatusMessage = () => {
|
|
47
63
|
const { state, setMessage, cleanMessage } = useStatusMessageContext();
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
title,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
title,
|
|
60
|
-
description,
|
|
61
|
-
messageType: "danger",
|
|
62
|
-
displayType: "alert",
|
|
63
|
-
autoReset
|
|
64
|
-
});
|
|
65
|
-
};
|
|
66
|
-
return {
|
|
67
|
-
state,
|
|
68
|
-
success,
|
|
69
|
-
error,
|
|
70
|
-
cleanMessage
|
|
71
|
-
};
|
|
64
|
+
const showMessage = useCallback(
|
|
65
|
+
(_a) => {
|
|
66
|
+
var _b = _a, { displayType = "alert", autoReset = true, title } = _b, rest = __objRest(_b, ["displayType", "autoReset", "title"]);
|
|
67
|
+
setMessage(__spreadProps(__spreadValues({}, rest), { title, displayType, autoReset }));
|
|
68
|
+
},
|
|
69
|
+
[setMessage]
|
|
70
|
+
);
|
|
71
|
+
return useMemo(
|
|
72
|
+
() => ({ state, showMessage, clearMessage: cleanMessage }),
|
|
73
|
+
[state, showMessage, cleanMessage]
|
|
74
|
+
);
|
|
72
75
|
};
|
|
73
76
|
const StatusMessageRenderer = () => {
|
|
74
|
-
const { state,
|
|
77
|
+
const { state, clearMessage } = useStatusMessage();
|
|
75
78
|
if (!state) return null;
|
|
76
|
-
return /* @__PURE__ */ jsx(StatusMessage, __spreadProps(__spreadValues({}, state), { close:
|
|
79
|
+
return /* @__PURE__ */ jsx(StatusMessage, __spreadProps(__spreadValues({}, state), { close: clearMessage }));
|
|
77
80
|
};
|
|
78
81
|
export {
|
|
79
82
|
StatusMessage,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/components/StatusMessage/StatusMessageContext.tsx","../../../src/components/StatusMessage/useStatusMessage.ts","../../../src/components/StatusMessage/StatusMessageRenderer.tsx"],"sourcesContent":["import {\n createContext,\n useState,\n useContext,\n type Dispatch,\n type SetStateAction,\n type ReactNode,\n useEffect,\n} from 'react';\nimport type { StatusMessageProps } from './StatusMessage';\n\nexport type StatusMessageState = {\n [K in 'title' | 'description' | 'messageType']: StatusMessageProps[K] | undefined;\n} & Pick<StatusMessageProps, 'displayType'> & {\n autoReset?: boolean;\n };\n\ninterface StatusMessageContextValue {\n state: StatusMessageState | undefined;\n setMessage: Dispatch<SetStateAction<StatusMessageState | undefined>>;\n cleanMessage: () => void;\n}\n\nconst initialValues: StatusMessageContextValue = {\n state: undefined,\n setMessage: () => {},\n cleanMessage: () => {},\n};\n\nconst StatusMessageContext = createContext<StatusMessageContextValue>(initialValues);\n\nexport const useStatusMessageContext = () => useContext(StatusMessageContext);\n\ninterface StatusMessageProviderProps {\n children: ReactNode;\n}\n\nexport const StatusMessageProvider = ({ children }: StatusMessageProviderProps) => {\n const [stateMessage, setMessage] = useState<StatusMessageState | undefined>(undefined);\n const cleanMessage = () => {\n setMessage(undefined);\n };\n\n useEffect(() => {\n if (!stateMessage || stateMessage.autoReset === false) return;\n const timeout = setTimeout(() => {\n setMessage(undefined);\n }, 6000);\n return () => clearTimeout(timeout);\n }, [stateMessage]);\n\n return (\n <StatusMessageContext.Provider value={
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/components/StatusMessage/StatusMessageContext.tsx","../../../src/components/StatusMessage/useStatusMessage.ts","../../../src/components/StatusMessage/StatusMessageRenderer.tsx"],"sourcesContent":["import {\n createContext,\n useState,\n useContext,\n type Dispatch,\n type SetStateAction,\n type ReactNode,\n useEffect,\n useCallback,\n useMemo,\n} from 'react';\nimport type { StatusMessageProps } from './StatusMessage';\n\nexport type StatusMessageState = {\n [K in 'title' | 'description' | 'messageType']: StatusMessageProps[K] | undefined;\n} & Pick<StatusMessageProps, 'displayType'> & {\n autoReset?: boolean;\n };\n\ninterface StatusMessageContextValue {\n state: StatusMessageState | undefined;\n setMessage: Dispatch<SetStateAction<StatusMessageState | undefined>>;\n cleanMessage: () => void;\n}\n\nconst initialValues: StatusMessageContextValue = {\n state: undefined,\n setMessage: () => {},\n cleanMessage: () => {},\n};\n\nconst StatusMessageContext = createContext<StatusMessageContextValue>(initialValues);\n\nexport const useStatusMessageContext = () => useContext(StatusMessageContext);\n\ninterface StatusMessageProviderProps {\n children: ReactNode;\n}\n\nexport const StatusMessageProvider = ({ children }: StatusMessageProviderProps) => {\n const [stateMessage, setMessage] = useState<StatusMessageState | undefined>(undefined);\n // Estables para que los consumidores puedan usarlas como deps de un efecto\n // sin re-dispararlo en cada render del Provider.\n const cleanMessage = useCallback(() => {\n setMessage(undefined);\n }, []);\n \n const value = useMemo(\n () => ({ setMessage, cleanMessage, state: stateMessage }),\n [cleanMessage, stateMessage],\n );\n\n useEffect(() => {\n if (!stateMessage || stateMessage.autoReset === false) return;\n const timeout = setTimeout(() => {\n setMessage(undefined);\n }, 6000);\n return () => clearTimeout(timeout);\n }, [stateMessage]);\n\n return (\n <StatusMessageContext.Provider value={value}>\n {children}\n </StatusMessageContext.Provider>\n );\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useStatusMessageContext, type StatusMessageState } from \"./StatusMessageContext\";\n\n/**\n * Lo que recibe `showMessage`. Mismos nombres que las props de `StatusMessage`\n * para que lo que entra sea lo que el componente termina recibiendo.\n * `messageType` y `description` son obligatorios: sin tipo no hay color/icono\n * y sin descripción `StatusMessage` no renderiza.\n */\nexport type ShowMessageOptions = {\n messageType: NonNullable<StatusMessageState[\"messageType\"]>;\n description: string;\n title?: string;\n /** Default: `'alert'`. */\n displayType?: StatusMessageState[\"displayType\"];\n /** Si es `true` el Provider limpia el mensaje a los 6s. Default: `true`. */\n autoReset?: boolean;\n};\n\n/**\n * API recomendada para disparar feedback desde un handler. Se monta sobre el\n * contexto para no exponer el `setMessage` crudo (un `Dispatch` que obliga al\n * consumidor a armar el estado completo) y para centralizar los defaults.\n *\n * Recibe un objeto y no parámetros posicionales: con `title`/`autoReset`\n * opcionales, el orden se volvía ilegible (`fn('Ok', undefined, false)`).\n *\n * `showMessage` y `clearMessage` tienen identidad estable, así que se pueden\n * usar como dependencias de un efecto sin re-dispararlo en cada render.\n *\n * @example\n * const { showMessage } = useStatusMessage();\n * showMessage({ messageType: 'success', description: 'Cambios guardados' });\n */\nexport const useStatusMessage = () => {\n const { state, setMessage, cleanMessage } = useStatusMessageContext();\n\n const showMessage = useCallback(\n ({ displayType = \"alert\", autoReset = true, title, ...rest }: ShowMessageOptions) => {\n setMessage({ ...rest, title, displayType, autoReset });\n },\n [setMessage],\n );\n\n return useMemo(\n () => ({ state, showMessage, clearMessage: cleanMessage }),\n [state, showMessage, cleanMessage],\n );\n};\n","import StatusMessage from \"./StatusMessage\";\nimport { useStatusMessage } from \"./useStatusMessage\";\n\n/**\n * Pinta el mensaje vigente del `StatusMessageProvider` en el lugar donde se monte.\n *\n * Separa el *disparo* del mensaje (`useStatusMessage().showMessage`, desde un\n * handler cualquiera) del *lugar* donde se muestra: el consumidor monta un único\n * `<StatusMessageRenderer />` donde quiere ver el feedback (arriba del form, en\n * el layout de la página) y no tiene que llevar `state` ni `close` a mano hasta\n * cada `<StatusMessage>`.\n *\n * - Sin mensaje en el contexto renderiza `null`, así que puede quedar montado\n * siempre sin reservar espacio.\n * - `close` se conecta a `clearMessage`: cerrar limpia el contexto y el\n * componente se desmonta. Por eso el `StatusMessage` queda en modo\n * *uncontrolled* (sin `open`): su visibilidad la decide la existencia del\n * `state`, no un booleano aparte.\n * - El auto-cierre (`autoReset`, 6s) lo resuelve el Provider, no este componente.\n *\n * Debe montarse dentro de un `StatusMessageProvider`; fuera de él el contexto\n * devuelve su valor por defecto (`state: undefined`) y nunca muestra nada, sin\n * error que lo avise.\n *\n * @example\n * <StatusMessageProvider>\n * <StatusMessageRenderer />\n * <MiFormulario /> // adentro: useStatusMessage().showMessage({ messageType: 'danger', description })\n * </StatusMessageProvider>\n */\nexport const StatusMessageRenderer = () => {\n const { state, clearMessage } = useStatusMessage();\n\n if (!state) return null;\n\n return <StatusMessage {...state} close={clearMessage} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,gBAA2C;AAAA,EAC/C,OAAO;AAAA,EACP,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,cAAc,MAAM;AAAA,EAAC;AACvB;AAEA,MAAM,uBAAuB,cAAyC,aAAa;AAE5E,MAAM,0BAA0B,MAAM,WAAW,oBAAoB;AAMrE,MAAM,wBAAwB,CAAC,EAAE,eAA2C;AACjF,QAAM,CAAC,cAAc,UAAU,IAAI,SAAyC,MAAS;AAGrF,QAAM,eAAe,YAAY,MAAM;AACrC,eAAW,MAAS;AAAA,EACtB,GAAG,CAAA,CAAE;AAEL,QAAM,QAAQ;AAAA,IACZ,OAAO,EAAE,YAAY,cAAc,OAAO,aAAA;AAAA,IAC1C,CAAC,cAAc,YAAY;AAAA,EAAA;AAG5B,YAAU,MAAM;AACb,QAAI,CAAC,gBAAgB,aAAa,cAAc,MAAO;AACvD,UAAM,UAAU,WAAW,MAAM;AAC9B,iBAAW,MAAS;AAAA,IACvB,GAAG,GAAI;AACP,WAAO,MAAM,aAAa,OAAO;AAAA,EACpC,GAAG,CAAC,YAAY,CAAC;AAElB,SACE,oBAAC,qBAAqB,UAArB,EAA8B,OAC5B,SAAA,CACH;AAEJ;AC/BO,MAAM,mBAAmB,MAAM;AACnC,QAAM,EAAE,OAAO,YAAY,aAAA,IAAiB,wBAAA;AAE5C,QAAM,cAAc;AAAA,IACjB,CAAC,OAAoF;AAApF,mBAAE,gBAAc,SAAS,YAAY,MAAM,UAA3C,IAAqD,iBAArD,IAAqD,CAAnD,eAAuB,aAAkB;AACzC,iBAAW,iCAAK,OAAL,EAAW,OAAO,aAAa,YAAW;AAAA,IACxD;AAAA,IACA,CAAC,UAAU;AAAA,EAAA;AAGd,SAAO;AAAA,IACJ,OAAO,EAAE,OAAO,aAAa,cAAc,aAAA;AAAA,IAC3C,CAAC,OAAO,aAAa,YAAY;AAAA,EAAA;AAEvC;AClBO,MAAM,wBAAwB,MAAM;AACxC,QAAM,EAAE,OAAO,aAAA,IAAiB,iBAAA;AAEhC,MAAI,CAAC,MAAO,QAAO;AAEnB,SAAO,oBAAC,eAAA,iCAAkB,QAAlB,EAAyB,OAAO,eAAc;AACzD;"}
|
|
@@ -1,6 +1,36 @@
|
|
|
1
|
+
import { StatusMessageState } from './StatusMessageContext';
|
|
2
|
+
/**
|
|
3
|
+
* Lo que recibe `showMessage`. Mismos nombres que las props de `StatusMessage`
|
|
4
|
+
* para que lo que entra sea lo que el componente termina recibiendo.
|
|
5
|
+
* `messageType` y `description` son obligatorios: sin tipo no hay color/icono
|
|
6
|
+
* y sin descripción `StatusMessage` no renderiza.
|
|
7
|
+
*/
|
|
8
|
+
export type ShowMessageOptions = {
|
|
9
|
+
messageType: NonNullable<StatusMessageState["messageType"]>;
|
|
10
|
+
description: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
/** Default: `'alert'`. */
|
|
13
|
+
displayType?: StatusMessageState["displayType"];
|
|
14
|
+
/** Si es `true` el Provider limpia el mensaje a los 6s. Default: `true`. */
|
|
15
|
+
autoReset?: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* API recomendada para disparar feedback desde un handler. Se monta sobre el
|
|
19
|
+
* contexto para no exponer el `setMessage` crudo (un `Dispatch` que obliga al
|
|
20
|
+
* consumidor a armar el estado completo) y para centralizar los defaults.
|
|
21
|
+
*
|
|
22
|
+
* Recibe un objeto y no parámetros posicionales: con `title`/`autoReset`
|
|
23
|
+
* opcionales, el orden se volvía ilegible (`fn('Ok', undefined, false)`).
|
|
24
|
+
*
|
|
25
|
+
* `showMessage` y `clearMessage` tienen identidad estable, así que se pueden
|
|
26
|
+
* usar como dependencias de un efecto sin re-dispararlo en cada render.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const { showMessage } = useStatusMessage();
|
|
30
|
+
* showMessage({ messageType: 'success', description: 'Cambios guardados' });
|
|
31
|
+
*/
|
|
1
32
|
export declare const useStatusMessage: () => {
|
|
2
|
-
state:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
cleanMessage: () => void;
|
|
33
|
+
state: StatusMessageState | undefined;
|
|
34
|
+
showMessage: ({ displayType, autoReset, title, ...rest }: ShowMessageOptions) => void;
|
|
35
|
+
clearMessage: () => void;
|
|
6
36
|
};
|
|
@@ -1,6 +1,36 @@
|
|
|
1
|
+
import { StatusMessageState } from './StatusMessageContext.mjs';
|
|
2
|
+
/**
|
|
3
|
+
* Lo que recibe `showMessage`. Mismos nombres que las props de `StatusMessage`
|
|
4
|
+
* para que lo que entra sea lo que el componente termina recibiendo.
|
|
5
|
+
* `messageType` y `description` son obligatorios: sin tipo no hay color/icono
|
|
6
|
+
* y sin descripción `StatusMessage` no renderiza.
|
|
7
|
+
*/
|
|
8
|
+
export type ShowMessageOptions = {
|
|
9
|
+
messageType: NonNullable<StatusMessageState["messageType"]>;
|
|
10
|
+
description: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
/** Default: `'alert'`. */
|
|
13
|
+
displayType?: StatusMessageState["displayType"];
|
|
14
|
+
/** Si es `true` el Provider limpia el mensaje a los 6s. Default: `true`. */
|
|
15
|
+
autoReset?: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* API recomendada para disparar feedback desde un handler. Se monta sobre el
|
|
19
|
+
* contexto para no exponer el `setMessage` crudo (un `Dispatch` que obliga al
|
|
20
|
+
* consumidor a armar el estado completo) y para centralizar los defaults.
|
|
21
|
+
*
|
|
22
|
+
* Recibe un objeto y no parámetros posicionales: con `title`/`autoReset`
|
|
23
|
+
* opcionales, el orden se volvía ilegible (`fn('Ok', undefined, false)`).
|
|
24
|
+
*
|
|
25
|
+
* `showMessage` y `clearMessage` tienen identidad estable, así que se pueden
|
|
26
|
+
* usar como dependencias de un efecto sin re-dispararlo en cada render.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const { showMessage } = useStatusMessage();
|
|
30
|
+
* showMessage({ messageType: 'success', description: 'Cambios guardados' });
|
|
31
|
+
*/
|
|
1
32
|
export declare const useStatusMessage: () => {
|
|
2
|
-
state:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
cleanMessage: () => void;
|
|
33
|
+
state: StatusMessageState | undefined;
|
|
34
|
+
showMessage: ({ displayType, autoReset, title, ...rest }: ShowMessageOptions) => void;
|
|
35
|
+
clearMessage: () => void;
|
|
6
36
|
};
|
|
@@ -1,6 +1,36 @@
|
|
|
1
|
+
import { StatusMessageState } from './StatusMessageContext';
|
|
2
|
+
/**
|
|
3
|
+
* Lo que recibe `showMessage`. Mismos nombres que las props de `StatusMessage`
|
|
4
|
+
* para que lo que entra sea lo que el componente termina recibiendo.
|
|
5
|
+
* `messageType` y `description` son obligatorios: sin tipo no hay color/icono
|
|
6
|
+
* y sin descripción `StatusMessage` no renderiza.
|
|
7
|
+
*/
|
|
8
|
+
export type ShowMessageOptions = {
|
|
9
|
+
messageType: NonNullable<StatusMessageState["messageType"]>;
|
|
10
|
+
description: string;
|
|
11
|
+
title?: string;
|
|
12
|
+
/** Default: `'alert'`. */
|
|
13
|
+
displayType?: StatusMessageState["displayType"];
|
|
14
|
+
/** Si es `true` el Provider limpia el mensaje a los 6s. Default: `true`. */
|
|
15
|
+
autoReset?: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* API recomendada para disparar feedback desde un handler. Se monta sobre el
|
|
19
|
+
* contexto para no exponer el `setMessage` crudo (un `Dispatch` que obliga al
|
|
20
|
+
* consumidor a armar el estado completo) y para centralizar los defaults.
|
|
21
|
+
*
|
|
22
|
+
* Recibe un objeto y no parámetros posicionales: con `title`/`autoReset`
|
|
23
|
+
* opcionales, el orden se volvía ilegible (`fn('Ok', undefined, false)`).
|
|
24
|
+
*
|
|
25
|
+
* `showMessage` y `clearMessage` tienen identidad estable, así que se pueden
|
|
26
|
+
* usar como dependencias de un efecto sin re-dispararlo en cada render.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* const { showMessage } = useStatusMessage();
|
|
30
|
+
* showMessage({ messageType: 'success', description: 'Cambios guardados' });
|
|
31
|
+
*/
|
|
1
32
|
export declare const useStatusMessage: () => {
|
|
2
|
-
state:
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
cleanMessage: () => void;
|
|
33
|
+
state: StatusMessageState | undefined;
|
|
34
|
+
showMessage: ({ displayType, autoReset, title, ...rest }: ShowMessageOptions) => void;
|
|
35
|
+
clearMessage: () => void;
|
|
6
36
|
};
|