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