@eddydesk/react-native

中文文档
0.14.9发布于 2026/09/27MITTypeScriptESM + CJS零依赖近 30 天下载 4516

EddyDesk 移动应用程序的本地组件

中文使用文档
文档目录19 节
  1. 安装
  2. 可选:图像附件
  3. 快速启动
  4. 配置选项
  5. 为什么用 getAppContext ? 吗?
  6. 自动上下文抓取
  7. 导航跟踪
  8. React 导航集成
  9. 部件结构
  10. 按钮配置
  11. Monorepo 设置
  12. Fix: 配置 Metro 以使用单个反应实例
  13. 替代品:Yarn/npm 工作空间升起
  14. 解决问题
  15. 未显示部件
  16. Supabase连接问题
  17. 已知的限制
  18. 隐藏在模式后面的按钮
  19. 许可证

@ eddydesk/ react-native (英语)

EddyDesk QA 元件用于 React Industrial 移动应用程序 。 具有一个基于导航-上ack的UI的功能,有10个专用屏幕,用于测试,错误报告,信息传递和配置管理.

安装

npm install @eddydesk/react-native @eddydesk/core
# or
yarn add @eddydesk/react-native @eddydesk/core

可选:图像附件

对于错误报告和信件中的图像附件 :

npm install react-native-image-picker

这是一个可选的对等依赖——部件没有它就能工作,但不会显示取相器按钮.

快速启动

import { EddyDeskProvider, EddyDeskButton } from '@eddydesk/react-native';

function App() {
  return (
    <EddyDeskProvider
      config={{
        projectId: 'your-project-id',
        dashboardUrl: 'https://app.eddydesk.ai',
        getCurrentUser: async () => ({
          id: user.id,
          email: user.email,
          name: user.name, // Optional, shown on reports
        }),
      }}
    >
      <YourApp />
      <EddyDeskButton position="bottom-right" />
    </EddyDeskProvider>
  );
}

配置选项

<EddyDeskProvider
  config={{
    // Required
    projectId: 'your-project-id',
    getCurrentUser: async () => ({ id: user.id, email: user.email }),

    // Optional — rich context for bug reports
    getAppContext: () => ({
      currentRoute: currentScreenName,           // Current screen name
      userRole: currentUser?.role,                // 'owner', 'manager', 'guest', etc.
      propertyId: selectedProperty?.id,           // App-specific context
      custom: { theme: 'dark' },                 // Any additional data
    }),

    // Optional — callbacks
    dashboardUrl: 'https://app.eddydesk.ai',              // Web dashboard link in widget
    onNavigate: (route) => navigation.navigate(route),   // Deep link handler for test cases
    onReportSubmitted: (report) => { ... },               // After report submission
    getNavigationHistory: () => [...recentScreens],       // Custom nav tracking

    // Optional — self-hosted
    supabaseUrl: '...',
    supabaseAnonKey: '...',
  }}
  enabled={isAuthReady} // Delay init until auth is ready (default: true)
>

为什么用 getAppContext? 吗?

当测试者报告出错误时,EddyDesk会将应用上下文附在报告上. 这告诉开发者修复错误:

  • 哪个屏幕 窃听器打开了
  • 什么样的角色 用户有( 对角色依赖错误至关重要)
  • App 特定状态 如所选属性、活动过滤器等.

错误报告表还包括一个 "哪个屏幕?" 字段,测试者可以手动指定受影响的屏幕.

自动上下文抓取

EddyDesk Provider 自动捕获零配置的调试上下文 :

数据细节
控制台日志倒数 50 console.log/warn/error/info 电话
网络请求最后20个 fetch() 有方法、 URL、 状态、 持续时间的呼叫
失败的应对机构4xx/5xxx响应机构的首个500个字符
业绩页面加载时间、内存使用
环境语言、时区、在线状态

此数据附于每一份错误报告并提供给 MCP 服务器 get_report_context 用于AI辅助调试的工具.

说明: 对于 React 本地语, 导航历史没有自动抓取( 否) pushState) (中文(简体) ). 使用 getNavigationHistory 或反向导航集成下面用于屏幕跟踪.

导航跟踪

React 导航集成

import { useNavigationContainerRef } from '@react-navigation/native';

function App() {
  const navigationRef = useNavigationContainerRef();
  const routeHistory = useRef<string[]>([]);

  return (
    <EddyDeskProvider
      config={{
        projectId: 'your-project-id',
        getCurrentUser: async () => ({ id: user.id, email: user.email }),
        getNavigationHistory: () => routeHistory.current,
        getAppContext: () => ({
          currentRoute: navigationRef.getCurrentRoute()?.name || 'unknown',
          userRole: currentUser?.role,
        }),
      }}
    >
      <NavigationContainer
        ref={navigationRef}
        onStateChange={() => {
          const name = navigationRef.getCurrentRoute()?.name;
          if (name) {
            routeHistory.current.push(name);
            // Keep last 20
            if (routeHistory.current.length > 20) routeHistory.current.shift();
          }
        }}
      >
        {/* Your navigation */}
      </NavigationContainer>
      <EddyDeskButton />
    </EddyDeskProvider>
  );
}

部件结构

部件使用12个屏幕的导航堆栈模式:

