@@ -8,7 +8,7 @@ import { I18nContext } from '../../models/Translation';
88import { LarkImage } from '../LarkImage' ;
99import styles from './HeroCarousel.module.less' ;
1010
11- const MAX_ITEMS = 5 ;
11+ export const HERO_CAROUSEL_ITEMS = 3 ;
1212
1313const timestampOf = ( value : unknown ) => {
1414 if ( typeof value === 'number' ) return value ;
@@ -21,12 +21,12 @@ const timestampOf = (value: unknown) => {
2121 return 0 ;
2222} ;
2323
24- const formatDateLabel = ( value : unknown ) => {
24+ const formatDateLabel = ( value : unknown , locale : string ) => {
2525 const timestamp = timestampOf ( value ) ;
2626
2727 if ( ! timestamp ) return '' ;
2828
29- return new Intl . DateTimeFormat ( 'zh-CN' , {
29+ return new Intl . DateTimeFormat ( locale , {
3030 month : 'short' ,
3131 day : 'numeric' ,
3232 } ) . format ( timestamp ) ;
@@ -40,10 +40,9 @@ const locationTextOf = ({ city, location }: Activity) =>
4040const descriptionOf = ( activity : Activity ) =>
4141 ( activity . summary as string ) || locationTextOf ( activity ) || ( activity . type as string ) || '' ;
4242
43- export const HeroCarousel : FC = ( ) => {
44- const { t } = useContext ( I18nContext ) ;
43+ export const HeroCarousel : FC < { activities : Activity [ ] } > = ( { activities } ) => {
44+ const { currentLanguage , t } = useContext ( I18nContext ) ;
4545 const [ heroStyle , setHeroStyle ] = useState < CSSProperties > ( ) ;
46- const [ activities , setActivities ] = useState < Activity [ ] > ( [ ] ) ;
4746 const [ descriptionRows , setDescriptionRows ] = useState ( 3 ) ;
4847 const infoBodyStyle = { minHeight : 'clamp(0rem, 38vh, 24rem)' } as CSSProperties ;
4948
@@ -64,31 +63,6 @@ export const HeroCarousel: FC = () => {
6463 return ( ) => observer ?. disconnect ( ) ;
6564 } , [ ] ) ;
6665
67- useEffect ( ( ) => {
68- let mounted = true ;
69-
70- ( async ( ) => {
71- try {
72- const model = new ActivityModel ( ) ;
73- const data = await model . getAll ( ) ;
74- const latestActivities = data
75- . filter ( ( { name } ) => Boolean ( name ) )
76- . sort (
77- ( { startTime : left } , { startTime : right } ) => timestampOf ( right ) - timestampOf ( left ) ,
78- )
79- . slice ( 0 , MAX_ITEMS ) ;
80-
81- if ( mounted ) setActivities ( latestActivities ) ;
82- } catch ( err ) {
83- console . error ( 'Failed to load activities:' , err ) ;
84- }
85- } ) ( ) ;
86-
87- return ( ) => {
88- mounted = false ;
89- } ;
90- } , [ ] ) ;
91-
9266 useEffect ( ( ) => {
9367 const syncDescriptionRows = ( ) => {
9468 setDescriptionRows ( window . innerWidth <= 767.98 ? 4 : 3 ) ;
@@ -122,10 +96,10 @@ export const HeroCarousel: FC = () => {
12296 className = { `${ styles . carousel } h-100` }
12397 >
12498 { activities . map ( activity => {
125- const href = ( activity . link as string ) || ActivityModel . getLink ( activity ) ;
99+ const href = ActivityModel . getLink ( activity ) ;
126100 const hosts = ( ( activity . host as string [ ] ) || [ ] ) . slice ( 0 , 2 ) ;
127101 const locationText = locationTextOf ( activity ) ;
128- const dateText = formatDateLabel ( activity . startTime ) ;
102+ const dateText = formatDateLabel ( activity . startTime , currentLanguage ) ;
129103 const title = ( activity . name as string ) || t ( 'activity' ) ;
130104 const description = descriptionOf ( activity ) ;
131105 const image = activity . cardImage || activity . image ;
0 commit comments