memos/web/src/components/MemoEditor
2025-12-31 09:27:37 +08:00
..
components refactor: simplify memo-metadata components 2025-12-31 09:27:37 +08:00
Editor refactor: consolidate and update type definitions across MemoEditor components 2025-12-28 13:17:02 +08:00
hooks refactor: consolidate and update type definitions across MemoEditor components 2025-12-28 13:17:02 +08:00
services feat: react query migration (#5379) 2025-12-24 22:59:18 +08:00
state chore: clean up unused imports and parameters across components 2025-12-27 10:18:38 +08:00
Toolbar refactor: consolidate and update type definitions across MemoEditor components 2025-12-28 13:17:02 +08:00
types refactor: consolidate and update type definitions across MemoEditor components 2025-12-28 13:17:02 +08:00
constants.ts chore(MemoEditor): enhance focus mode handling and improve editor layout 2025-12-23 20:11:38 +08:00
index.tsx refactor: simplify memo-metadata components 2025-12-31 09:27:37 +08:00
README.md refactor(editor): complete state machine and services migration 2025-12-23 08:38:02 +08:00

MemoEditor Architecture

Overview

MemoEditor uses a three-layer architecture for better separation of concerns and testability.

Architecture

┌─────────────────────────────────────────┐
│   Presentation Layer (Components)       │
│   - EditorToolbar, EditorContent, etc.  │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│   State Layer (Reducer + Context)       │
│   - state/, useEditorContext()          │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│   Service Layer (Business Logic)        │
│   - services/ (pure functions)          │
└─────────────────────────────────────────┘

Directory Structure

MemoEditor/
├── state/                  # State management (reducer, actions, context)
├── services/              # Business logic (pure functions)
├── components/            # UI components
├── hooks/                 # React hooks (utilities)
├── Editor/               # Core editor component
├── Toolbar/              # Toolbar components
├── constants.ts
└── types/

Key Concepts

State Management

Uses useReducer + Context for predictable state transitions. All state changes go through action creators.

Services

Pure TypeScript functions containing business logic. No React hooks, easy to test.

Components

Thin presentation components that dispatch actions and render UI.

Usage

import MemoEditor from "@/components/MemoEditor";

<MemoEditor
  memoName="memos/123"
  onConfirm={(name) => console.log('Saved:', name)}
  onCancel={() => console.log('Cancelled')}
/>

Testing

Services are pure functions - easy to unit test without React.

const state = mockEditorState();
const result = await memoService.save(state, { memoName: 'memos/123' });