에디터 UX: Undo/Redo 및 키보드 선택 이동 추가
This commit is contained in:
@@ -51,6 +51,8 @@ export interface Block {
|
||||
export interface EditorState {
|
||||
blocks: Block[];
|
||||
selectedBlockId: string | null;
|
||||
history: Block[][];
|
||||
future: Block[][];
|
||||
addTextBlock: () => void;
|
||||
addButtonBlock: () => void;
|
||||
addImageBlock: () => void;
|
||||
@@ -63,6 +65,8 @@ export interface EditorState {
|
||||
replaceBlocks: (blocks: Block[]) => void;
|
||||
reorderBlocks: (activeId: string, overId: string) => void;
|
||||
moveBlock: (id: string, sectionId: string | null, columnId: string | null) => void;
|
||||
undo: () => void;
|
||||
redo: () => void;
|
||||
}
|
||||
|
||||
// 간단한 ID 생성기 (추후 uuid 라이브러리로 교체 가능)
|
||||
@@ -74,6 +78,8 @@ const createId = () => `blk_${Date.now()}_${idCounter++}`;
|
||||
const createEditorState = (set: any, get: any): EditorState => ({
|
||||
blocks: [],
|
||||
selectedBlockId: null,
|
||||
history: [],
|
||||
future: [],
|
||||
|
||||
// 텍스트 블록 추가: 기본 텍스트와 함께 생성 후 선택 상태로 만든다
|
||||
addTextBlock: () => {
|
||||
@@ -112,6 +118,8 @@ const createEditorState = (set: any, get: any): EditorState => ({
|
||||
set((state: EditorState) => ({
|
||||
blocks: [...state.blocks, newBlock],
|
||||
selectedBlockId: id,
|
||||
history: [...state.history, blocks],
|
||||
future: [],
|
||||
}));
|
||||
},
|
||||
|
||||
@@ -478,6 +486,34 @@ const createEditorState = (set: any, get: any): EditorState => ({
|
||||
),
|
||||
}));
|
||||
},
|
||||
undo: () => {
|
||||
const { history, blocks } = get();
|
||||
if (history.length === 0) return;
|
||||
|
||||
const previous = history[history.length - 1];
|
||||
const nextHistory = history.slice(0, -1);
|
||||
|
||||
set((state: EditorState) => ({
|
||||
blocks: previous,
|
||||
selectedBlockId: previous.length > 0 ? previous[previous.length - 1].id : null,
|
||||
history: nextHistory,
|
||||
future: [...state.future, blocks],
|
||||
}));
|
||||
},
|
||||
redo: () => {
|
||||
const { future, blocks } = get();
|
||||
if (future.length === 0) return;
|
||||
|
||||
const next = future[future.length - 1];
|
||||
const nextFuture = future.slice(0, -1);
|
||||
|
||||
set((state: EditorState) => ({
|
||||
blocks: next,
|
||||
selectedBlockId: next.length > 0 ? next[next.length - 1].id : null,
|
||||
history: [...state.history, blocks],
|
||||
future: nextFuture,
|
||||
}));
|
||||
},
|
||||
});
|
||||
|
||||
// React 컴포넌트에서 사용하는 전역 훅 스토어
|
||||
|
||||
Reference in New Issue
Block a user