11import { Badge } from '@/components/ui/badge' ;
22import { Card , CardContent , CardTitle } from '@/components/ui/card' ;
33import Image from '@/components/ui/image' ;
4- import { Tooltip , TooltipContent , TooltipProvider , TooltipTrigger } from "@/components/ui/tooltip" ;
4+ import {
5+ Tooltip ,
6+ TooltipContent ,
7+ TooltipProvider ,
8+ TooltipTrigger ,
9+ } from '@/components/ui/tooltip' ;
510import { useNavigateWithParams } from '@/hooks/useNavigateWithParams' ;
611import type { Tool } from '@/services/apis/gen/queries' ;
712import { Verified } from 'lucide-react' ;
813import React from 'react' ;
914
1015interface ToolCardProps {
11- tool : Tool ;
12- button ?: React . ReactNode ;
16+ tool : Tool ;
17+ button ?: React . ReactNode ;
1318}
1419
1520const ToolCard = ( { tool, button } : ToolCardProps ) => {
16- const navigateWithParams = useNavigateWithParams ( )
17- const handleCardClick = ( e : React . MouseEvent ) => {
18- // Don't navigate if clicking on the button
19- if ( ( e . target as HTMLElement ) . closest ( 'button' ) ) {
20- return ;
21- }
22- navigateWithParams ( `/tools/${ tool . id } ` ) ;
23- } ;
21+ const navigateWithParams = useNavigateWithParams ( ) ;
22+ const handleCardClick = ( e : React . MouseEvent ) => {
23+ // Don't navigate if clicking on the button
24+ if ( ( e . target as HTMLElement ) . closest ( 'button' ) ) {
25+ return ;
26+ }
27+ navigateWithParams ( `/tools/${ tool . id } ` ) ;
28+ } ;
2429
25- return (
26- < Card
27- key = { tool . id }
28- className = "flex flex-col overflow-hidden cursor-pointer transition-all duration-200 hover:shadow-md"
29- onClick = { handleCardClick }
30- >
31- { /* <div className="w-full bg-white p-4 flex justify-center items-center transition-colors duration-200 hover:bg-gray-100 min-h-[80px]">
30+ return (
31+ < Card
32+ key = { tool . id }
33+ className = "flex flex-col overflow-hidden cursor-pointer transition-all duration-200 hover:shadow-md"
34+ onClick = { handleCardClick }
35+ >
36+ { /* <div className="w-full bg-white p-4 flex justify-center items-center transition-colors duration-200 hover:bg-gray-100 min-h-[80px]">
3237 {tool.logoUrl ? (
3338 <img
3439 src={tool.logoUrl}
@@ -42,62 +47,80 @@ const ToolCard = ({ tool, button }: ToolCardProps) => {
4247 )}
4348 </div> */ }
4449
45- < CardContent className = "flex flex-col space-y-3" >
46- < div className = "flex items-center justify-between" >
47- < div className = "flex flex-col" >
48- < div className = "flex items-center gap-3" >
49- < Image url = { tool ?. logoUrl } width = { 70 } height = { 70 } className = 'rounded-2xl' />
50- < div className = 'flex items-center gap-2' >
51- < CardTitle className = "text-left text-lg" > { tool . name } </ CardTitle >
52- { tool . isOfficialSupport && (
53- < TooltipProvider >
54- < Tooltip >
55- < TooltipTrigger asChild >
56- < Verified className = "w-4 h-4 text-blue-500" />
57- </ TooltipTrigger >
58- < TooltipContent >
59- < p > Official Support</ p >
60- </ TooltipContent >
61- </ Tooltip >
62- </ TooltipProvider >
63- ) }
64- </ div >
65- </ div >
66- </ div >
67- < div className = "flex-shrink-0" >
68- { button }
69- </ div >
70- </ div >
50+ < CardContent className = "flex flex-col space-y-3" >
51+ < div className = "flex items-center justify-between" >
52+ < div className = "flex flex-col" >
53+ < div className = "flex items-center gap-3" >
54+ < Image
55+ url = { tool ?. logoUrl }
56+ width = { 70 }
57+ height = { 70 }
58+ className = "rounded-2xl"
59+ />
60+ < div >
7161 < div className = "flex items-center gap-2" >
72- { /* <Badge variant="secondary" className="text-xs font-normal px-2 py-1">
73- {tool.version || 'N/A'}
74- </Badge> */ }
75- < Badge variant = "secondary" className = "text-xs font-normal px-2 py-1" >
76- { tool . category
77- ? tool . category
78- . split ( '_' )
79- . map ( word => word . charAt ( 0 ) . toUpperCase ( ) + word . slice ( 1 ) )
80- . join ( ' ' )
81- : 'N/A' }
82- </ Badge >
83- </ div >
84- < TooltipProvider >
85- < Tooltip >
62+ < CardTitle className = "text-left text-lg" >
63+ { tool . name }
64+ </ CardTitle >
65+ { tool . isOfficialSupport && (
66+ < TooltipProvider >
67+ < Tooltip >
8668 < TooltipTrigger asChild >
87- < p className = "text-sm text-muted-foreground line-clamp-3" >
88- { tool . description || 'No description available.' }
89- </ p >
69+ < Verified className = "w-4 h-4 text-blue-500" />
9070 </ TooltipTrigger >
91- < TooltipContent side = "bottom" className = "w-full max-w-[300px] p-2" >
92- < p className = "text-sm" >
93- { tool . description || 'No description available.' }
94- </ p >
71+ < TooltipContent >
72+ < p > Official Support</ p >
9573 </ TooltipContent >
96- </ Tooltip >
97- </ TooltipProvider >
98- </ CardContent >
99- </ Card >
100- ) ;
74+ </ Tooltip >
75+ </ TooltipProvider >
76+ ) }
77+ </ div >
78+ < div className = "font-semibold" >
79+ { tool . availableWorkersCount !== undefined &&
80+ tool . availableWorkersCount > 0 ? (
81+ < span className = "text-sm text-green-600" >
82+ { tool . availableWorkersCount } worker
83+ { tool . availableWorkersCount === 1 ? '' : 's' }
84+ </ span >
85+ ) : (
86+ < span className = "text-sm text-gray-500" > Offline</ span >
87+ ) }
88+ </ div >
89+ </ div >
90+ </ div >
91+ </ div >
92+ < div className = "shrink-0" > { button } </ div >
93+ </ div >
94+ < div className = "flex items-center gap-2" >
95+ { /* <Badge variant="secondary" className="text-xs font-normal px-2 py-1">
96+ {tool.version || 'N/A'}
97+ </Badge> */ }
98+ < Badge variant = "secondary" className = "text-xs font-normal px-2 py-1" >
99+ { tool . category
100+ ? tool . category
101+ . split ( '_' )
102+ . map ( ( word ) => word . charAt ( 0 ) . toUpperCase ( ) + word . slice ( 1 ) )
103+ . join ( ' ' )
104+ : 'N/A' }
105+ </ Badge >
106+ </ div >
107+ < TooltipProvider >
108+ < Tooltip >
109+ < TooltipTrigger asChild >
110+ < p className = "text-sm text-muted-foreground line-clamp-3" >
111+ { tool . description || 'No description available.' }
112+ </ p >
113+ </ TooltipTrigger >
114+ < TooltipContent side = "bottom" className = "w-full max-w-75 p-2" >
115+ < p className = "text-sm" >
116+ { tool . description || 'No description available.' }
117+ </ p >
118+ </ TooltipContent >
119+ </ Tooltip >
120+ </ TooltipProvider >
121+ </ CardContent >
122+ </ Card >
123+ ) ;
101124} ;
102125
103- export default ToolCard ;
126+ export default ToolCard ;
0 commit comments