改进下拉菜单

Available in Start plan

一个为 Tiptap 编辑器打造的完全可访问的 AI 驱动下拉菜单。通过键盘快捷键和移动端支持,使用智能建议提升您的文本,包括语法修正、语气调整、翻译及内容修改。

安装

通过 Tiptap CLI 添加此组件:

npx @tiptap/cli@latest add improve-dropdown

组件

<ImproveDropdown />

一个预构建的 React 组件,在下拉界面中提供 AI 驱动的文本改进选项。

使用示例

import { EditorContent, EditorContext, useEditor } from '@tiptap/react'

// --- Tiptap 核心扩展 ---
import { StarterKit } from '@tiptap/starter-kit'
import { Ai } from '@tiptap-pro/extension-ai'
import { Selection } from '@tiptap/extensions'

// --- Tiptap UI ---
import { ImproveDropdown } from '@/components/tiptap-ui/improve-dropdown'
import { AiMenu } from '@/components/tiptap-ui/ai-menu'
import { TIPTAP_AI_APP_ID } from '@/lib/tiptap-collab-utils'
import { UiState } from '@/components/tiptap-extension/ui-state-extension'
import { AiProvider, useAi } from '@/components/contexts/ai-context'

// --- UI 原语 ---
import { ButtonGroup } from '@/components/tiptap-ui-primitive/button'

// --- Tiptap 节点 ---
import '@/components/tiptap-node/blockquote-node/blockquote-node.scss'
import '@/components/tiptap-node/code-block-node/code-block-node.scss'
import '@/components/tiptap-node/horizontal-rule-node/horizontal-rule-node.scss'
import '@/components/tiptap-node/heading-node/heading-node.scss'
import '@/components/tiptap-node/list-node/list-node.scss'
import '@/components/tiptap-node/paragraph-node/paragraph-node.scss'

export const ImproveDropdownExample = () => {
  return (
    <AiProvider>
      <AiEditorWrapper />
    </AiProvider>
  )
}

const AiEditorWrapper = () => {
  const { aiToken } = useAi()

  if (!aiToken) {
    return <div className="tiptap-editor-wrapper">正在加载 AI...</div>
  }

  return <AiEditor aiToken={aiToken} />
}

const AiEditor = ({ aiToken }: { aiToken: string }) => {
  const editor = useEditor({
    immediatelyRender: false,
    extensions: [
      StarterKit,
      Selection,
      UiState,
      Ai.configure({
        appId: TIPTAP_AI_APP_ID,
        token: aiToken,
        autocompletion: false,
        showDecorations: true,
        hideDecorationsOnStreamEnd: false,
        onLoading: (context) => {
          context.editor.commands.aiGenerationSetIsLoading(true)
          context.editor.commands.aiGenerationHasMessage(false)
        },
        onChunk: (context) => {
          context.editor.commands.aiGenerationSetIsLoading(true)
          context.editor.commands.aiGenerationHasMessage(true)
        },
        onSuccess: (context) => {
          const hasMessage = !!context.response
          context.editor.commands.aiGenerationSetIsLoading(false)
          context.editor.commands.aiGenerationHasMessage(hasMessage)
        },
      }),
    ],
    content: `
        <p>选中此文本以查看带有 AI 驱动文本增强选项的改进下拉菜单。</p>
        <p>您可以尝试改进这句话:“这是一个示例句子,有提升空间,也许它有点太长,您可以根据需求简化或扩展它。”</p>
        <p>或者这句:“ai 可以帮助修正您写作中的语法和拼写错误”</p>
        `,
  })

  return (
    <EditorContext.Provider value={{ editor }}>
      <div className="controls-bar">
        <div className="control-item">
          <ButtonGroup orientation="horizontal">
            <ImproveDropdown
              textOptions={{
                stream: true,
                format: 'rich-text',
              }}
              hideWhenUnavailable={false}
            />
          </ButtonGroup>
        </div>
      </div>

      <EditorContent editor={editor} role="presentation" className="control-showcase">
        <AiMenu />
      </EditorContent>
    </EditorContext.Provider>
  )
}

属性

名称类型默认值描述
editorEditor | nullundefinedTiptap 编辑器实例
textOptionsTextOptions{ stream: true, format: "rich-text" }AI 文本处理的配置选项
hideWhenUnavailablebooleanfalse当 AI 功能不可用时隐藏下拉菜单
onImproved() => voidundefined成功改进文本后触发的回调
portalbooleanfalse是否在 portal 中渲染下拉菜单

