mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-03-10 08:27:40 +00:00
# Conflicts: # src/App.tsx # src/components/app/MobileNav.tsx # src/components/main-content/view/MainContent.tsx # src/components/main-content/view/subcomponents/MainContentTabSwitcher.tsx # src/components/main-content/view/subcomponents/MainContentTitle.tsx # src/components/settings/view/SettingsMainTabs.tsx
90 lines
3.1 KiB
TypeScript
90 lines
3.1 KiB
TypeScript
import { useTranslation } from 'react-i18next';
|
|
import SessionProviderLogo from '../../../llm-logo-provider/SessionProviderLogo';
|
|
import type { AppTab, Project, ProjectSession } from '../../../../types/app';
|
|
import { usePlugins } from '../../../../contexts/PluginsContext';
|
|
|
|
type MainContentTitleProps = {
|
|
activeTab: AppTab;
|
|
selectedProject: Project;
|
|
selectedSession: ProjectSession | null;
|
|
shouldShowTasksTab: boolean;
|
|
};
|
|
|
|
function getTabTitle(activeTab: AppTab, shouldShowTasksTab: boolean, t: (key: string) => string, pluginDisplayName?: string) {
|
|
if (activeTab.startsWith('plugin:') && pluginDisplayName) {
|
|
return pluginDisplayName;
|
|
}
|
|
|
|
if (activeTab === 'files') {
|
|
return t('mainContent.projectFiles');
|
|
}
|
|
|
|
if (activeTab === 'git') {
|
|
return t('tabs.git');
|
|
}
|
|
|
|
if (activeTab === 'tasks' && shouldShowTasksTab) {
|
|
return 'TaskMaster';
|
|
}
|
|
|
|
return 'Project';
|
|
}
|
|
|
|
function getSessionTitle(session: ProjectSession): string {
|
|
if (session.__provider === 'cursor') {
|
|
return (session.name as string) || 'Untitled Session';
|
|
}
|
|
|
|
return (session.summary as string) || 'New Session';
|
|
}
|
|
|
|
export default function MainContentTitle({
|
|
activeTab,
|
|
selectedProject,
|
|
selectedSession,
|
|
shouldShowTasksTab,
|
|
}: MainContentTitleProps) {
|
|
const { t } = useTranslation();
|
|
const { plugins } = usePlugins();
|
|
|
|
const pluginDisplayName = activeTab.startsWith('plugin:')
|
|
? plugins.find((p) => p.name === activeTab.replace('plugin:', ''))?.displayName
|
|
: undefined;
|
|
|
|
const showSessionIcon = activeTab === 'chat' && Boolean(selectedSession);
|
|
const showChatNewSession = activeTab === 'chat' && !selectedSession;
|
|
|
|
return (
|
|
<div className="scrollbar-hide flex min-w-0 flex-1 items-center gap-2 overflow-x-auto">
|
|
{showSessionIcon && (
|
|
<div className="flex h-5 w-5 flex-shrink-0 items-center justify-center">
|
|
<SessionProviderLogo provider={selectedSession?.__provider} className="h-4 w-4" />
|
|
</div>
|
|
)}
|
|
|
|
<div className="min-w-0 flex-1">
|
|
{activeTab === 'chat' && selectedSession ? (
|
|
<div className="min-w-0">
|
|
<h2 className="scrollbar-hide overflow-x-auto whitespace-nowrap text-sm font-semibold leading-tight text-foreground">
|
|
{getSessionTitle(selectedSession)}
|
|
</h2>
|
|
<div className="truncate text-[11px] leading-tight text-muted-foreground">{selectedProject.displayName}</div>
|
|
</div>
|
|
) : showChatNewSession ? (
|
|
<div className="min-w-0">
|
|
<h2 className="text-base font-semibold leading-tight text-foreground">{t('mainContent.newSession')}</h2>
|
|
<div className="truncate text-xs leading-tight text-muted-foreground">{selectedProject.displayName}</div>
|
|
</div>
|
|
) : (
|
|
<div className="min-w-0">
|
|
<h2 className="text-sm font-semibold leading-tight text-foreground">
|
|
{getTabTitle(activeTab, shouldShowTasksTab, t, pluginDisplayName)}
|
|
</h2>
|
|
<div className="truncate text-[11px] leading-tight text-muted-foreground">{selectedProject.displayName}</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|