mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
feat(renderer): preview store with 300ms debounced source
This commit is contained in:
@@ -0,0 +1,25 @@
|
|||||||
|
import { create } from 'zustand';
|
||||||
|
|
||||||
|
interface PreviewState {
|
||||||
|
source: string;
|
||||||
|
scrollRatio: number;
|
||||||
|
setSource: (s: string) => void;
|
||||||
|
setScrollRatio: (r: number) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DEBOUNCE_MS = 300;
|
||||||
|
let timer: ReturnType<typeof setTimeout> | null = null;
|
||||||
|
let pending: string = '';
|
||||||
|
|
||||||
|
export const usePreviewStore = create<PreviewState>((set) => ({
|
||||||
|
source: '',
|
||||||
|
scrollRatio: 0,
|
||||||
|
setSource: (s) => {
|
||||||
|
pending = s;
|
||||||
|
if (timer) clearTimeout(timer);
|
||||||
|
timer = setTimeout(() => {
|
||||||
|
set({ source: pending });
|
||||||
|
}, DEBOUNCE_MS);
|
||||||
|
},
|
||||||
|
setScrollRatio: (r) => set({ scrollRatio: r }),
|
||||||
|
}));
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { describe, it, expect, beforeEach, vi } from 'vitest';
|
||||||
|
import { usePreviewStore } from '@/stores/preview-store';
|
||||||
|
|
||||||
|
describe('usePreviewStore', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
vi.useFakeTimers();
|
||||||
|
usePreviewStore.setState({ html: '', scrollRatio: 0, source: '' });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('debounces source updates (300 ms)', () => {
|
||||||
|
usePreviewStore.getState().setSource('# a');
|
||||||
|
usePreviewStore.getState().setSource('# b');
|
||||||
|
usePreviewStore.getState().setSource('# c');
|
||||||
|
expect(usePreviewStore.getState().source).toBe('');
|
||||||
|
vi.advanceTimersByTime(300);
|
||||||
|
expect(usePreviewStore.getState().source).toBe('# c');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('updates scroll ratio', () => {
|
||||||
|
usePreviewStore.getState().setScrollRatio(0.5);
|
||||||
|
expect(usePreviewStore.getState().scrollRatio).toBe(0.5);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user