From e58b24077837c795ba9a3c100158e2d9841346bb Mon Sep 17 00:00:00 2001 From: clawdbot Date: Wed, 28 Jan 2026 07:26:11 +0800 Subject: [PATCH] refactor: improve goView import and editor context menu parity --- packages/editor/src/editor/ContextMenu.tsx | 12 ++++++++++++ packages/editor/src/editor/EditorApp.tsx | 2 ++ packages/editor/src/editor/store.ts | 4 ++++ packages/sdk/src/core/goview/convert.ts | 2 +- 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/editor/src/editor/ContextMenu.tsx b/packages/editor/src/editor/ContextMenu.tsx index 7a41f47..063f355 100644 --- a/packages/editor/src/editor/ContextMenu.tsx +++ b/packages/editor/src/editor/ContextMenu.tsx @@ -14,9 +14,11 @@ export function ContextMenu(props: { selectionIds: string[]; selectionAllLocked: boolean; selectionAllHidden: boolean; + hasAnyNodes?: boolean; onClose: () => void; onAddTextAt: (x: number, y: number) => void; onSelectSingle?: (id?: string) => void; + onSelectAll?: () => void; onDuplicateSelected?: () => void; onToggleLockSelected?: () => void; onToggleHideSelected?: () => void; @@ -136,6 +138,16 @@ export function ContextMenu(props: { /> ) : null} + {!hasTarget && props.hasAnyNodes && props.onSelectAll ? ( + { + props.onSelectAll?.(); + onClose(); + }} + /> + ) : null} +
0} onClose={closeContextMenu} onAddTextAt={(x, y) => dispatch({ type: 'addTextAt', x, y })} onSelectSingle={(id) => dispatch({ type: 'selectSingle', id })} + onSelectAll={() => dispatch({ type: 'selectAll' })} onDuplicateSelected={() => dispatch({ type: 'duplicateSelected' })} onToggleLockSelected={() => dispatch({ type: 'toggleLockSelected' })} onToggleHideSelected={() => dispatch({ type: 'toggleHideSelected' })} diff --git a/packages/editor/src/editor/store.ts b/packages/editor/src/editor/store.ts index e44dd99..a58d7b2 100644 --- a/packages/editor/src/editor/store.ts +++ b/packages/editor/src/editor/store.ts @@ -27,6 +27,7 @@ export type EditorAction = | { type: 'updatePan'; current: { screenX: number; screenY: number } } | { type: 'endPan' } | { type: 'selectSingle'; id?: string } + | { type: 'selectAll' } | { type: 'toggleSelect'; id: string } | { type: 'beginBoxSelect'; @@ -489,6 +490,9 @@ export function editorReducer(state: EditorState, action: EditorAction): EditorS case 'selectSingle': return { ...state, selection: { ids: action.id ? [action.id] : [] } }; + case 'selectAll': + return { ...state, selection: { ids: state.doc.screen.nodes.map((n) => n.id) } }; + case 'toggleSelect': { const ids = state.selection.ids; if (ids.includes(action.id)) { diff --git a/packages/sdk/src/core/goview/convert.ts b/packages/sdk/src/core/goview/convert.ts index 1c440a0..995312c 100644 --- a/packages/sdk/src/core/goview/convert.ts +++ b/packages/sdk/src/core/goview/convert.ts @@ -493,7 +493,7 @@ export function convertGoViewProjectToScreen(input: GoViewProjectLike | GoViewSt const urlLike = pickUrlLike(option); const urlLooksLikeEmbedPage = !!urlLike && - /(youtube\.com|youtu\.be|vimeo\.com|bilibili\.com|youku\.com|iqiyi\.com|tencent|douyin\.com|kuaishou\.com)/i.test( + /(youtube\.com|youtu\.be|vimeo\.com|bilibili\.com|youku\.com|iqiyi\.com|tencent|qq\.com|mgtv\.com|ixigua\.com|huya\.com|douyu\.com|twitch\.tv|douyin\.com|kuaishou\.com)/i.test( urlLike, ) && // Keep actual media URLs as video.