mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-02 09:59:55 +08:00
refactor(editor): remove dependency of command global types (#9903)
Closes: [BS-2216](https://linear.app/affine-design/issue/BS-2216/remove-global-types-in-command)
This commit is contained in:
@@ -3,12 +3,18 @@ import {
|
||||
focusTextModel,
|
||||
onModelTextUpdated,
|
||||
} from '@blocksuite/affine-components/rich-text';
|
||||
import {
|
||||
getBlockSelectionsCommand,
|
||||
getSelectedBlocksCommand,
|
||||
getTextSelectionCommand,
|
||||
} from '@blocksuite/affine-shared/commands';
|
||||
import {
|
||||
matchFlavours,
|
||||
mergeToCodeModel,
|
||||
transformModel,
|
||||
} from '@blocksuite/affine-shared/utils';
|
||||
import {
|
||||
type BlockComponent,
|
||||
BlockSelection,
|
||||
type Command,
|
||||
TextSelection,
|
||||
@@ -21,9 +27,12 @@ type UpdateBlockConfig = {
|
||||
};
|
||||
|
||||
export const updateBlockType: Command<
|
||||
'selectedBlocks',
|
||||
'updatedBlocks',
|
||||
UpdateBlockConfig
|
||||
UpdateBlockConfig & {
|
||||
selectedBlocks?: BlockComponent[];
|
||||
},
|
||||
{
|
||||
updatedBlocks: BlockModel[];
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
const { std, flavour, props } = ctx;
|
||||
const host = std.host;
|
||||
@@ -35,8 +44,11 @@ export const updateBlockType: Command<
|
||||
if (selectedBlocks == null) {
|
||||
const [result, ctx] = std.command
|
||||
.chain()
|
||||
.tryAll(chain => [chain.getTextSelection(), chain.getBlockSelections()])
|
||||
.getSelectedBlocks({ types: ['text', 'block'] })
|
||||
.tryAll(chain => [
|
||||
chain.pipe(getTextSelectionCommand),
|
||||
chain.pipe(getBlockSelectionsCommand),
|
||||
])
|
||||
.pipe(getSelectedBlocksCommand, { types: ['text', 'block'] })
|
||||
.run();
|
||||
if (result) {
|
||||
selectedBlocks = ctx.selectedBlocks;
|
||||
@@ -60,7 +72,10 @@ export const updateBlockType: Command<
|
||||
);
|
||||
}
|
||||
|
||||
const mergeToCode: Command<never, 'updatedBlocks'> = (_, next) => {
|
||||
const mergeToCode: Command<{}, { updatedBlocks: BlockModel[] }> = (
|
||||
_,
|
||||
next
|
||||
) => {
|
||||
if (flavour !== 'affine:code') return;
|
||||
const id = mergeToCodeModel(blockModels);
|
||||
if (!id) return;
|
||||
@@ -72,7 +87,10 @@ export const updateBlockType: Command<
|
||||
}).catch(console.error);
|
||||
return next({ updatedBlocks: [model] });
|
||||
};
|
||||
const appendDivider: Command<never, 'updatedBlocks'> = (_, next) => {
|
||||
const appendDivider: Command<{}, { updatedBlocks: BlockModel[] }> = (
|
||||
_,
|
||||
next
|
||||
) => {
|
||||
if (flavour !== 'affine:divider') {
|
||||
return false;
|
||||
}
|
||||
@@ -99,7 +117,7 @@ export const updateBlockType: Command<
|
||||
return next({ updatedBlocks: [newModel] });
|
||||
};
|
||||
|
||||
const focusText: Command<'updatedBlocks'> = (ctx, next) => {
|
||||
const focusText: Command<{ updatedBlocks: BlockModel[] }> = (ctx, next) => {
|
||||
const { updatedBlocks } = ctx;
|
||||
if (!updatedBlocks || updatedBlocks.length === 0) {
|
||||
return false;
|
||||
@@ -139,7 +157,7 @@ export const updateBlockType: Command<
|
||||
return next();
|
||||
};
|
||||
|
||||
const focusBlock: Command<'updatedBlocks'> = (ctx, next) => {
|
||||
const focusBlock: Command<{ updatedBlocks: BlockModel[] }> = (ctx, next) => {
|
||||
const { updatedBlocks } = ctx;
|
||||
if (!updatedBlocks || updatedBlocks.length === 0) {
|
||||
return false;
|
||||
@@ -165,15 +183,15 @@ export const updateBlockType: Command<
|
||||
|
||||
const [result, resultCtx] = std.command
|
||||
.chain()
|
||||
.inline((_, next) => {
|
||||
.pipe((_, next) => {
|
||||
doc.captureSync();
|
||||
return next();
|
||||
})
|
||||
// update block type
|
||||
.try<'updatedBlocks'>(chain => [
|
||||
chain.inline<'updatedBlocks'>(mergeToCode),
|
||||
chain.inline<'updatedBlocks'>(appendDivider),
|
||||
chain.inline<'updatedBlocks'>((_, next) => {
|
||||
.try<{ updatedBlocks: BlockModel[] }>(chain => [
|
||||
chain.pipe(mergeToCode),
|
||||
chain.pipe(appendDivider),
|
||||
chain.pipe((_, next) => {
|
||||
const newModels: BlockModel[] = [];
|
||||
blockModels.forEach(model => {
|
||||
if (
|
||||
@@ -204,15 +222,15 @@ export const updateBlockType: Command<
|
||||
])
|
||||
// focus
|
||||
.try(chain => [
|
||||
chain.inline((_, next) => {
|
||||
chain.pipe((_, next) => {
|
||||
if (['affine:code', 'affine:divider'].includes(flavour)) {
|
||||
return next();
|
||||
}
|
||||
return false;
|
||||
}),
|
||||
chain.inline(focusText),
|
||||
chain.inline(focusBlock),
|
||||
chain.inline((_, next) => next()),
|
||||
chain.pipe(focusText),
|
||||
chain.pipe(focusBlock),
|
||||
chain.pipe((_, next) => next()),
|
||||
])
|
||||
.run();
|
||||
|
||||
|
||||
@@ -2,11 +2,11 @@ import { NoteDisplayMode } from '@blocksuite/affine-model';
|
||||
import { matchFlavours } from '@blocksuite/affine-shared/utils';
|
||||
import type { Command } from '@blocksuite/block-std';
|
||||
|
||||
export const changeNoteDisplayMode: Command<
|
||||
never,
|
||||
never,
|
||||
{ noteId: string; mode: NoteDisplayMode; stopCapture?: boolean }
|
||||
> = (ctx, next) => {
|
||||
export const changeNoteDisplayMode: Command<{
|
||||
noteId: string;
|
||||
mode: NoteDisplayMode;
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
const { std, noteId, mode, stopCapture } = ctx;
|
||||
|
||||
const noteBlockModel = std.store.getBlock(noteId)?.model;
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import { matchFlavours } from '@blocksuite/affine-shared/utils';
|
||||
import type { Command } from '@blocksuite/block-std';
|
||||
|
||||
export const dedentBlockToRoot: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
import { dedentBlock } from './dedent-block';
|
||||
|
||||
export const dedentBlockToRoot: Command<{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockId } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store } = std;
|
||||
@@ -27,7 +25,7 @@ export const dedentBlockToRoot: Command<
|
||||
if (stopCapture) store.captureSync();
|
||||
changed = true;
|
||||
}
|
||||
std.command.exec('dedentBlock', { blockId: model.id, stopCapture: true });
|
||||
std.command.exec(dedentBlock, { blockId: model.id, stopCapture: true });
|
||||
parent = store.getParent(model);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,14 +20,10 @@ import type { Command } from '@blocksuite/block-std';
|
||||
* - ddd
|
||||
* - eee
|
||||
*/
|
||||
export const dedentBlock: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
export const dedentBlock: Command<{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockId } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store } = std;
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
import { matchFlavours } from '@blocksuite/affine-shared/utils';
|
||||
import { type Command, TextSelection } from '@blocksuite/block-std';
|
||||
|
||||
export const dedentBlocksToRoot: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
import { dedentBlockToRoot } from './dedent-block-to-root';
|
||||
|
||||
export const dedentBlocksToRoot: Command<{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockIds } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store } = std;
|
||||
@@ -33,7 +31,7 @@ export const dedentBlocksToRoot: Command<
|
||||
const model = blockIds[i];
|
||||
const parent = store.getParent(model);
|
||||
if (parent && !matchFlavours(parent, ['affine:note'])) {
|
||||
std.command.exec('dedentBlockToRoot', {
|
||||
std.command.exec(dedentBlockToRoot, {
|
||||
blockId: model,
|
||||
stopCapture: false,
|
||||
});
|
||||
|
||||
@@ -4,14 +4,12 @@ import {
|
||||
} from '@blocksuite/affine-shared/utils';
|
||||
import { type Command, TextSelection } from '@blocksuite/block-std';
|
||||
|
||||
export const dedentBlocks: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
import { dedentBlock } from './dedent-block';
|
||||
|
||||
export const dedentBlocks: Command<{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockIds } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store, selection, range, host } = std;
|
||||
@@ -72,7 +70,7 @@ export const dedentBlocks: Command<
|
||||
.slice(firstDedentIndex)
|
||||
.filter(id => !collapsedIds.includes(id));
|
||||
dedentIds.reverse().forEach(id => {
|
||||
std.command.exec('dedentBlock', { blockId: id, stopCapture: false });
|
||||
std.command.exec(dedentBlock, { blockId: id, stopCapture: false });
|
||||
});
|
||||
|
||||
const textSelection = selection.find(TextSelection);
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
import { type Command, TextSelection } from '@blocksuite/block-std';
|
||||
import {
|
||||
type BlockComponent,
|
||||
type Command,
|
||||
TextSelection,
|
||||
} from '@blocksuite/block-std';
|
||||
|
||||
export const focusBlockEnd: Command<'focusBlock'> = (ctx, next) => {
|
||||
export const focusBlockEnd: Command<{
|
||||
focusBlock?: BlockComponent;
|
||||
}> = (ctx, next) => {
|
||||
const { focusBlock, std } = ctx;
|
||||
if (!focusBlock || !focusBlock.model.text) return;
|
||||
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
import { type Command, TextSelection } from '@blocksuite/block-std';
|
||||
import {
|
||||
type BlockComponent,
|
||||
type Command,
|
||||
TextSelection,
|
||||
} from '@blocksuite/block-std';
|
||||
|
||||
export const focusBlockStart: Command<'focusBlock'> = (ctx, next) => {
|
||||
export const focusBlockStart: Command<{
|
||||
focusBlock?: BlockComponent;
|
||||
}> = (ctx, next) => {
|
||||
const { focusBlock, std } = ctx;
|
||||
if (!focusBlock || !focusBlock.model.text) return;
|
||||
|
||||
|
||||
@@ -21,14 +21,10 @@ import type { Command } from '@blocksuite/block-std';
|
||||
* - ddd
|
||||
* - eee
|
||||
*/
|
||||
export const indentBlock: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
export const indentBlock: Command<{
|
||||
blockId?: string;
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockId } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store } = std;
|
||||
|
||||
@@ -5,14 +5,12 @@ import {
|
||||
} from '@blocksuite/affine-shared/utils';
|
||||
import { type Command, TextSelection } from '@blocksuite/block-std';
|
||||
|
||||
export const indentBlocks: Command<
|
||||
never,
|
||||
never,
|
||||
{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}
|
||||
> = (ctx, next) => {
|
||||
import { indentBlock } from './indent-block';
|
||||
|
||||
export const indentBlocks: Command<{
|
||||
blockIds?: string[];
|
||||
stopCapture?: boolean;
|
||||
}> = (ctx, next) => {
|
||||
let { blockIds } = ctx;
|
||||
const { std, stopCapture = true } = ctx;
|
||||
const { store, selection, range, host } = std;
|
||||
@@ -95,7 +93,7 @@ export const indentBlocks: Command<
|
||||
}
|
||||
|
||||
indentIds.forEach(id => {
|
||||
std.command.exec('indentBlock', { blockId: id, stopCapture: false });
|
||||
std.command.exec(indentBlock, { blockId: id, stopCapture: false });
|
||||
});
|
||||
|
||||
{
|
||||
|
||||
@@ -1,42 +1,12 @@
|
||||
import {
|
||||
getBlockIndexCommand,
|
||||
getBlockSelectionsCommand,
|
||||
getNextBlockCommand,
|
||||
getPrevBlockCommand,
|
||||
getSelectedBlocksCommand,
|
||||
} from '@blocksuite/affine-shared/commands';
|
||||
import type { BlockCommands } from '@blocksuite/block-std';
|
||||
|
||||
import { updateBlockType } from './block-type.js';
|
||||
import { changeNoteDisplayMode } from './change-note-display-mode.js';
|
||||
import { dedentBlock } from './dedent-block.js';
|
||||
import { dedentBlockToRoot } from './dedent-block-to-root.js';
|
||||
import { dedentBlocks } from './dedent-blocks.js';
|
||||
import { dedentBlocksToRoot } from './dedent-blocks-to-root.js';
|
||||
import { focusBlockEnd } from './focus-block-end.js';
|
||||
import { focusBlockStart } from './focus-block-start.js';
|
||||
import { indentBlock } from './indent-block.js';
|
||||
import { indentBlocks } from './indent-blocks.js';
|
||||
import { selectBlock } from './select-block.js';
|
||||
import { selectBlocksBetween } from './select-blocks-between.js';
|
||||
|
||||
export const commands: BlockCommands = {
|
||||
// block
|
||||
getBlockIndex: getBlockIndexCommand,
|
||||
getPrevBlock: getPrevBlockCommand,
|
||||
getNextBlock: getNextBlockCommand,
|
||||
getSelectedBlocks: getSelectedBlocksCommand,
|
||||
getBlockSelections: getBlockSelectionsCommand,
|
||||
selectBlock,
|
||||
selectBlocksBetween,
|
||||
focusBlockStart,
|
||||
focusBlockEnd,
|
||||
updateBlockType,
|
||||
indentBlock,
|
||||
dedentBlock,
|
||||
indentBlocks,
|
||||
dedentBlocks,
|
||||
dedentBlockToRoot,
|
||||
dedentBlocksToRoot,
|
||||
changeNoteDisplayMode,
|
||||
};
|
||||
export { updateBlockType } from './block-type.js';
|
||||
export { changeNoteDisplayMode } from './change-note-display-mode.js';
|
||||
export { dedentBlock } from './dedent-block.js';
|
||||
export { dedentBlockToRoot } from './dedent-block-to-root.js';
|
||||
export { dedentBlocks } from './dedent-blocks.js';
|
||||
export { dedentBlocksToRoot } from './dedent-blocks-to-root.js';
|
||||
export { focusBlockEnd } from './focus-block-end.js';
|
||||
export { focusBlockStart } from './focus-block-start.js';
|
||||
export { indentBlock } from './indent-block.js';
|
||||
export { indentBlocks } from './indent-blocks.js';
|
||||
export { selectBlock } from './select-block.js';
|
||||
export { selectBlocksBetween } from './select-blocks-between.js';
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
import { BlockSelection, type Command } from '@blocksuite/block-std';
|
||||
import {
|
||||
type BlockComponent,
|
||||
BlockSelection,
|
||||
type Command,
|
||||
} from '@blocksuite/block-std';
|
||||
|
||||
export const selectBlock: Command<'focusBlock'> = (ctx, next) => {
|
||||
export const selectBlock: Command<{
|
||||
focusBlock?: BlockComponent;
|
||||
}> = (ctx, next) => {
|
||||
const { focusBlock, std } = ctx;
|
||||
if (!focusBlock) {
|
||||
return;
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
import { BlockSelection, type Command } from '@blocksuite/block-std';
|
||||
import {
|
||||
type BlockComponent,
|
||||
BlockSelection,
|
||||
type Command,
|
||||
} from '@blocksuite/block-std';
|
||||
|
||||
export const selectBlocksBetween: Command<
|
||||
'focusBlock' | 'anchorBlock',
|
||||
never,
|
||||
{ tail: boolean }
|
||||
> = (ctx, next) => {
|
||||
export const selectBlocksBetween: Command<{
|
||||
focusBlock?: BlockComponent;
|
||||
anchorBlock?: BlockComponent;
|
||||
tail: boolean;
|
||||
}> = (ctx, next) => {
|
||||
const { focusBlock, anchorBlock, tail } = ctx;
|
||||
if (!focusBlock || !anchorBlock) {
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user