屏幕目的
内容智能英雄横幅+2x2动作网格+发行跟踪卡(打开,完成,再打开)+进度栏
测试列表所有带有过滤标签( All, To Do, Done, Re Opened) 和彩色状态徽章的任务
测试细节通过/失败/滑雪动作一次性执行
测试反馈星标+通过/失败后的质量旗帜
报告Bug/feedback 提交内容包括类型、严重程度、描述、受影响的屏幕
报告成功情况自动返回家中确认
议题清单按类别过滤的问题(开放/处理/重新开放),并附有严重程度指标
问题详情附有验证证明和原始错误上下文的完整发行细节
信件列表带未读徽章的线索列表 + 作曲按钮
线索细节聊天泡+回复作曲家
撰写信件带有主题 + 消息的新线程格式
简介测试者信息、统计和可编辑字段

按钮配置

EddyDesk 按钮在默认情况下可被拖动,并带有边角抓取行为:

<EddyDeskButton
  draggable={true}           // Enable/disable dragging (default: true)
  position="bottom-right"    // Initial position: 'bottom-right' | 'bottom-left'
  initialX={100}             // Custom initial X position (optional)
  initialY={500}             // Custom initial Y position (optional)
  minY={100}                 // Minimum Y from top (default: 100)
  maxYOffset={160}           // Max Y offset from bottom (default: 160)
/>

按钮在发布时会自动向最接近的屏幕边缘快取.

Monorepo 设置

当在单列波中使用EddyDesk(例如有Turborepo,Nx,或Yarn Workspaces)时,可能会遇到重复实例错误,如:

  • "无效的钩子呼叫"
  • 无法读取“ 无效状态” 的财产
  • "只有函数组件的正体内部 才能叫Hooks"

当Metro( React Industrial 的捆绑器)从不同处取出不同的 React 实例时会发生这种情况 node_modules 文件夹.

Fix: 配置 Metro 以使用单个反应实例

更新您的 metro.config.js 在 React 本地应用程序中:

const path = require('path');
const { getDefaultConfig } = require('@react-native/metro-config');

// Get the monorepo root (adjust path as needed)
const monorepoRoot = path.resolve(__dirname, '../..');

const config = getDefaultConfig(__dirname);

// Block React from monorepo root to prevent duplicates
config.resolver.blockList = [
  ...(config.resolver.blockList || []),
  new RegExp(`${monorepoRoot}/node_modules/react/.*`),
  new RegExp(`${monorepoRoot}/node_modules/react-native/.*`),
];

// Ensure Metro uses the app's React instance
config.resolver.extraNodeModules = {
  react: path.resolve(__dirname, 'node_modules/react'),
  'react-native': path.resolve(__dirname, 'node_modules/react-native'),
};

// Watch the monorepo packages
config.watchFolders = [
  monorepoRoot,
];

module.exports = config;

替代品:Yarn/npm 工作空间升起

如果您正在使用Yarn工作空间,您也可以配置起重机,以确保单个回放版本:

// package.json (workspace root)
{
  "workspaces": {
    "packages": ["apps/*", "packages/*"],
    "nohoist": [
      "**/react-native",
      "**/react-native/**"
    ]
  }
}

解决问题

未显示部件

  1. 确保当前用户的电子邮件在EddyDesk仪表板上注册为测试器
  2. 为您的工程启用了 QA 模式
  3. 检查 getCurrentUser 返回有效的电子邮件

Supabase连接问题

如果您使用自己的Supabase实例,请提供证书:

<EddyDeskProvider
  config={{
    projectId: 'your-project-id',
    supabaseUrl: 'https://your-instance.supabase.co',
    supabaseAnonKey: 'your-anon-key',
    getCurrentUser: async () => ({ id: user.id, email: user.email }),
  }}
>

已知的限制

隐藏在模式后面的按钮

EddyDesk 按钮使用绝对定位在正常 React Native 视图分层中制作. 当您的应用程序显示模式,底页,或键盘时,按钮可能隐藏在后方.

工作范围:

  • 接受模式打开时按钮无法访问
  • 考虑放弃进入EddyDesk的方式
  • 对于涉及模式的测试流程,提供触发 EddyDesk 部件的替代方式

许可证

麻省理工学院

版本与发布记录

@eddydesk/react-native 共发布 14 个版本,首次发布于 2026/05/01;过去 12 个月发布了 14 个版本。

版本发布日期距今
0.14.9latest2026/09/271 个月前
0.14.82026/09/261 个月前
0.14.72026/09/171 个月前
0.14.62026/09/161 个月前
0.14.52026/09/161 个月前
0.14.42026/09/141 个月前

关于 @eddydesk/react-native 的常见问题

@eddydesk/react-native 是什么?

EddyDesk 移动应用程序的本地组件

如何安装 @eddydesk/react-native?

在项目目录运行 npm install @eddydesk/react-native,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(^18.0.0 || ^19.0.0)、react-native(>=0.70.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@eddydesk/react-native 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@eddydesk/react-native 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@eddydesk/react-native 可以商用吗?

@eddydesk/react-native 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@eddydesk/react-native 的下载量有多少?

根据 npm 官方下载统计,@eddydesk/react-native 在 2026/10/13 – 2026/11/11 这 30 天内被下载 4,516 次,日均约 151 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@eddydesk/react-native 还在维护吗?

最新版本 0.14.9 发布于 2026/09/27(1 个月前);至今共发布 14 个版本,其中过去 12 个月发布了 14 个;首次发布于 2026/05/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。