Renacer Social, the app

TopicList.tsx 1.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import {
  2. IonContent,
  3. IonItem,
  4. IonLabel,
  5. IonList,
  6. IonListHeader,
  7. } from "@ionic/react";
  8. import { Topic } from "../types";
  9. import SkeletonText from "./SkeletonText";
  10. import "../components/TopicList.css";
  11. /**
  12. * This component creates a shimmering "skeleton" version of the list component.
  13. * It shows only when content isn't available yet (loading).
  14. */
  15. function ListSkeleton({ items = 5 }: { items?: number }) {
  16. return (
  17. <>
  18. {Array(items)
  19. .fill(0)
  20. .map((_, i) => (
  21. <IonItem key={i}>
  22. <SkeletonText />
  23. </IonItem>
  24. ))}
  25. </>
  26. );
  27. }
  28. const TopicList: React.FC<{
  29. title?: string;
  30. topics: Topic[];
  31. loading?: boolean;
  32. }> = ({ title, topics, loading }) => {
  33. console.log(topics);
  34. return (
  35. <IonList>
  36. {title ? (
  37. <IonListHeader>
  38. <IonLabel>{title}</IonLabel>
  39. </IonListHeader>
  40. ) : null}
  41. {loading && <ListSkeleton />}
  42. {!loading &&
  43. topics &&
  44. topics.map((topic: Topic) => {
  45. return (
  46. <IonItem
  47. key={topic.blockId}
  48. routerLink={`/article/${topic.blockId}`}
  49. >
  50. <p className="ListItemText">{topic.name}</p>
  51. </IonItem>
  52. );
  53. })}
  54. </IonList>
  55. );
  56. };
  57. export default TopicList;