From d73506704226401fc6fc34c8106bbd7c9d0ef304 Mon Sep 17 00:00:00 2001 From: Shantur Rathore Date: Fri, 24 Oct 2025 00:17:33 +0100 Subject: [PATCH] Fix infinite loop in file picker with proper initialization flag - Use isInitialized flag to prevent effect re-triggering - Use gitFilesFetched flag to prevent duplicate git API calls - Fetch git files and initial files only once on first open - Only refetch when search query actually changes - Git files are optional - don't block on empty results - Logs show initialization state for debugging --- src/components/file-picker.tsx | 42 +++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/src/components/file-picker.tsx b/src/components/file-picker.tsx index 68e2f7cb..b450b980 100644 --- a/src/components/file-picker.tsx +++ b/src/components/file-picker.tsx @@ -24,6 +24,7 @@ const FilePicker: Component = (props) => { const [cachedGitFiles, setCachedGitFiles] = createSignal([]) let containerRef: HTMLDivElement | undefined + let gitFilesFetched = false async function fetchGitFiles() { if (!props.instanceClient) { @@ -31,11 +32,12 @@ const FilePicker: Component = (props) => { return } - if (cachedGitFiles().length > 0) { - console.log("[FilePicker] Git files already cached:", cachedGitFiles().length) + if (gitFilesFetched) { + console.log("[FilePicker] Git files already fetched") return } + gitFilesFetched = true console.log("[FilePicker] Fetching git files...") const startTime = Date.now() @@ -44,7 +46,7 @@ const FilePicker: Component = (props) => { const elapsed = Date.now() - startTime console.log(`[FilePicker] Git files response received in ${elapsed}ms:`, gitResponse) - if (gitResponse?.data) { + if (gitResponse?.data && gitResponse.data.length > 0) { const gitFiles: FileItem[] = gitResponse.data.map((file: any) => ({ path: file.path, added: file.added, @@ -54,13 +56,11 @@ const FilePicker: Component = (props) => { console.log(`[FilePicker] Cached ${gitFiles.length} git files`) setCachedGitFiles(gitFiles) } else { - console.log("[FilePicker] Git response has no data:", gitResponse) - setCachedGitFiles([]) + console.log("[FilePicker] Git response has no data or empty array") } } catch (error) { const elapsed = Date.now() - startTime console.warn(`[FilePicker] Git files not available after ${elapsed}ms:`, error) - setCachedGitFiles([]) } } @@ -117,22 +117,26 @@ const FilePicker: Component = (props) => { } let lastQuery = "" + let isInitialized = false createEffect(() => { - console.log(`[FilePicker] Effect triggered - open: ${props.open}, query: "${props.searchQuery}"`) + console.log( + `[FilePicker] Effect triggered - open: ${props.open}, query: "${props.searchQuery}", gitFilesFetched: ${gitFilesFetched}, isInitialized: ${isInitialized}`, + ) - if (props.open) { - if (cachedGitFiles().length === 0) { - console.log("[FilePicker] Triggering git files fetch") - fetchGitFiles() - } - if (props.searchQuery !== lastQuery) { - console.log(`[FilePicker] Query changed from "${lastQuery}" to "${props.searchQuery}"`) - lastQuery = props.searchQuery - fetchFiles(props.searchQuery) - } else { - console.log(`[FilePicker] Query unchanged: "${props.searchQuery}"`) - } + if (props.open && !isInitialized) { + isInitialized = true + console.log("[FilePicker] First open - fetching git files and initial files") + fetchGitFiles() + fetchFiles(props.searchQuery) + lastQuery = props.searchQuery + return + } + + if (props.open && props.searchQuery !== lastQuery) { + console.log(`[FilePicker] Query changed from "${lastQuery}" to "${props.searchQuery}"`) + lastQuery = props.searchQuery + fetchFiles(props.searchQuery) } })