@@ -7,23 +7,43 @@ import {headersWithAuth} from "../utils/auth"
77import { siteName } from "../utils/constants"
88import { useTranslation } from "react-i18next" ;
99
10+ interface FeedItem {
11+ id : number ;
12+ createdAt : Date ;
13+ title : string | null ;
14+ }
1015
1116export function TimelinePage ( ) {
12- const [ feeds , setFeeds ] = useState < Partial < Record < number , { id : number ; title : string | null ; createdAt : Date ; } [ ] > > > ( )
17+ const [ feeds , setFeeds ] = useState < Partial < Record < number , FeedItem [ ] > > > ( )
1318 const [ length , setLength ] = useState ( 0 )
1419 const ref = useRef ( false )
1520 const { t } = useTranslation ( )
1621 function fetchFeeds ( ) {
1722 client . feed . timeline . get ( {
1823 headers : headersWithAuth ( )
19- } ) . then ( ( { data } ) => {
24+ } )
25+ . then ( ( { data } ) => {
2026 if ( data && typeof data !== 'string' ) {
21- setLength ( data . length )
22- const groups = Object . groupBy ( data , ( { createdAt } ) => new Date ( createdAt ) . getFullYear ( ) )
27+ const arr = Array . isArray ( data ) ? data : [ ]
28+ setLength ( arr . length )
29+ // 兼容的分组逻辑
30+ const groups = ( Object . groupBy
31+ ? Object . groupBy ( arr , ( { createdAt } ) => new Date ( createdAt ) . getFullYear ( ) )
32+ : arr . reduce < Record < number , FeedItem [ ] > > ( ( acc , item ) => {
33+ const key = new Date ( item . createdAt ) . getFullYear ( )
34+ ; ( acc [ key ] ||= [ ] ) . push ( item )
35+ return acc
36+ } , { } )
37+ )
38+
2339 setFeeds ( groups )
2440 }
2541 } )
42+ . catch ( err => {
43+ console . error ( "fetchFeeds error:" , err )
44+ } )
2645 }
46+
2747 useEffect ( ( ) => {
2848 if ( ref . current ) return
2949 fetchFeeds ( )
0 commit comments