// components/Leaderboard.tsx import React, { useEffect, useState } from "react"; import { getLeaderboard, LeaderboardResponse } from "../index"; import { LeaderboardProps } from "../types"; /** * The Leaderboard component. * Renders the leaderboard for the given client and provides options for customization. * @param {string} [client="all"] - The client ID. Defaults to "all". * @param {string} [timePeriod=''] - Filter by time period ('', 'week', or 'month'). Optional. * @param {boolean} [trial=true] - A boolean value to include/exclude trial data. Optional. * @param {boolean} [badgeFilter=false] - A boolean value to filter by badges. Optional. * @param {number} [limit=20] - Limit the number of users displayed. Optional. * @param {string} [className] - CSS class for the main container. Optional. * @param {string} [errorClassName] - CSS class for error messages. Optional. * @param {string} [loadingClassName] - CSS class for loading messages. Optional. * @param {string} [tableClassName] - CSS class for the table. Optional. * @param {string} [titleClassName] - CSS class for table titles. Optional. * @param {string} [textClassName] - CSS class for table text. Optional. * @param {string} [headerClassName] - CSS class for table headers. Optional. * @param {string} [rowClassName] - CSS class for table rows. Optional. * @param {string} [badgeClassName] - CSS class for badges. Optional. * @param {string} [badge_icon] - URL for the badge icon. Optional. * @param {React.CSSProperties} [style] - Inline styles for the main container. Optional. */ export const Leaderboard: React.FC = ({ client = "all", timePeriod, trial, badgeFilter, limit = 20, className, errorClassName, loadingClassName, tableClassName, titleClassName, textClassName, headerClassName, rowClassName, badgeClassName, badge_icon = "https://mytriberewards.com/wp-content/uploads/2022/12/TRIBENFTCO-Logo-Black-100x100.png", style, }) => { const [leaderboardData, setLeaderboardData] = useState(null); const [error, setError] = useState(null); /** * Fetch the leaderboard data on component mount and whenever the specified dependencies change. */ useEffect(() => { async function fetchData() { const data = await getLeaderboard(client, { timePeriod, trial, badgeFilter, }); if (data instanceof Error) { setError(data.message); } else { setLeaderboardData(data); } } fetchData(); }, [client, timePeriod, trial, badgeFilter]); /** * Check if leaderboardData.data is an array before mapping */ useEffect(() => { // Check if leaderboardData.data is an array before mapping if (leaderboardData && !Array.isArray(leaderboardData.data)) { setError("Invalid client ID or unexpected response format"); } }, [leaderboardData]); /** * Render the leaderboard component. * Displays a loading message while the data is being fetched. * Displays an error message if there is an issue fetching the data. * Lists users with their usernames and total points. */ return (

{client.toLowerCase() === "all" ? "All Clients Leaderboard" : `${client} Leaderboard`}

{error ? (
Error: {error}
) : leaderboardData && Array.isArray(leaderboardData.data) ? ( {leaderboardData.data.slice(0, limit).map((user, index) => ( ))}
Member Twitter Points Content Points Total Earned
{user.has_badge ? ( badge ) : ( "" )} {user.username} {user.twitter_points} {user.content_points} {user.total_points}
) : (
Loading...
)}
Powered by Tribe{" "} Tribe Logo
); };