Xianbao QIAN
commited on
Commit
·
071dac0
1
Parent(s):
d384ea9
/trend: add filter for models/datasets.
Browse files- src/pages/trend/index.tsx +58 -9
src/pages/trend/index.tsx
CHANGED
@@ -65,6 +65,7 @@ const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], det
|
|
65 |
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
|
66 |
const [minLikes, setMinLikes] = useState(100);
|
67 |
const [isLoading, setIsLoading] = useState(false);
|
|
|
68 |
|
69 |
const toggleProvider = (provider: string) => {
|
70 |
setSelectedProviders(prev =>
|
@@ -76,18 +77,33 @@ const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], det
|
|
76 |
|
77 |
// Group data by provider
|
78 |
const providerData = Object.fromEntries(
|
79 |
-
Object.keys(PROVIDERS_MAP).map(provider =>
|
80 |
-
|
81 |
-
|
82 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
);
|
84 |
|
85 |
// Filter and group detailed model data
|
86 |
const filteredModels = (detailedData || [])
|
87 |
.filter(model => {
|
88 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
89 |
return model.likes >= minLikes &&
|
90 |
-
(selectedProviders.length === 0 || selectedProviders.includes(model.provider))
|
|
|
91 |
})
|
92 |
.reduce<Record<string, DetailedModelData[]>>((acc, model) => {
|
93 |
if (!acc[model.monthKey]) {
|
@@ -98,10 +114,10 @@ const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], det
|
|
98 |
}, {});
|
99 |
|
100 |
useEffect(() => {
|
101 |
-
console.log('
|
102 |
console.log('Selected providers:', selectedProviders);
|
103 |
console.log('Min likes:', minLikes);
|
104 |
-
}, [
|
105 |
|
106 |
if (error) {
|
107 |
return (
|
@@ -119,8 +135,41 @@ const TrendPage: React.FC<TrendProps> = ({ monthlyData = [], totalData = [], det
|
|
119 |
<div className="w-full max-w-screen-xl mx-auto p-4">
|
120 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
|
121 |
<p className="text-center text-sm mb-8 dark:text-gray-300">
|
122 |
-
|
123 |
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
|
125 |
{/* Controls */}
|
126 |
<div className="flex flex-wrap gap-4 mb-6 justify-center items-center">
|
|
|
65 |
const [selectedProviders, setSelectedProviders] = useState<string[]>([]);
|
66 |
const [minLikes, setMinLikes] = useState(100);
|
67 |
const [isLoading, setIsLoading] = useState(false);
|
68 |
+
const [contentType, setContentType] = useState<'all' | 'models' | 'datasets'>('all');
|
69 |
|
70 |
const toggleProvider = (provider: string) => {
|
71 |
setSelectedProviders(prev =>
|
|
|
77 |
|
78 |
// Group data by provider
|
79 |
const providerData = Object.fromEntries(
|
80 |
+
Object.keys(PROVIDERS_MAP).map(provider => {
|
81 |
+
const providerMonthlyData = monthlyData.filter(d => {
|
82 |
+
const isDataset = d.name?.toLowerCase().includes('dataset') ||
|
83 |
+
d.name?.toLowerCase().includes('corpus') ||
|
84 |
+
d.name?.toLowerCase().includes('data');
|
85 |
+
const matchesContentType = contentType === 'all' ||
|
86 |
+
(contentType === 'datasets' && isDataset) ||
|
87 |
+
(contentType === 'models' && !isDataset);
|
88 |
+
return d.provider === provider && matchesContentType;
|
89 |
+
});
|
90 |
+
return [provider, providerMonthlyData || []];
|
91 |
+
})
|
92 |
);
|
93 |
|
94 |
// Filter and group detailed model data
|
95 |
const filteredModels = (detailedData || [])
|
96 |
.filter(model => {
|
97 |
+
const isDataset = model.name.toLowerCase().includes('dataset') ||
|
98 |
+
model.name.toLowerCase().includes('corpus') ||
|
99 |
+
model.name.toLowerCase().includes('data');
|
100 |
+
const matchesContentType = contentType === 'all' ||
|
101 |
+
(contentType === 'datasets' && isDataset) ||
|
102 |
+
(contentType === 'models' && !isDataset);
|
103 |
+
|
104 |
return model.likes >= minLikes &&
|
105 |
+
(selectedProviders.length === 0 || selectedProviders.includes(model.provider)) &&
|
106 |
+
matchesContentType;
|
107 |
})
|
108 |
.reduce<Record<string, DetailedModelData[]>>((acc, model) => {
|
109 |
if (!acc[model.monthKey]) {
|
|
|
114 |
}, {});
|
115 |
|
116 |
useEffect(() => {
|
117 |
+
console.log('Content type changed:', contentType);
|
118 |
console.log('Selected providers:', selectedProviders);
|
119 |
console.log('Min likes:', minLikes);
|
120 |
+
}, [contentType, selectedProviders, minLikes]);
|
121 |
|
122 |
if (error) {
|
123 |
return (
|
|
|
135 |
<div className="w-full max-w-screen-xl mx-auto p-4">
|
136 |
<h1 className="text-3xl lg:text-5xl mt-16 font-bold text-center mb-2 dark:text-white">Chinese AI Model Release Trends 📈</h1>
|
137 |
<p className="text-center text-sm mb-8 dark:text-gray-300">
|
138 |
+
Track the growth of Chinese AI models and datasets over time
|
139 |
</p>
|
140 |
+
|
141 |
+
<div className="flex justify-center mb-6 space-x-4">
|
142 |
+
<button
|
143 |
+
onClick={() => setContentType('all')}
|
144 |
+
className={`px-4 py-2 rounded-lg ${
|
145 |
+
contentType === 'all'
|
146 |
+
? 'bg-blue-500 text-white'
|
147 |
+
: 'bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300'
|
148 |
+
}`}
|
149 |
+
>
|
150 |
+
All
|
151 |
+
</button>
|
152 |
+
<button
|
153 |
+
onClick={() => setContentType('models')}
|
154 |
+
className={`px-4 py-2 rounded-lg ${
|
155 |
+
contentType === 'models'
|
156 |
+
? 'bg-blue-500 text-white'
|
157 |
+
: 'bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300'
|
158 |
+
}`}
|
159 |
+
>
|
160 |
+
Models
|
161 |
+
</button>
|
162 |
+
<button
|
163 |
+
onClick={() => setContentType('datasets')}
|
164 |
+
className={`px-4 py-2 rounded-lg ${
|
165 |
+
contentType === 'datasets'
|
166 |
+
? 'bg-blue-500 text-white'
|
167 |
+
: 'bg-gray-200 text-gray-700 dark:bg-gray-700 dark:text-gray-300'
|
168 |
+
}`}
|
169 |
+
>
|
170 |
+
Datasets
|
171 |
+
</button>
|
172 |
+
</div>
|
173 |
|
174 |
{/* Controls */}
|
175 |
<div className="flex flex-wrap gap-4 mb-6 justify-center items-center">
|