Hooks

useImproveDropdown()

一个自定义 Hook,用于构建完全掌控渲染和行为的改进下拉菜单。

使用示例

function MyImproveDropdown() {
  const {
    isVisible,
    isDisabled,
    isOpen,
    handleOpenChange,
    executeAICommand,
    adjustTone,
    translate,
    Icon,
  } = useImproveDropdown({
    editor: myEditor,
    hideWhenUnavailable: true,
    onImproved: () => console.log('文本已改进!'),
  })

  if (!isVisible) return null

  return (
    <DropdownMenu open={isOpen} onOpenChange={handleOpenChange}>
      <DropdownMenuTrigger asChild>
        <button disabled={isDisabled} aria-label="改进文本">
          <Icon />
          改进
        </button>
      </DropdownMenuTrigger>
      <DropdownMenuContent>
        <DropdownMenuItem onClick={() => executeAICommand('fixSpellingAndGrammar')}>
          修正拼写和语法
        </DropdownMenuItem>
        <DropdownMenuItem onClick={() => executeAICommand('extend')}>扩展文本</DropdownMenuItem>
        <DropdownMenuItem onClick={() => adjustTone('professional')}>
          变得专业
        </DropdownMenuItem>
      </DropdownMenuContent>
    </DropdownMenu>
  )
}

属性

名称类型默认值描述
editorEditor | nullundefinedTiptap 编辑器实例
hideWhenUnavailablebooleanfalse当 AI 功能不可用时隐藏下拉菜单
onImproved() => voidundefined成功改进文本后触发的回调

返回值

名称类型描述
isVisibleboolean是否显示下拉菜单
isDisabledboolean是否禁用 AI 命令
isOpenboolean下拉菜单当前是否打开
handleOpenChange(open: boolean) => void处理下拉菜单打开/关闭状态的函数
executeAICommand(command: string) => void执行 AI 改进命令的函数
adjustTone(tone: string) => void调整文本语气的函数
translate(language: string) => void翻译文本的函数
IconReact.FC改进下拉菜单的图标组件

AI 功能

改进下拉菜单提供多种 AI 驱动的文本增强选项:

文本增强

  • 修正拼写和语法 - 自动纠正拼写和语法错误
  • 扩展文本 - 用更多相关信息扩展内容
  • 缩减文本 - 在保持意义的前提下缩短内容
  • 简化文本 - 使复杂文本更易读、更易理解
  • 表情符号化 - 添加相关表情符号使文本更生动

内容操作

  • 补全句子 - 智能完成不完整的句子
  • 摘要 - 创建较长文本的简洁摘要

高级选项

  • 调整语气 - 修改文本语气(专业、随意、亲切等)
  • 翻译 - 将文本翻译为不同语言

工具函数

canUseAi(editor)

检查当前选区是否可以使用 AI 功能。

import { canUseAi } from '@/components/tiptap-ui/improve-dropdown'

const aiAvailable = canUseAi(editor)
if (aiAvailable) {
  // 显示 AI 选项
}

shouldShowImproveDropdown(params)

基于编辑器状态和配置,判断是否应显示改进下拉菜单。

import { shouldShowImproveDropdown } from '@/components/tiptap-ui/improve-dropdown'

const shouldShow = shouldShowImproveDropdown({
  editor,
  hideWhenUnavailable: true,
})

executeAICommand(editor, command, textOptions?)

程序化执行 AI 改进命令,对当前选区进行处理。

import { executeAICommand } from '@/components/tiptap-ui/improve-dropdown'

const success = executeAICommand(editor, 'fixSpellingAndGrammar')
if (success) {
  console.log('语法已成功修正!')
}

需求

依赖

  • @tiptap/react - Tiptap React 核心集成
  • @tiptap-pro/extension-ai - AI 文本改进扩展
  • react-hotkeys-hook - 键盘快捷键管理

相关组件

  • use-tiptap-editor(Hook)
  • dropdown-menu(原语)
  • button(原语)
  • card(原语)
  • separator(原语)
  • ai-sparkles-icon(图标)
  • check-ai-icon(图标)
  • text-extend-icon(图标)
  • text-reduce-icon(图标)
  • simplify-2-icon(图标)
  • smile-ai-icon(图标)
  • complete-sentence-icon(图标)
  • summarize-text-icon(图标)
  • languages-icon(图标)
  • mic-ai-icon(图标)

AI 配置

该组件需要在您的 Tiptap 编辑器配置中正确设置 AI 扩展,方能实现完整功能。