11'use client'
22
3- import { useCallback , useEffect , useState } from 'react'
3+ import { useCallback , useEffect , useMemo , useState } from 'react'
44import { Check , ChevronDown , FileText } from 'lucide-react'
55import { Button } from '@/components/ui/button'
66import {
@@ -13,8 +13,8 @@ import {
1313} from '@/components/ui/command'
1414import { Popover , PopoverContent , PopoverTrigger } from '@/components/ui/popover'
1515import type { SubBlockConfig } from '@/blocks/types'
16- import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
1716import { useSubBlockStore } from '@/stores/workflows/subblock/store'
17+ import { useSubBlockValue } from '../../hooks/use-sub-block-value'
1818
1919interface DocumentData {
2020 id : string
@@ -52,38 +52,23 @@ export function DocumentSelector({
5252 previewValue,
5353} : DocumentSelectorProps ) {
5454 const { getValue } = useSubBlockStore ( )
55- const { collaborativeSetSubblockValue } = useCollaborativeWorkflow ( )
5655
5756 const [ documents , setDocuments ] = useState < DocumentData [ ] > ( [ ] )
5857 const [ error , setError ] = useState < string | null > ( null )
5958 const [ open , setOpen ] = useState ( false )
6059 const [ selectedDocument , setSelectedDocument ] = useState < DocumentData | null > ( null )
6160 const [ initialFetchDone , setInitialFetchDone ] = useState ( false )
62- const [ selectedId , setSelectedId ] = useState ( '' )
6361
64- // Get the current value from the store
65- const storeValue = getValue ( blockId , subBlock . id )
62+ // Use the proper hook to get the current value and setter
63+ const [ storeValue , setStoreValue ] = useSubBlockValue ( blockId , subBlock . id )
6664
67- // Get the knowledge base ID from the same block's knowledgeBaseId subblock
68- const knowledgeBaseId = getValue ( blockId , 'knowledgeBaseId' )
65+ // Get the knowledge base ID from the same block's knowledgeBaseId subblock - memoize to prevent re-renders
66+ const knowledgeBaseId = useMemo ( ( ) => getValue ( blockId , 'knowledgeBaseId' ) , [ getValue , blockId ] )
6967
7068 // Use preview value when in preview mode, otherwise use store value
7169 const value = isPreview ? previewValue : storeValue
7270
73- // Initialize selectedId with the effective value
74- useEffect ( ( ) => {
75- if ( isPreview && previewValue !== undefined ) {
76- setSelectedId ( previewValue || '' )
77- } else {
78- setSelectedId ( value || '' )
79- }
80- } , [ value , isPreview , previewValue ] )
8171
82- // Update local state when external value changes
83- useEffect ( ( ) => {
84- const currentValue = isPreview ? previewValue : value
85- setSelectedId ( currentValue || '' )
86- } , [ value , isPreview , previewValue ] )
8772
8873 // Fetch documents for the selected knowledge base
8974 const fetchDocuments = useCallback ( async ( ) => {
@@ -112,46 +97,12 @@ export function DocumentSelector({
11297 const fetchedDocuments = result . data || [ ]
11398 setDocuments ( fetchedDocuments )
11499 setInitialFetchDone ( true )
115-
116- // Auto-selection logic: if we have a valid selection, keep it
117- // If there's only one document, select it
118- // If we have a value but it's not in the documents, reset it
119- if ( selectedId && ! fetchedDocuments . some ( ( doc : DocumentData ) => doc . id === selectedId ) ) {
120- setSelectedId ( '' )
121- if ( ! isPreview ) {
122- collaborativeSetSubblockValue ( blockId , subBlock . id , '' )
123- }
124- }
125-
126- if (
127- ( ! selectedId || ! fetchedDocuments . some ( ( doc : DocumentData ) => doc . id === selectedId ) ) &&
128- fetchedDocuments . length > 0
129- ) {
130- if ( fetchedDocuments . length === 1 ) {
131- // If only one document, auto-select it
132- const singleDoc = fetchedDocuments [ 0 ]
133- setSelectedId ( singleDoc . id )
134- setSelectedDocument ( singleDoc )
135- if ( ! isPreview ) {
136- collaborativeSetSubblockValue ( blockId , subBlock . id , singleDoc . id )
137- }
138- onDocumentSelect ?.( singleDoc . id )
139- }
140- }
141100 } catch ( err ) {
142101 if ( ( err as Error ) . name === 'AbortError' ) return
143102 setError ( ( err as Error ) . message )
144103 setDocuments ( [ ] )
145104 }
146- } , [
147- knowledgeBaseId ,
148- selectedId ,
149- collaborativeSetSubblockValue ,
150- blockId ,
151- subBlock . id ,
152- isPreview ,
153- onDocumentSelect ,
154- ] )
105+ } , [ knowledgeBaseId ] )
155106
156107 // Handle dropdown open/close - fetch documents when opening
157108 const handleOpenChange = ( isOpen : boolean ) => {
@@ -170,50 +121,35 @@ export function DocumentSelector({
170121 if ( isPreview ) return
171122
172123 setSelectedDocument ( document )
173- setSelectedId ( document . id )
174-
175- if ( ! isPreview ) {
176- collaborativeSetSubblockValue ( blockId , subBlock . id , document . id )
177- }
178-
124+ setStoreValue ( document . id )
179125 onDocumentSelect ?.( document . id )
180126 setOpen ( false )
181127 }
182128
183129 // Sync selected document with value prop
184130 useEffect ( ( ) => {
185- if ( selectedId && documents . length > 0 ) {
186- const docInfo = documents . find ( ( doc ) => doc . id === selectedId )
187- if ( docInfo ) {
188- setSelectedDocument ( docInfo )
189- } else {
190- setSelectedDocument ( null )
191- }
192- } else if ( ! selectedId ) {
131+ if ( value && documents . length > 0 ) {
132+ const docInfo = documents . find ( ( doc ) => doc . id === value )
133+ setSelectedDocument ( docInfo || null )
134+ } else {
193135 setSelectedDocument ( null )
194136 }
195- } , [ selectedId , documents ] )
137+ } , [ value , documents ] )
196138
197139 // Reset documents when knowledge base changes
198140 useEffect ( ( ) => {
199- if ( knowledgeBaseId ) {
200- setDocuments ( [ ] )
201- setSelectedDocument ( null )
202- setSelectedId ( '' )
203- setInitialFetchDone ( false )
204- setError ( null )
205- if ( ! isPreview ) {
206- collaborativeSetSubblockValue ( blockId , subBlock . id , '' )
207- }
208- }
209- } , [ knowledgeBaseId , blockId , subBlock . id , collaborativeSetSubblockValue , isPreview ] )
141+ setDocuments ( [ ] )
142+ setSelectedDocument ( null )
143+ setInitialFetchDone ( false )
144+ setError ( null )
145+ } , [ knowledgeBaseId ] )
210146
211147 // Fetch documents when knowledge base is available and we haven't fetched yet
212148 useEffect ( ( ) => {
213149 if ( knowledgeBaseId && ! initialFetchDone && ! isPreview ) {
214150 fetchDocuments ( )
215151 }
216- } , [ knowledgeBaseId , initialFetchDone , fetchDocuments , isPreview ] )
152+ } , [ knowledgeBaseId , initialFetchDone , isPreview ] )
217153
218154 const formatDocumentName = ( document : DocumentData ) => {
219155 return document . filename
@@ -307,7 +243,7 @@ export function DocumentSelector({
307243 </ div >
308244 </ div >
309245 </ div >
310- { document . id === selectedId && < Check className = 'ml-auto h-4 w-4' /> }
246+ { document . id === value && < Check className = 'ml-auto h-4 w-4' /> }
311247 </ CommandItem >
312248 ) ) }
313249 </ CommandGroup >
0 commit comments