| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  | import React from 'react' | 
					
						
							|  |  |  | import cn from '@/utils/classnames' | 
					
						
							| 
									
										
										
										
											2025-05-27 14:17:55 +08:00
										 |  |  | import type { DataSourceNodeType } from '@/app/components/workflow/nodes/data-source/types' | 
					
						
							|  |  |  | import DatasourceIcon from './datasource-icon' | 
					
						
							|  |  |  | import { useDatasourceIcon } from './hooks' | 
					
						
							| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | type OptionCardProps = { | 
					
						
							|  |  |  |   label: string | 
					
						
							|  |  |  |   selected: boolean | 
					
						
							| 
									
										
										
										
											2025-05-27 14:17:55 +08:00
										 |  |  |   nodeData: DataSourceNodeType | 
					
						
							| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  |   onClick?: () => void | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const OptionCard = ({ | 
					
						
							|  |  |  |   label, | 
					
						
							|  |  |  |   selected, | 
					
						
							| 
									
										
										
										
											2025-05-27 14:17:55 +08:00
										 |  |  |   nodeData, | 
					
						
							| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  |   onClick, | 
					
						
							|  |  |  | }: OptionCardProps) => { | 
					
						
							| 
									
										
										
										
											2025-05-27 14:17:55 +08:00
										 |  |  |   const iconUrl = useDatasourceIcon(nodeData) as string | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  |   return ( | 
					
						
							|  |  |  |     <div | 
					
						
							|  |  |  |       className={cn( | 
					
						
							|  |  |  |         'flex items-center gap-2 rounded-xl border border-components-option-card-option-border bg-components-option-card-option-bg p-3 shadow-shadow-shadow-3', | 
					
						
							|  |  |  |         selected | 
					
						
							|  |  |  |           ? 'border-components-option-card-option-selected-border bg-components-option-card-option-selected-bg shadow-xs ring-[0.5px] ring-inset ring-components-option-card-option-selected-border' | 
					
						
							|  |  |  |           : 'hover:bg-components-option-card-bg-hover hover:border-components-option-card-option-border-hover hover:shadow-xs', | 
					
						
							|  |  |  |       )} | 
					
						
							|  |  |  |       onClick={onClick} | 
					
						
							|  |  |  |     > | 
					
						
							|  |  |  |       <div className='flex size-8 items-center justify-center rounded-lg border-[0.5px] border-components-panel-border bg-background-default-dodge p-1.5'> | 
					
						
							| 
									
										
										
										
											2025-05-27 14:17:55 +08:00
										 |  |  |         <DatasourceIcon iconUrl={iconUrl} /> | 
					
						
							| 
									
										
										
										
											2025-05-22 14:49:40 +08:00
										 |  |  |       </div> | 
					
						
							|  |  |  |       <div className={cn('system-sm-medium text-text-secondary', selected && 'text-primary')}> | 
					
						
							|  |  |  |         {label} | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export default React.memo(OptionCard) |