From cd16e0cfce13eb6bbdb77b27072713814b835d74 Mon Sep 17 00:00:00 2001 From: Haileyesus Date: Sat, 11 Apr 2026 12:15:01 +0300 Subject: [PATCH] fix: remove project dependency from settings controller and onboarding --- src/components/onboarding/view/Onboarding.tsx | 2 -- src/components/onboarding/view/utils.ts | 8 ------ .../provider-auth/view/ProviderLoginModal.tsx | 27 ++----------------- .../settings/hooks/useSettingsController.ts | 23 ++-------------- src/components/settings/view/Settings.tsx | 3 --- src/constants/config.ts | 14 +++++++++- 6 files changed, 17 insertions(+), 60 deletions(-) diff --git a/src/components/onboarding/view/Onboarding.tsx b/src/components/onboarding/view/Onboarding.tsx index 58627c4c..c97cc9b7 100644 --- a/src/components/onboarding/view/Onboarding.tsx +++ b/src/components/onboarding/view/Onboarding.tsx @@ -11,7 +11,6 @@ import { createInitialProviderStatuses, gitEmailPattern, readErrorMessageFromResponse, - selectedProject, } from './utils'; type OnboardingProps = { @@ -279,7 +278,6 @@ export default function Onboarding({ onComplete }: OnboardingProps) { isOpen={Boolean(activeLoginProvider)} onClose={() => setActiveLoginProvider(null)} provider={activeLoginProvider} - project={selectedProject} onComplete={handleLoginComplete} /> )} diff --git a/src/components/onboarding/view/utils.ts b/src/components/onboarding/view/utils.ts index adb3c4bc..054b9a9d 100644 --- a/src/components/onboarding/view/utils.ts +++ b/src/components/onboarding/view/utils.ts @@ -1,17 +1,9 @@ -import { IS_PLATFORM } from '../../../constants/config'; import type { CliProvider, ProviderStatusMap } from './types'; export const cliProviders: CliProvider[] = ['claude', 'cursor', 'codex', 'gemini']; export const gitEmailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; -export const selectedProject = { - name: 'default', - displayName: 'default', - fullPath: IS_PLATFORM ? '/workspace' : '', - path: IS_PLATFORM ? '/workspace' : '', -}; - export const createInitialProviderStatuses = (): ProviderStatusMap => ({ claude: { authenticated: false, email: null, loading: true, error: null }, cursor: { authenticated: false, email: null, loading: true, error: null }, diff --git a/src/components/provider-auth/view/ProviderLoginModal.tsx b/src/components/provider-auth/view/ProviderLoginModal.tsx index 9e80302e..a1d66d95 100644 --- a/src/components/provider-auth/view/ProviderLoginModal.tsx +++ b/src/components/provider-auth/view/ProviderLoginModal.tsx @@ -1,21 +1,12 @@ import { ExternalLink, KeyRound, X } from 'lucide-react'; import StandaloneShell from '../../standalone-shell/view/StandaloneShell'; -import { IS_PLATFORM } from '../../../constants/config'; +import { DEFAULT_PROJECT_FOR_EMPTY_SHELL, IS_PLATFORM } from '../../../constants/config'; import type { CliProvider } from '../types'; -type LoginModalProject = { - name?: string; - displayName?: string; - fullPath?: string; - path?: string; - [key: string]: unknown; -}; - type ProviderLoginModalProps = { isOpen: boolean; onClose: () => void; provider?: CliProvider; - project?: LoginModalProject | null; onComplete?: (exitCode: number) => void; customCommand?: string; isAuthenticated?: boolean; @@ -56,23 +47,10 @@ const getProviderTitle = (provider: CliProvider) => { return 'Gemini CLI Configuration'; }; -const normalizeProject = (project?: LoginModalProject | null) => { - const normalizedName = project?.name || 'default'; - const normalizedFullPath = project?.fullPath ?? project?.path ?? (IS_PLATFORM ? '/workspace' : ''); - - return { - name: normalizedName, - displayName: project?.displayName || normalizedName, - fullPath: normalizedFullPath, - path: project?.path ?? normalizedFullPath, - }; -}; - export default function ProviderLoginModal({ isOpen, onClose, provider = 'claude', - project = null, onComplete, customCommand, isAuthenticated = false, @@ -83,7 +61,6 @@ export default function ProviderLoginModal({ const command = getProviderCommand({ provider, customCommand, isAuthenticated }); const title = getProviderTitle(provider); - const shellProject = normalizeProject(project); const handleComplete = (exitCode: number) => { onComplete?.(exitCode); @@ -158,7 +135,7 @@ export default function ProviderLoginModal({ ) : ( - + )} diff --git a/src/components/settings/hooks/useSettingsController.ts b/src/components/settings/hooks/useSettingsController.ts index 293cbceb..8f71dd0a 100644 --- a/src/components/settings/hooks/useSettingsController.ts +++ b/src/components/settings/hooks/useSettingsController.ts @@ -23,7 +23,6 @@ import type { NotificationPreferencesState, ProjectSortOrder, SettingsMainTab, - SettingsProject, } from '../types/types'; type ThemeContextValue = { @@ -34,7 +33,6 @@ type ThemeContextValue = { type UseSettingsControllerArgs = { isOpen: boolean; initialTab: string; - projects: SettingsProject[]; onClose: () => void; }; @@ -166,20 +164,6 @@ const mapCliServersToMcpServers = (servers: McpCliServer[] = []): McpServer[] => })) ); -const getDefaultProject = (projects: SettingsProject[]): SettingsProject => { - if (projects.length > 0) { - return projects[0]; - } - - const cwd = typeof process !== 'undefined' && process.cwd ? process.cwd() : ''; - return { - name: 'default', - displayName: 'default', - fullPath: cwd, - path: cwd, - }; -}; - const toResponseJson = async (response: Response): Promise => response.json() as Promise; const createEmptyClaudePermissions = (): ClaudePermissionsState => ({ @@ -204,7 +188,7 @@ const createDefaultNotificationPreferences = (): NotificationPreferencesState => }, }); -export function useSettingsController({ isOpen, initialTab, projects, onClose }: UseSettingsControllerArgs) { +export function useSettingsController({ isOpen, initialTab }: UseSettingsControllerArgs) { const { isDarkMode, toggleDarkMode } = useTheme() as ThemeContextValue; const closeTimerRef = useRef(null); @@ -242,7 +226,6 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: const [showLoginModal, setShowLoginModal] = useState(false); const [loginProvider, setLoginProvider] = useState(''); - const [selectedProject, setSelectedProject] = useState(null); const [claudeAuthStatus, setClaudeAuthStatus] = useState(DEFAULT_AUTH_STATUS); const [cursorAuthStatus, setCursorAuthStatus] = useState(DEFAULT_AUTH_STATUS); @@ -724,9 +707,8 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: const openLoginForProvider = useCallback((provider: AgentProvider) => { setLoginProvider(provider); - setSelectedProject(getDefaultProject(projects)); setShowLoginModal(true); - }, [projects]); + }, []); const handleLoginComplete = useCallback((exitCode: number) => { if (exitCode !== 0 || !loginProvider) { @@ -945,7 +927,6 @@ export function useSettingsController({ isOpen, initialTab, projects, onClose }: showLoginModal, setShowLoginModal, loginProvider, - selectedProject, handleLoginComplete, }; } diff --git a/src/components/settings/view/Settings.tsx b/src/components/settings/view/Settings.tsx index 70d3ea4d..e60be904 100644 --- a/src/components/settings/view/Settings.tsx +++ b/src/components/settings/view/Settings.tsx @@ -66,12 +66,10 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set showLoginModal, setShowLoginModal, loginProvider, - selectedProject, handleLoginComplete, } = useSettingsController({ isOpen, initialTab, - projects, onClose, }); @@ -219,7 +217,6 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set isOpen={showLoginModal} onClose={() => setShowLoginModal(false)} provider={loginProvider || 'claude'} - project={selectedProject} onComplete={handleLoginComplete} isAuthenticated={isAuthenticated} /> diff --git a/src/constants/config.ts b/src/constants/config.ts index 6741c35d..853cfb43 100644 --- a/src/constants/config.ts +++ b/src/constants/config.ts @@ -2,4 +2,16 @@ * Environment Flag: Is Platform * Indicates if the app is running in Platform mode (hosted) or OSS mode (self-hosted) */ -export const IS_PLATFORM = import.meta.env.VITE_IS_PLATFORM === 'true'; \ No newline at end of file +export const IS_PLATFORM = import.meta.env.VITE_IS_PLATFORM === 'true'; + +/** + * For empty shell instances where no project is provided, + * we use a default project object to ensure the shell can still function. + * This prevents errors related to missing project data. + */ +export const DEFAULT_PROJECT_FOR_EMPTY_SHELL = { + name: 'default', + displayName: 'default', + fullPath: IS_PLATFORM ? '/workspace' : '', + path: IS_PLATFORM ? '/workspace' : '', +}; \ No newline at end of file