mirror of
https://github.com/bulwarkmail/native.git
synced 2026-11-01 00:07:01 +00:00
fix: keep the text typed in the Sieve editor when the script refreshes (bulwarkmail/webmail#1162)
This commit is contained in:
@@ -11,6 +11,7 @@ import Button from '../Button';
|
|||||||
import { useLocaleStore } from '../../stores/locale-store';
|
import { useLocaleStore } from '../../stores/locale-store';
|
||||||
import { SafeAreaModal } from '../SafeAreaModal';
|
import { SafeAreaModal } from '../SafeAreaModal';
|
||||||
import { MODAL_ORIENTATIONS } from '../../lib/modal-orientations';
|
import { MODAL_ORIENTATIONS } from '../../lib/modal-orientations';
|
||||||
|
import { seedsOnRender } from '../../lib/sieve/editor-seed';
|
||||||
|
|
||||||
interface SieveEditorSheetProps {
|
interface SieveEditorSheetProps {
|
||||||
visible: boolean;
|
visible: boolean;
|
||||||
@@ -30,14 +31,17 @@ export function SieveEditorSheet({ visible, content, onSave, onClose, onValidate
|
|||||||
const [validationResult, setValidationResult] = useState<{ isValid: boolean; errors?: string[] } | null>(null);
|
const [validationResult, setValidationResult] = useState<{ isValid: boolean; errors?: string[] } | null>(null);
|
||||||
const [showSaveWarning, setShowSaveWarning] = useState(false);
|
const [showSaveWarning, setShowSaveWarning] = useState(false);
|
||||||
|
|
||||||
// Re-seed the editor whenever it's (re)opened with fresh content. Keying the
|
// Seed the editor when it opens, with the script as it is then. A new
|
||||||
// editor on `content` while closed avoids a stale draft on the next open.
|
// `content` while it is open (a store refresh) must not wipe what was
|
||||||
|
// typed (#1162).
|
||||||
|
const wasVisible = React.useRef(false);
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (visible) {
|
if (seedsOnRender(wasVisible.current, visible)) {
|
||||||
setScript(content);
|
setScript(content);
|
||||||
setValidationResult(null);
|
setValidationResult(null);
|
||||||
setShowSaveWarning(false);
|
setShowSaveWarning(false);
|
||||||
}
|
}
|
||||||
|
wasVisible.current = visible;
|
||||||
}, [visible, content]);
|
}, [visible, content]);
|
||||||
|
|
||||||
const lineCount = script.split('\n').length;
|
const lineCount = script.split('\n').length;
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
import { seedsOnRender } from '../editor-seed';
|
||||||
|
|
||||||
|
describe('seedsOnRender', () => {
|
||||||
|
it('seeds the Sieve editor when it opens, not when the script is refreshed while it is open (#1162)', () => {
|
||||||
|
expect(seedsOnRender(false, true)).toBe(true);
|
||||||
|
expect(seedsOnRender(true, true)).toBe(false);
|
||||||
|
expect(seedsOnRender(true, false)).toBe(false);
|
||||||
|
expect(seedsOnRender(false, false)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* Whether an editor sheet takes its content afresh: only when it opens. A
|
||||||
|
* new `content` while it is open (a store refresh) must not replace what the
|
||||||
|
* user typed (#1162).
|
||||||
|
*/
|
||||||
|
export function seedsOnRender(wasVisible: boolean, visible: boolean): boolean {
|
||||||
|
return visible && !wasVisible;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user