Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions apps/desktop/src/renderer/src/components/common/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// components/common 对外公共 API barrel:通用展示组件 + 图标 + markdown 渲染工具。
// 跨域消费方(features/* · layout/* · App 等)经此 barrel 引入;common 内部模块相互引用
// (markdownMermaid → MermaidDiagram、Modal → icons、ConfirmModal → Modal)走相对路径,
// 不经此 barrel,避免循环依赖。
export * from './Avatar';
export * from './BitbucketImage';
export * from './ConfirmModal';
export * from './ErrorBoundary';
export * from './LlmProviderIcon';
export * from './Loading';
export * from './MermaidDiagram';
export * from './Modal';
export * from './PlatformIcon';
export * from './StatusChip';
export * from './icons';
export * from './markdownMermaid';
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { LocalPrStatus, PrAgentStatus, StoredPullRequest } from '@meebox/shared';
import { ChatIcon, TrashIcon } from '../../common/icons';
import { ConfirmModal } from '../../common/ConfirmModal';
import { PaneLoading } from '../../common/Loading';
import { ChatIcon, TrashIcon, ConfirmModal, PaneLoading } from '../../common';
import { useChatRunStore } from '../../../stores/chat-run-store';
import { useDraftsForPr } from '../../../stores/drafts-store';
import { CHAT_MAX_WIDTH, CHAT_MIN_WIDTH } from './constants';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { AgentStep } from '@meebox/shared';
import { RobotIcon } from '../../../common/icons';
import { RobotIcon } from '../../../common';
import { formatElapsed, formatTokens } from '../utils/format';
import { Spinner } from './shared';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import type { PrAgentStatus, StoredPullRequest } from '@meebox/shared';
import { ChatIcon } from '../../../common/icons';
import { ChatIcon } from '../../../common';
import { Bullet } from './shared';

