@@ -21,31 +21,24 @@ import {
2121 type OAuthProvider ,
2222 parseProvider ,
2323} from '@/lib/oauth'
24- import { saveToStorage } from '@/stores/workflows/persistence'
24+ import type { SubBlockConfig } from '@/blocks/types'
25+ import { useSubBlockValue } from '../../hooks/use-sub-block-value'
2526import { OAuthRequiredModal } from './components/oauth-required-modal'
2627
2728const logger = createLogger ( 'CredentialSelector' )
2829
2930interface CredentialSelectorProps {
30- value : string
31- onChange : ( value : string ) => void
32- provider : OAuthProvider
33- requiredScopes ?: string [ ]
34- label ?: string
31+ blockId : string
32+ subBlock : SubBlockConfig
3533 disabled ?: boolean
36- serviceId ?: string
3734 isPreview ?: boolean
3835 previewValue ?: any | null
3936}
4037
4138export function CredentialSelector ( {
42- value,
43- onChange,
44- provider,
45- requiredScopes = [ ] ,
46- label = 'Select credential' ,
39+ blockId,
40+ subBlock,
4741 disabled = false ,
48- serviceId,
4942 isPreview = false ,
5043 previewValue,
5144} : CredentialSelectorProps ) {
@@ -55,14 +48,22 @@ export function CredentialSelector({
5548 const [ showOAuthModal , setShowOAuthModal ] = useState ( false )
5649 const [ selectedId , setSelectedId ] = useState ( '' )
5750
51+ // Use collaborative state management via useSubBlockValue hook
52+ const [ storeValue , setStoreValue ] = useSubBlockValue ( blockId , subBlock . id )
53+
54+ // Extract values from subBlock config
55+ const provider = subBlock . provider as OAuthProvider
56+ const requiredScopes = subBlock . requiredScopes || [ ]
57+ const label = subBlock . placeholder || 'Select credential'
58+ const serviceId = subBlock . serviceId
59+
60+ // Get the effective value (preview or store value)
61+ const effectiveValue = isPreview && previewValue !== undefined ? previewValue : storeValue
62+
5863 // Initialize selectedId with the effective value
5964 useEffect ( ( ) => {
60- if ( isPreview && previewValue !== undefined ) {
61- setSelectedId ( previewValue || '' )
62- } else {
63- setSelectedId ( value )
64- }
65- } , [ value , isPreview , previewValue ] )
65+ setSelectedId ( effectiveValue || '' )
66+ } , [ effectiveValue ] )
6667
6768 // Derive service and provider IDs using useMemo
6869 const effectiveServiceId = useMemo ( ( ) => {
@@ -85,7 +86,9 @@ export function CredentialSelector({
8586 // If we have a value but it's not in the credentials, reset it
8687 if ( selectedId && ! data . credentials . some ( ( cred : Credential ) => cred . id === selectedId ) ) {
8788 setSelectedId ( '' )
88- onChange ( '' )
89+ if ( ! isPreview ) {
90+ setStoreValue ( '' )
91+ }
8992 }
9093
9194 // Auto-select logic:
@@ -99,11 +102,15 @@ export function CredentialSelector({
99102 const defaultCred = data . credentials . find ( ( cred : Credential ) => cred . isDefault )
100103 if ( defaultCred ) {
101104 setSelectedId ( defaultCred . id )
102- onChange ( defaultCred . id )
105+ if ( ! isPreview ) {
106+ setStoreValue ( defaultCred . id )
107+ }
103108 } else if ( data . credentials . length === 1 ) {
104109 // If only one credential, select it
105110 setSelectedId ( data . credentials [ 0 ] . id )
106- onChange ( data . credentials [ 0 ] . id )
111+ if ( ! isPreview ) {
112+ setStoreValue ( data . credentials [ 0 ] . id )
113+ }
107114 }
108115 }
109116 }
@@ -112,7 +119,7 @@ export function CredentialSelector({
112119 } finally {
113120 setIsLoading ( false )
114121 }
115- } , [ effectiveProviderId , onChange , selectedId ] )
122+ } , [ effectiveProviderId , selectedId , isPreview , setStoreValue ] )
116123
117124 // Fetch credentials on initial mount
118125 useEffect ( ( ) => {
@@ -121,11 +128,7 @@ export function CredentialSelector({
121128 // eslint-disable-next-line react-hooks/exhaustive-deps
122129 } , [ ] )
123130
124- // Update local state when external value changes
125- useEffect ( ( ) => {
126- const currentValue = isPreview ? previewValue : value
127- setSelectedId ( currentValue || '' )
128- } , [ value , isPreview , previewValue ] )
131+ // This effect is no longer needed since we're using effectiveValue directly
129132
130133 // Listen for visibility changes to update credentials when user returns from settings
131134 useEffect ( ( ) => {
@@ -158,19 +161,13 @@ export function CredentialSelector({
158161 const handleSelect = ( credentialId : string ) => {
159162 setSelectedId ( credentialId )
160163 if ( ! isPreview ) {
161- onChange ( credentialId )
164+ setStoreValue ( credentialId )
162165 }
163166 setOpen ( false )
164167 }
165168
166169 // Handle adding a new credential
167170 const handleAddCredential = ( ) => {
168- // Store information about the required connection
169- saveToStorage < string > ( 'pending_service_id' , effectiveServiceId )
170- saveToStorage < string [ ] > ( 'pending_oauth_scopes' , requiredScopes )
171- saveToStorage < string > ( 'pending_oauth_return_url' , window . location . href )
172- saveToStorage < string > ( 'pending_oauth_provider_id' , effectiveProviderId )
173-
174171 // Show the OAuth modal
175172 setShowOAuthModal ( true )
176173 setOpen ( false )
0 commit comments