diff --git a/src/App.tsx b/src/App.tsx index a3b1299..e75b164 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -10,7 +10,6 @@ import { ProjectList } from "@/components/ProjectList"; import { SessionList } from "@/components/SessionList"; import { RunningClaudeSessions } from "@/components/RunningClaudeSessions"; import { Topbar } from "@/components/Topbar"; -import { ClaudeFileEditor } from "@/components/ClaudeFileEditor"; import { CCAgents } from "@/components/CCAgents"; import { NFOCredits } from "@/components/NFOCredits"; import { ClaudeBinaryDialog } from "@/components/ClaudeBinaryDialog"; @@ -37,7 +36,6 @@ const MCPManager = lazy(() => import('@/components/MCPManager').then(m => ({ def type View = | "welcome" | "projects" - | "claude-file-editor" | "settings" | "cc-agents" | "create-agent" @@ -70,7 +68,7 @@ function AppContent() { const [projects, setProjects] = useState([]); const [selectedProject, setSelectedProject] = useState(null); const [sessions, setSessions] = useState([]); - const [editingClaudeFile, setEditingClaudeFile] = useState(null); + // Removed: project-level ClaudeFileEditor state const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showNFO, setShowNFO] = useState(false); @@ -390,18 +388,7 @@ function AppContent() { /** * Handles editing a CLAUDE.md file from a project */ - const handleEditClaudeFile = (file: ClaudeMdFile) => { - setEditingClaudeFile(file); - handleViewChange("claude-file-editor"); - }; - - /** - * Returns from CLAUDE.md file editor to projects view - */ - const handleBackFromClaudeFileEditor = () => { - setEditingClaudeFile(null); - handleViewChange("projects"); - }; + // Removed project-level ClaudeFileEditor routes and handlers /** * Handles view changes with navigation protection @@ -533,7 +520,6 @@ function AppContent() { sessions={sessions} projectPath={selectedProject.path} onBack={handleBack} - onEditClaudeFile={handleEditClaudeFile} onSessionClick={(session) => { // Navigate to session detail view in tabs mode setView("tabs"); @@ -585,15 +571,7 @@ function AppContent() { ); - case "claude-file-editor": - return editingClaudeFile ? ( -
- -
- ) : null; + // Removed: claude-file-editor view case "tabs": return ( diff --git a/src/components/ClaudeFileEditor.tsx b/src/components/ClaudeFileEditor.tsx deleted file mode 100644 index c04ad9b..0000000 --- a/src/components/ClaudeFileEditor.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import React, { useState, useEffect } from "react"; -import MDEditor from "@uiw/react-md-editor"; -import { motion } from "framer-motion"; -import { ArrowLeft, Save, Loader2 } from "lucide-react"; -import { Button } from "@/components/ui/button"; -import { Toast, ToastContainer } from "@/components/ui/toast"; -import { api, type ClaudeMdFile } from "@/lib/api"; -import { cn } from "@/lib/utils"; -import { useTranslation } from "@/hooks/useTranslation"; - -interface ClaudeFileEditorProps { - /** - * The CLAUDE.md file to edit - */ - file: ClaudeMdFile; - /** - * Callback to go back to the previous view - */ - onBack: () => void; - /** - * Optional className for styling - */ - className?: string; -} - -/** - * ClaudeFileEditor component for editing project-specific CLAUDE.md files - * - * @example - * setEditingFile(null)} - * /> - */ -export const ClaudeFileEditor: React.FC = ({ - file, - onBack, - className, -}) => { - const { t } = useTranslation(); - const [content, setContent] = useState(""); - const [originalContent, setOriginalContent] = useState(""); - const [loading, setLoading] = useState(true); - const [saving, setSaving] = useState(false); - const [error, setError] = useState(null); - const [toast, setToast] = useState<{ message: string; type: "success" | "error" } | null>(null); - - const hasChanges = content !== originalContent; - - // Load the file content on mount - useEffect(() => { - loadFileContent(); - }, [file.absolute_path]); - - const loadFileContent = async () => { - try { - setLoading(true); - setError(null); - const fileContent = await api.readClaudeMdFile(file.absolute_path); - setContent(fileContent); - setOriginalContent(fileContent); - } catch (err) { - console.error("Failed to load file:", err); - setError(t('loadFileFailed')); - } finally { - setLoading(false); - } - }; - - const handleSave = async () => { - try { - setSaving(true); - setError(null); - setToast(null); - await api.saveClaudeMdFile(file.absolute_path, content); - setOriginalContent(content); - setToast({ message: t('fileSavedSuccess'), type: "success" }); - } catch (err) { - console.error("Failed to save file:", err); - setError(t('saveFileFailed')); - setToast({ message: t('saveFileFailed'), type: "error" }); - } finally { - setSaving(false); - } - }; - - const handleBack = () => { - if (hasChanges) { - const confirmLeave = window.confirm( - t('unsavedChangesConfirm') - ); - if (!confirmLeave) return; - } - onBack(); - }; - - return ( -
-
- {/* Header */} - -
- -
-

{file.relative_path}

-

- {t('editProjectSpecificPrompt')} -

-
-
- - -
- - {/* Error display */} - {error && ( - - {error} - - )} - - {/* Editor */} -
- {loading ? ( -
- -
- ) : ( -
- setContent(val || "")} - preview="edit" - height="100%" - visibleDragbar={false} - /> -
- )} -
-
- - {/* Toast Notification */} - - {toast && ( - setToast(null)} - /> - )} - -
- ); -}; \ No newline at end of file diff --git a/src/components/TabContent.tsx b/src/components/TabContent.tsx index 02fbc26..5afa52c 100644 --- a/src/components/TabContent.tsx +++ b/src/components/TabContent.tsx @@ -146,12 +146,6 @@ const TabPanel: React.FC = ({ tab, isActive }) => { initialProjectPath: session.project_path, }); }} - onEditClaudeFile={(file: ClaudeMdFile) => { - // Open CLAUDE.md file in a new tab - window.dispatchEvent(new CustomEvent('open-claude-file', { - detail: { file } - })); - }} /> ) : ( @@ -236,13 +230,7 @@ const TabPanel: React.FC = ({ tab, isActive }) => { // Removed 'claude-md' tab type - case 'claude-file': - if (!tab.claudeFileId) { - return
{t('messages.noClaudeFileIdSpecified')}
; - } - // Note: We need to get the actual file object for ClaudeFileEditor - // For now, returning a placeholder - return
{t('messages.claudeFileEditorNotImplemented')}
; + // Removed 'claude-file' tab type case 'agent-execution': if (!tab.agentData) { @@ -301,7 +289,7 @@ const TabPanel: React.FC = ({ tab, isActive }) => { export const TabContent: React.FC = () => { const { t } = useTranslation(); - const { tabs, activeTabId, createChatTab, findTabBySessionId, createClaudeFileTab, createAgentExecutionTab, createCreateAgentTab, createImportAgentTab, closeTab, updateTab } = useTabState(); + const { tabs, activeTabId, createChatTab, findTabBySessionId, createAgentExecutionTab, createCreateAgentTab, createImportAgentTab, closeTab, updateTab } = useTabState(); const [hasInitialized, setHasInitialized] = React.useState(false); // Debug: Monitor activeTabId changes @@ -349,11 +337,6 @@ export const TabContent: React.FC = () => { } }; - const handleOpenClaudeFile = (event: CustomEvent) => { - const { file } = event.detail; - createClaudeFileTab(file.id, file.name || 'CLAUDE.md'); - }; - const handleOpenAgentExecution = (event: CustomEvent) => { const { agent, tabId } = event.detail; createAgentExecutionTab(agent, tabId); @@ -413,7 +396,6 @@ export const TabContent: React.FC = () => { }; window.addEventListener('open-session-in-tab', handleOpenSessionInTab as EventListener); - window.addEventListener('open-claude-file', handleOpenClaudeFile as EventListener); window.addEventListener('open-agent-execution', handleOpenAgentExecution as EventListener); window.addEventListener('open-create-agent-tab', handleOpenCreateAgentTab); window.addEventListener('open-import-agent-tab', handleOpenImportAgentTab); @@ -422,7 +404,6 @@ export const TabContent: React.FC = () => { window.addEventListener('create-smart-session-tab', handleCreateSmartSessionTab as EventListener); return () => { window.removeEventListener('open-session-in-tab', handleOpenSessionInTab as EventListener); - window.removeEventListener('open-claude-file', handleOpenClaudeFile as EventListener); window.removeEventListener('open-agent-execution', handleOpenAgentExecution as EventListener); window.removeEventListener('open-create-agent-tab', handleOpenCreateAgentTab); window.removeEventListener('open-import-agent-tab', handleOpenImportAgentTab); @@ -430,7 +411,7 @@ export const TabContent: React.FC = () => { window.removeEventListener('claude-session-selected', handleClaudeSessionSelected as EventListener); window.removeEventListener('create-smart-session-tab', handleCreateSmartSessionTab as EventListener); }; - }, [createChatTab, findTabBySessionId, createClaudeFileTab, createAgentExecutionTab, createCreateAgentTab, createImportAgentTab, closeTab, updateTab]); + }, [createChatTab, findTabBySessionId, createAgentExecutionTab, createCreateAgentTab, createImportAgentTab, closeTab, updateTab]); return (
diff --git a/src/components/TabManager.tsx b/src/components/TabManager.tsx index 2bb2336..ffc789e 100644 --- a/src/components/TabManager.tsx +++ b/src/components/TabManager.tsx @@ -34,8 +34,6 @@ const TabItem: React.FC = ({ tab, isActive, onClose, onClick, isDr return Server; case 'settings': return Settings; - case 'claude-file': - return FileText; case 'agent-execution': return Bot; case 'create-agent': diff --git a/src/contexts/TabContext.tsx b/src/contexts/TabContext.tsx index 6067cdb..44b5f22 100644 --- a/src/contexts/TabContext.tsx +++ b/src/contexts/TabContext.tsx @@ -3,7 +3,7 @@ import { useTranslation } from '@/hooks/useTranslation'; export interface Tab { id: string; - type: 'chat' | 'agent' | 'projects' | 'usage' | 'mcp' | 'settings' | 'claude-file' | 'agent-execution' | 'create-agent' | 'import-agent'; + type: 'chat' | 'agent' | 'projects' | 'usage' | 'mcp' | 'settings' | 'agent-execution' | 'create-agent' | 'import-agent'; title: string; sessionId?: string; // for chat tabs sessionData?: any; // for chat tabs - stores full session object diff --git a/src/hooks/useAnalytics.ts b/src/hooks/useAnalytics.ts index 1ee3c9c..a7277f9 100644 --- a/src/hooks/useAnalytics.ts +++ b/src/hooks/useAnalytics.ts @@ -10,7 +10,6 @@ const TAB_SCREEN_NAMES: Record = { 'usage': 'usage_dashboard', 'mcp': 'mcp_manager', 'settings': 'settings', - 'claude-file': 'file_editor', 'agent-execution': 'agent_execution', 'create-agent': 'create_agent', 'import-agent': 'import_agent', diff --git a/src/hooks/useTabState.ts b/src/hooks/useTabState.ts index 9e176b9..78617b8 100644 --- a/src/hooks/useTabState.ts +++ b/src/hooks/useTabState.ts @@ -20,7 +20,7 @@ interface UseTabStateReturn { createUsageTab: () => string | null; createMCPTab: () => string | null; createSettingsTab: () => string | null; - createClaudeFileTab: (fileId: string, fileName: string) => string; + // Removed: createClaudeFileTab createCreateAgentTab: () => string; createImportAgentTab: () => string; closeTab: (id: string, force?: boolean) => Promise; @@ -162,23 +162,7 @@ export const useTabState = (): UseTabStateReturn => { // Removed createClaudeMdTab: using Prompt Files manager instead - const createClaudeFileTab = useCallback((fileId: string, fileName: string): string => { - // Check if tab already exists for this file - const existingTab = tabs.find(tab => tab.type === 'claude-file' && tab.claudeFileId === fileId); - if (existingTab) { - setActiveTab(existingTab.id); - return existingTab.id; - } - - return addTab({ - type: 'claude-file', - title: fileName, - claudeFileId: fileId, - status: 'idle', - hasUnsavedChanges: false, - icon: 'file-text' - }); - }, [addTab, tabs, setActiveTab]); + // Removed: project-level CLAUDE.md file tab creation const createAgentExecutionTab = useCallback((agent: any, _tabId: string): string => { return addTab({ @@ -312,7 +296,6 @@ export const useTabState = (): UseTabStateReturn => { createUsageTab, createMCPTab, createSettingsTab, - createClaudeFileTab, createCreateAgentTab, createImportAgentTab, closeTab,