export function ChatEmpty({
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { LocalPrStatus, PrAgentStatus, ReviewRunTool, StoredPullRequest } from '@meebox/shared';
import { AutoReviewIcon, SendIcon, StopIcon } from '../../../common/icons';
import type {
LocalPrStatus,
PrAgentStatus,
ReviewRunTool,
StoredPullRequest,
} from '@meebox/shared';
import { AutoReviewIcon, SendIcon, StopIcon } from '../../../common';
import { COMMANDS, type CommandSpec } from '../commands';
import { loadChatHistory, pushChatHistory } from '../utils/chat-history';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import type { AgentMessage } from '@meebox/shared';
import { ChatIcon } from '../../../common/icons';
import { ChatIcon } from '../../../common';
import { VERDICT_LABEL_KEY } from '../constants';
import { Md } from './shared';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import ReactMarkdown from 'react-markdown';
import remarkBreaks from 'remark-breaks';
import remarkGfm from 'remark-gfm';
import type { Finding, PrDocSectionKey, ReviewDraft } from '@meebox/shared';
import { ChevronIcon } from '../../../common/icons';
import { mermaidComponents, walkthroughMdComponents } from '../../../common/markdownMermaid';
import { ChevronIcon, mermaidComponents, walkthroughMdComponents } from '../../../common';
import { REMOTE_REHYPE_PLUGINS } from '../../../../lib/markdown';
import { translatePrAgentLabels } from '../../../../utils/translate-pr-agent';
import {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { ReviewRunTool } from '@meebox/shared';
import { CloseIcon } from '../../../common/icons';
import { CloseIcon } from '../../../common';
import { AskQuestion } from './shared';

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { useTranslation } from 'react-i18next';
import ReactMarkdown from 'react-markdown';
import remarkBreaks from 'remark-breaks';
import remarkGfm from 'remark-gfm';
import { Modal } from '../../../common/Modal';
import { mermaidComponents } from '../../../common/markdownMermaid';
import { Modal, mermaidComponents } from '../../../common';
import { REMOTE_REHYPE_PLUGINS } from '../../../../lib/markdown';
import type { MatchedRule } from '../types';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { Finding, ReviewDraft, ReviewRun } from '@meebox/shared';
import { RetryIcon } from '../../../common/icons';
import { RetryIcon } from '../../../common';
import { orderFindings } from '../utils/findings';
import { formatStartTime, formatTokens, runStatusLabel } from '../utils/format';
import { extractTokenUsage, type TokenUsage } from '../utils/tokens';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@ import { useTranslation } from 'react-i18next';
import ReactMarkdown from 'react-markdown';
import remarkBreaks from 'remark-breaks';
import remarkGfm from 'remark-gfm';
import { QuestionIcon } from '../../../common/icons';
import { mermaidComponents } from '../../../common/markdownMermaid';
import { QuestionIcon, mermaidComponents } from '../../../common';
import { REMOTE_REHYPE_PLUGINS } from '../../../../lib/markdown';
import { parseAnsi, segmentStyle } from '../../../../utils/ansi';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
import { useTranslation } from 'react-i18next';
import { RobotIcon, RobotOffIcon } from '../../../common/icons';
import { StatusChip } from '../../../common/StatusChip';
import { RobotIcon, RobotOffIcon, StatusChip } from '../../../common';

/**
* AutoPilot 开关 chip:默认关,点击切换(持久化到 agent.autopilot.enabled,下次 poll 生效)。
*/
export function AutopilotChip({
enabled,
onToggle,
}: {
enabled: boolean;
onToggle: () => void;
}) {
export function AutopilotChip({ enabled, onToggle }: { enabled: boolean; onToggle: () => void }) {
const { t } = useTranslation();
return (
<StatusChip
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next';
import { invoke } from '../../../../api';
import { useChatRunStore } from '../../../../stores/chat-run-store';
import { formatElapsed } from '../../../../utils/time';
import { StatusChip } from '../../../common/StatusChip';
import { StatusChip } from '../../../common';

/**
* 队列弹出菜单:状态栏 chip 上方弹出。先列全部运行中(active)行,再列 waiting 行。
Expand Down Expand Up @@ -173,7 +173,9 @@ export function PrAgentActiveChip({ onJumpToPr }: { onJumpToPr?: (localId: strin
<>
<span className="statusbar-pragent-dot" aria-hidden="true" />
<span>/{primary.tool}</span>
<span className="statusbar-pragent-elapsed">{formatElapsed(elapsedMs, { compact: true })}</span>
<span className="statusbar-pragent-elapsed">
{formatElapsed(elapsedMs, { compact: true })}
</span>
{extraCount > 0 && (
<span
className="statusbar-pragent-queue-count"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next';
import { SuccessBadgeIcon } from '../../../common/icons';
import { SuccessBadgeIcon } from '../../../common';

export function DoneStep({ submitting, error }: { submitting: boolean; error: string | null }) {
const { t } = useTranslation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useState } from 'react';
import { useTranslation } from 'react-i18next';
import type { LlmProfile } from '@meebox/shared';
import { LLM_PROVIDERS, LlmProfileForm } from '../../settings';
import { LlmProviderIcon } from '../../../common/LlmProviderIcon';
import { LlmProviderIcon } from '../../../common';

export function LlmStep({
draft,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { useTranslation } from 'react-i18next';
import { invoke } from '../../../../api';
import { ConnectionForm, type ConnDraft } from '../../settings';
import { PLATFORM_META } from '../../../common/PlatformIcon';
import { FolderIcon } from '../../../common/icons';
import { PLATFORM_META, FolderIcon } from '../../../common';

export function PlatformStep({
connDraft,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { useRef } from 'react';
import { useTranslation } from 'react-i18next';
import { invoke } from '../../../../api';
import { PullRequestIcon } from '../../../common/icons';
import { PullRequestIcon } from '../../../common';

export function WelcomeStep({ onStart }: { onStart: () => void }) {
const { t } = useTranslation();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import type {
ReviewerStatus,
StoredPullRequest,
} from '@meebox/shared';
import { ApproveIcon, GlobeIcon, NeedsWorkIcon, PullRequestIcon } from '../../common/icons';
import { ApproveIcon, GlobeIcon, NeedsWorkIcon, PullRequestIcon } from '../../common';

/**
* PR 详情头:标题 / 元信息 + 动作区(浏览器打开 · 提交评论 N · 合并 · 通过 / 需修改)。
Expand Down Expand Up @@ -123,7 +123,9 @@ export function PrHeader({
className={`btn btn-sm review-action review-action-needs-work ${pr.localStatus === 'needs_work' ? 'active' : ''}`}
type="button"
disabled={isOwnPr}
onClick={() => onSetStatus(pr.localStatus === 'needs_work' ? 'pending' : 'needs_work')}
onClick={() =>
onSetStatus(pr.localStatus === 'needs_work' ? 'pending' : 'needs_work')
}
title={
ownPrReason ??
(pr.localStatus === 'needs_work'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useTranslation } from 'react-i18next';
import type { AgentRecommendationVerdict, StoredPullRequest } from '@meebox/shared';
import { Avatar } from '../../common/Avatar';
import { PersonIcon, PullRequestIcon, StarIcon } from '../../common/icons';
import { Avatar, PersonIcon, PullRequestIcon, StarIcon } from '../../common';

/** 评审建议 verdict → 复用 chatPane.agent.* 文案(不另加 i18n)。 */
const VERDICT_TITLE: Record<string, string> = {
Expand Down Expand Up @@ -62,7 +61,11 @@ export function PrItem({ pr, selected, onClick, reviewVerdict, executing }: PrIt
<PersonIcon />
{pr.author.displayName}
</span>
{(approvedCount > 0 || needsWorkCount > 0 || canMerge || reviewVerdict || executing) && (
{(approvedCount > 0 ||
needsWorkCount > 0 ||
canMerge ||
reviewVerdict ||
executing) && (
<span className="pr-item-review-chips">
{/* 执行中优先占位(同 ★ 位置):复用运行卡片同款 .spinner(蓝色环旋转、中心对称),
裸图标无 chip 外框,表示该 PR 有在跑的 agent 任务。 */}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type {
} from '@meebox/shared';
import { invoke } from '../../../api';
import { useDraftsForPr } from '../../../stores/drafts-store';
import { PaneLoading } from '../../common/Loading';
import { PaneLoading } from '../../common';
import { ActivityPanel } from './tabs/activity/ActivityPanel';
import { CommitsPanel } from './tabs/CommitsPanel';
// Monaco 编辑器(~10MB)懒加载:只有真正切到 Diff tab 才拉取 DiffView chunk,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { SyncIcon } from '../../../common/icons';
import { StatusChip } from '../../../common/StatusChip';
import { SyncIcon, StatusChip } from '../../../common';
import { formatRelative } from '../../../../utils/time';

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { useTranslation } from 'react-i18next';
import { PullRequestIcon } from '../../../common/icons';
import { StatusChip } from '../../../common/StatusChip';
import { PullRequestIcon, StatusChip } from '../../../common';

/** 待处理 PR 计数 chip。 */
export function PrsCountChip({ count }: { count: number }) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { useTranslation } from 'react-i18next';
import { useRepoSyncStore } from '../../../../stores/repo-sync-store';
import { StatusChip } from '../../../common/StatusChip';
import { StatusChip } from '../../../common';

/**
* Repo sync 活动 chip:显示当前正在 clone/fetch 的 repo + 阶段 + 百分比。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import type { TFunction } from 'i18next';
import type { PrCommit, StoredPullRequest } from '@meebox/shared';
import { invoke } from '../../../../api';
import { formatBackendError, type FormattedError } from '../../../../errors';
import { Avatar } from '../../../common/Avatar';
import { Avatar } from '../../../common';
import { formatExactTime } from './comments/CommentItem';

interface CommitsPanelProps {
Expand Down Expand Up @@ -110,7 +110,10 @@ function CommitRow({
<td className="pr-commits-col-sha">
<code>{commit.abbreviatedSha}</code>
{isMerge && (
<span className="pr-commits-merge-tag" title={`merge commit (${String(commit.parents.length)} parents)`}>
<span
className="pr-commits-merge-tag"
title={`merge commit (${String(commit.parents.length)} parents)`}
>
merge
</span>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import type { ReviewerStatus, StoredPullRequest } from '@meebox/shared';
import { REMOTE_REHYPE_PLUGINS } from '../../../../lib/markdown';
import { Avatar } from '../../../common/Avatar';
import { makeBitbucketImageFor, transformBitbucketUrl } from '../../../common/BitbucketImage';
import { ApproveIcon, NeedsWorkIcon } from '../../../common/icons';
import { mermaidComponents } from '../../../common/markdownMermaid';
import {
Avatar,
makeBitbucketImageFor,
transformBitbucketUrl,
ApproveIcon,
NeedsWorkIcon,
mermaidComponents,
} from '../../../common';

interface PrInfoViewProps {
pr: StoredPullRequest;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { useTranslation } from 'react-i18next';
import { ChatIcon, PersonIcon, WhitespaceIcon } from '../../../common/icons';
import { ChatIcon, PersonIcon, WhitespaceIcon } from '../../../common';

export type PrTab = 'diff' | 'activity' | 'drafts' | 'commits' | 'info';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,15 @@ import type {
} from '@meebox/shared';
import { invoke, subscribe } from '../../../../../api';
import { formatBackendError, type FormattedError } from '../../../../../errors';
import { Avatar } from '../../../../common/Avatar';
import { ApproveIcon, ChatIcon, CloseIcon, CommitIcon, NeedsWorkIcon } from '../../../../common/icons';
import { PaneLoading } from '../../../../common/Loading';
import {
Avatar,
ApproveIcon,
ChatIcon,
CloseIcon,
CommitIcon,
NeedsWorkIcon,
PaneLoading,
} from '../../../../common';
import { CommentComposer } from '../comments/CommentComposer';
import {
CommentItem,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ import { lazy, Suspense, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
import type { PrComment, PrCommentAnchor, StoredPullRequest } from '@meebox/shared';
import i18n from '../../../../../i18n';
import { Avatar } from '../../../../common/Avatar';
import { makeBitbucketImageFor } from '../../../../common/BitbucketImage';
import { ChatIcon } from '../../../../common/icons';
import {
Avatar,
makeBitbucketImageFor,
ChatIcon,
ConfirmModal,
mermaidComponents,
} from '../../../../common';
import { CommentEditEditor } from './CommentEditEditor';
import { CommentReplyEditor } from './CommentReplyEditor';
import { ConfirmModal } from '../../../../common/ConfirmModal';
import { mermaidComponents } from '../../../../common/markdownMermaid';
import { CommentMarkdown } from '../shared/CommentMarkdown';
import { useCommentThread } from '../shared/useCommentThread';
// 行内代码上下文用 Monaco,懒加载随 DiffView 同一套 Monaco chunk 按需拉取,不进入口包。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { type editor as MonacoEditor } from 'monaco-editor';
import type { DiffChangedFile } from '@meebox/ipc';
import { editorFontSize } from '../../../../../lib/editor-font';
import { languageFor } from '../../../../../utils/language';
import { PaneLoading } from '../../../../common/Loading';
import { PaneLoading } from '../../../../common';
import { Spinner } from './DiffStatus';
import type { LoadedContent } from './diff-types';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,7 @@ import { useCallback, useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { createPortal } from 'react-dom';
import type { PrCommit } from '@meebox/shared';
import { Avatar } from '../../../../common/Avatar';
import { ChevronIcon, CommitIcon, PullRequestIcon } from '../../../../common/icons';
import { Avatar, ChevronIcon, CommitIcon, PullRequestIcon } from '../../../../common';
import { formatRelativeTime } from '../comments/CommentItem';
import type { DiffScope } from './diff-types';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,7 @@ import { useTranslation } from 'react-i18next';
import { type editor as MonacoEditor } from 'monaco-editor';
import type { PlatformCapabilities, StoredPullRequest } from '@meebox/shared';
import { useDraftsForPr } from '../../../../../stores/drafts-store';
import { ErrorBoundary } from '../../../../common/ErrorBoundary';
import { PaneLoading } from '../../../../common/Loading';
import { FileTreeIcon, SearchIcon } from '../../../../common/icons';
import { ErrorBoundary, PaneLoading, FileTreeIcon, SearchIcon } from '../../../../common';
import { DiffSearchPanel } from './DiffSearchPanel';
import { FileTree } from './FileTree';
import { DiffScopeSelect } from './DiffScopeSelect';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next';
import type { TFunction } from 'i18next';
import { Icon } from '@iconify/react';
import type { DiffChangedFile } from '@meebox/ipc';
import { ChevronIcon } from '../../../../common/icons';
import { ChevronIcon } from '../../../../common';

interface FileTreeProps {
files: DiffChangedFile[];
Expand Down
Loading
Loading