@ceedcv-maya/shared-hooks-react 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ceedcv-maya/shared-hooks-react",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { useAutoSave, type SaveStatus, type UseAutoSaveResult } from './useAutoSave';
2
+ export { useFlushOnPageLeave } from './useFlushOnPageLeave';
2
3
  export { useFilterState, type FilterRecord, type UseFilterStateResult } from './useFilterState';
@@ -14,11 +14,12 @@ export interface UseAutoSaveResult {
14
14
  * Hook de autoguardado con debounce unificado.
15
15
  * Reutilizable en WizardStep2Blocks, TemplateEditor y DocumentWizard.
16
16
  *
17
- * @param saveFn Función async que realiza el guardado.
17
+ * @param saveFn Función async que realiza el guardado. Devuelve `false` si no hubo
18
+ * persistencia real (sin cambios); cualquier otro valor marca éxito.
18
19
  * @param delay Milisegundos de debounce (por defecto 1500ms).
19
20
  */
20
21
  export function useAutoSave(
21
- saveFn: () => Promise<void>,
22
+ saveFn: () => Promise<boolean | void>,
22
23
  delay = 1500,
23
24
  ): UseAutoSaveResult {
24
25
  const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');
@@ -32,7 +33,11 @@ export function useAutoSave(
32
33
  const executeSave = useCallback(async () => {
33
34
  setSaveStatus('saving');
34
35
  try {
35
- await saveFnRef.current();
36
+ const persisted = await saveFnRef.current();
37
+ if (persisted === false) {
38
+ setSaveStatus('idle');
39
+ return;
40
+ }
36
41
  setLastSaved(new Date());
37
42
  setSaveStatus('saved');
38
43
  if (savedClearRef.current) clearTimeout(savedClearRef.current);
@@ -0,0 +1,35 @@
1
+ import { useEffect, useRef } from 'react';
2
+
3
+ /**
4
+ * Ejecuta `flush` cuando el usuario oculta la pestaña o navega fuera
5
+ * (cambio de app, cerrar pestaña, etc.). Complementa el debounce del autoguardado.
6
+ */
7
+ export function useFlushOnPageLeave(
8
+ flush: () => void | Promise<void>,
9
+ enabled = true,
10
+ ): void {
11
+ const flushRef = useRef(flush);
12
+ flushRef.current = flush;
13
+
14
+ useEffect(() => {
15
+ if (!enabled) return;
16
+
17
+ const run = () => {
18
+ void flushRef.current();
19
+ };
20
+
21
+ const onVisibility = () => {
22
+ if (document.visibilityState === 'hidden') {
23
+ run();
24
+ }
25
+ };
26
+
27
+ document.addEventListener('visibilitychange', onVisibility);
28
+ window.addEventListener('pagehide', run);
29
+
30
+ return () => {
31
+ document.removeEventListener('visibilitychange', onVisibility);
32
+ window.removeEventListener('pagehide', run);
33
+ };
34
+ }, [enabled]);
35
+ }