Skip to content

Commit cb597db

Browse files
committed
refactor: update FreecodecampCard component to improve tag handling and optimize rendering
1 parent d2d3505 commit cb597db

1 file changed

Lines changed: 19 additions & 14 deletions

File tree

src/features/cards/components/freecodecampCard/FreecodecampCard.tsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,54 @@
1-
import { Card, FloatingFilter } from 'src/components/Elements'
1+
import { useCallback } from 'react'
2+
import { Card } from 'src/components/Elements'
23
import { ListPostComponent } from 'src/components/List/ListPostComponent'
34
import { Article, CardPropsType } from 'src/types'
45
import { useGetSourceArticles } from '../../api/getSourceArticles'
56
import { useSelectedTags } from '../../hooks/useSelectedTags'
6-
import { CardHeader } from '../CardHeader'
7-
import { CardSettings } from '../CardSettings'
7+
import { MemoizedCardHeader } from '../CardHeader'
8+
import { MemoizedCardSettings } from '../CardSettings'
89
import ArticleItem from './ArticleItem'
910

10-
const GLOBAL_TAG = { label: 'Global', value: 'programming' }
11+
const GLOBAL_TAG = { label: 'Global', value: 'global' }
1112

1213
export function FreecodecampCard(props: CardPropsType) {
1314
const { meta } = props
14-
const { queryTags, selectedTag, cardSettings } = useSelectedTags({
15+
const {
16+
queryTags,
17+
selectedTag,
18+
cardSettings: { sortBy, language } = {},
19+
} = useSelectedTags({
1520
source: meta.value,
1621
fallbackTag: GLOBAL_TAG,
1722
})
1823

1924
const { data, isLoading } = useGetSourceArticles({
2025
source: 'freecodecamp',
21-
tags: queryTags.map((tag) => tag.value),
26+
tags: queryTags,
2227
})
2328

24-
const renderItem = (item: Article, index: number) => (
25-
<ArticleItem item={item} key={`fcc-${index}`} index={index} analyticsTag={meta.analyticsTag} />
29+
const renderItem = useCallback(
30+
(item: Article) => <ArticleItem item={item} key={item.id} analyticsTag={meta.analyticsTag} />,
31+
[meta.analyticsTag]
2632
)
2733

2834
return (
2935
<Card
3036
titleComponent={
31-
<CardHeader label={meta.label} fallbackTag={GLOBAL_TAG} selectedTag={selectedTag} />
37+
<MemoizedCardHeader label={meta.label} fallbackTag={GLOBAL_TAG} selectedTag={selectedTag} />
3238
}
3339
settingsComponent={
34-
<CardSettings
40+
<MemoizedCardSettings
3541
url={meta.link}
3642
id={meta.value}
3743
globalTag={GLOBAL_TAG}
38-
sortBy={cardSettings?.sortBy}
39-
language={cardSettings?.language || GLOBAL_TAG.value}
44+
sortBy={sortBy}
45+
language={language || GLOBAL_TAG.value}
4046
showDateRangeFilter={false}
4147
/>
4248
}
4349
{...props}>
44-
<FloatingFilter card={meta} filters={['language']} />
4550
<ListPostComponent
46-
sortBy={cardSettings?.sortBy as keyof Article}
51+
sortBy={sortBy as keyof Article}
4752
items={data}
4853
isLoading={isLoading}
4954
renderItem={renderItem}

0 commit comments

Comments
 (0)