feat(chat): персистентные черновики сообщений — текст переживает перезагрузку страницы

This commit is contained in:
2026-09-21 15:14:30 +03:00
parent 006d020d15
commit 1f878b61a1
3 changed files with 40 additions and 4 deletions

View File

@@ -0,0 +1,32 @@
import { useState, useEffect, useRef, useCallback } from 'react';
/**
* Черновик сообщения с персистентностью в localStorage.
*
* Текст неотправленного сообщения живёт только в памяти (useState) и пропадает
* при перезагрузке страницы (обновление Service Worker после деплоя, редирект
* авторизации, дискард вкладки). Хук сохраняет текст по ключу и восстанавливает
* при монтировании и при смене ключа (другой чат). Очистка — обычным setValue('').
*/
export function usePersistentDraft(storageKey: string): [string, (value: string) => void] {
const [value, setValue] = useState<string>(() => {
try { return localStorage.getItem(storageKey) ?? ''; } catch { return ''; }
});
const keyRef = useRef(storageKey);
keyRef.current = storageKey;
// Смена чата — восстанавливаем черновик этого чата
useEffect(() => {
try { setValue(localStorage.getItem(storageKey) ?? ''); } catch { setValue(''); }
}, [storageKey]);
const set = useCallback((next: string) => {
setValue(next);
try {
if (next) localStorage.setItem(keyRef.current, next);
else localStorage.removeItem(keyRef.current);
} catch { /* localStorage недоступен (приватный режим и т.п.) */ }
}, []);
return [value, set];
}