PopularModelsHome.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import React, { useEffect, useState } from 'react';
  2. import { Model } from '../types/models';
  3. import { modelApi } from '../services/modelApi';
  4. import ModelCard from './ModelCard';
  5. interface PopularModelsHomeProps {}
  6. const PopularModelsHome: React.FC<PopularModelsHomeProps> = () => {
  7. const [models, setModels] = useState<Model[]>([]);
  8. const [loading, setLoading] = useState<boolean>(true);
  9. const [error, setError] = useState<string | null>(null);
  10. // 从后端 API 加载精选模型数据
  11. useEffect(() => {
  12. const loadData = async () => {
  13. try {
  14. setLoading(true);
  15. setError(null);
  16. // 使用精选模型接口获取数据
  17. const response = await modelApi.getFeaturedModels(3);
  18. const data = response.data.items || [];
  19. if (data.length === 0) {
  20. setError('未找到精选模型数据');
  21. setLoading(false);
  22. return;
  23. }
  24. setModels(data);
  25. setLoading(false);
  26. } catch (err) {
  27. console.error('Failed to load featured models from API:', err);
  28. setError('加载精选模型数据失败: ' + (err instanceof Error ? err.message : '未知错误'));
  29. setLoading(false);
  30. }
  31. };
  32. loadData();
  33. }, []);
  34. return (
  35. <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
  36. {loading && (
  37. <>
  38. {[1, 2, 3].map((i) => (
  39. <div
  40. key={i}
  41. className="bg-white px-6 pt-6 pb-0 rounded-2xl border border-gray-100 shadow-sm animate-pulse h-[300px]"
  42. >
  43. <div className="flex items-center space-x-3">
  44. <div className="w-14 h-14 bg-gray-100 rounded-xl" />
  45. <div className="flex-1 space-y-2">
  46. <div className="h-4 bg-gray-100 rounded w-2/3" />
  47. <div className="h-3 bg-gray-100 rounded w-full" />
  48. </div>
  49. </div>
  50. </div>
  51. ))}
  52. </>
  53. )}
  54. {error && (
  55. <div className="col-span-full bg-red-50 border border-red-200 rounded-xl p-4 text-center">
  56. <p className="text-red-600 text-sm">{error}</p>
  57. </div>
  58. )}
  59. {!loading && !error && models.length === 0 && (
  60. <div className="col-span-full py-10 text-center text-gray-500 text-sm">
  61. 暂无精选模型
  62. </div>
  63. )}
  64. {!loading && !error && models.map((m) => (
  65. <ModelCard
  66. key={m.id}
  67. model={m}
  68. versionDisplayMode="standard"
  69. />
  70. ))}
  71. </div>
  72. );
  73. };
  74. export default PopularModelsHome;