1+ 'use client' ; 
2+ import  React ,  {  useEffect ,  useState ,  useCallback  }  from  'react' ; 
3+ import  {  Table  }  from  'antd' ; 
4+ import  {  useParams  }  from  'next/navigation' ; 
5+ 
6+ // 假设后端接口返回的类型 
7+ interface  VersionInfo  { 
8+     version : string ; 
9+     publishDay : string ; 
10+     dependentsNumber : number ; 
11+ } 
12+ 
13+ interface  VersionsTableProps  { 
14+     data : string [ ]  |  undefined ;  // 传入的版本号数组 
15+ } 
16+ 
17+ const  VersionsTable : React . FC < VersionsTableProps >  =  ( {  data } )  =>  { 
18+     const  [ versionsData ,  setVersionsData ]  =  useState < VersionInfo [ ] > ( [ ] ) ; 
19+     const  [ loading ,  setLoading ]  =  useState < boolean > ( false ) ; 
20+     const  params  =  useParams ( ) ; 
21+ 
22+     // 获取版本发布日的函数 
23+     const  fetchPublishDay  =  useCallback ( async  ( version : string )  =>  { 
24+         try  { 
25+             const  response  =  await  fetch ( `/api/publish-day/${ version }  ` ) ; 
26+             if  ( ! response . ok )  { 
27+                 throw  new  Error ( 'Failed to fetch publish day' ) ; 
28+             } 
29+             const  data  =  await  response . json ( ) ; 
30+             return  data . publishDay  ||  'N/A' ;  // 如果没有返回值,则默认返回 'N/A' 
31+         }  catch  ( error )  { 
32+             console . error ( 'Error fetching publish day:' ,  error ) ; 
33+             return  'N/A' ;  // 请求失败时返回默认值 
34+         } 
35+     } ,  [ ] ) ; 
36+ 
37+     // 获取版本依赖数的函数 
38+     const  fetchDependentsNumber  =  useCallback ( async  ( version : string )  =>  { 
39+         try  { 
40+             const  response  =  await  fetch ( `/api/crates/${ params . nsfront }  /${ params . nsbehind }  /${ params . name }  /${ version }  /dependents` ) ; 
41+             if  ( ! response . ok )  { 
42+                 throw  new  Error ( 'Failed to fetch dependents number' ) ; 
43+             } 
44+             const  data  =  await  response . json ( ) ; 
45+             return  data . direct_count  +  data . indirect_count  ||  0 ;  // 如果没有返回值,则默认返回 0 
46+         }  catch  ( error )  { 
47+             console . error ( 'Error fetching dependents number:' ,  error ) ; 
48+             return  0 ;  // 请求失败时返回默认值 
49+         } 
50+     } ,  [ params . nsfront ,  params . nsbehind ,  params . name ] ) ; 
51+ 
52+     // 请求版本的发布日和依赖数 
53+     const  fetchVersionDetails  =  useCallback ( async  ( version : string )  =>  { 
54+         const  publishDay  =  await  fetchPublishDay ( version ) ; 
55+         const  dependentsNumber  =  await  fetchDependentsNumber ( version ) ; 
56+         return  {  version,  publishDay,  dependentsNumber } ; 
57+     } ,  [ fetchPublishDay ,  fetchDependentsNumber ] ) ; 
58+ 
59+     useEffect ( ( )  =>  { 
60+         const  fetchData  =  async  ( )  =>  { 
61+             if  ( data  &&  data . length  >  0 )  { 
62+                 setLoading ( true ) ; 
63+                 const  versionDetails  =  await  Promise . all ( 
64+                     data . map ( async  ( version )  =>  { 
65+                         return  await  fetchVersionDetails ( version ) ; 
66+                     } ) 
67+                 ) ; 
68+                 setVersionsData ( versionDetails ) ; 
69+                 setLoading ( false ) ; 
70+             } 
71+         } ; 
72+ 
73+         fetchData ( ) ; 
74+     } ,  [ data ,  fetchVersionDetails ] ) ; 
75+ 
76+     const  columns  =  [ 
77+         { 
78+             title : 'Version' , 
79+             dataIndex : 'version' , 
80+             key : 'version' , 
81+             render : ( text : string )  =>  < span > { text } </ span > , 
82+         } , 
83+         { 
84+             title : 'Publish Day' , 
85+             dataIndex : 'publishDay' , 
86+             key : 'publishDay' , 
87+             render : ( text : string )  =>  < span > { text } </ span > , 
88+         } , 
89+         { 
90+             title : 'Dependents Number' , 
91+             dataIndex : 'dependentsNumber' , 
92+             key : 'dependentsNumber' , 
93+             render : ( text : number )  =>  < span > { text } </ span > , 
94+         } , 
95+     ] ; 
96+ 
97+     return  ( 
98+         < Table 
99+             columns = { columns } 
100+             dataSource = { versionsData } 
101+             pagination = { false } 
102+             rowKey = "version"  // 使用版本字符串作为唯一键 
103+             loading = { loading }  // 显示加载状态 
104+         /> 
105+     ) ; 
106+ } ; 
107+ 
108+ export  default  VersionsTable ; 
0 commit comments