Skip to content

Instantly share code, notes, and snippets.

@Tooluloope
Created September 12, 2025 18:41
Show Gist options
  • Save Tooluloope/746ac386cf41a03edfd151be674d4062 to your computer and use it in GitHub Desktop.
Save Tooluloope/746ac386cf41a03edfd151be674d4062 to your computer and use it in GitHub Desktop.
LeaderBoard pseudo code
type LeaderBoardProps = {
name: string;
id: string;
LeaderBoardComp?: ReactNode
};
type ListItem = {
id: number;
name: string;
score: number;
handle: string;
rank: number;
imgUrl: string;
};
const sdk = {
getTopScores: async (leaderboardId: string): Promise<ListItem[]> => {
return [
{
id: 1,
name: "Alice",
score: 1500,
handle: "alice123",
rank: 1,
imgUrl: "https://example.com/alice.jpg",
},
{
id: 2,
name: "Bob",
score: 1200,
handle: "bob456",
rank: 2,
imgUrl: "https://example.com/bob.jpg",
},
{
id: 3,
name: "Charlie",
score: 1000,
handle: "charlie789",
rank: 3,
imgUrl: "https://example.com/charlie.jpg",
},
];
},
};
const ListItemComponent = ({ name, score, handle, rank, imgUrl }: ListItem) => {
return (
<div className="list-item">
<span className="rank">{rank}</span>
<img src={imgUrl} alt={`${name}'s avatar`} className="avatar" />
<div className="info">
<span className="name">{name}</span>
<span className="handle">@{handle}</span>
</div>
<span className="score">{score}</span>
</div>
);
};
const LeaderBoard = ({ id }: LeaderBoardProps) => {
const {
data,
isError,
error,
isLoading: isPending,
} = useLeaderBoard(id );
if (isPending || data === null) return <div>Loading...</div>;
if (isError) return <div>Error: {error?.message}</div>;
if( data && !data.length ) return <div>No data available</div>;
return (
<LeaderBoardUI data={data} />
);
};
const LeaderBoardUI = ({data}: {
data: ListItem[],
}) => {
return <div className="leaderboard">
<h2 className="leaderboard-title">{name}</h2>
<ul aria-label={`${name} Leaderboard`} className="leaderboard-list">
{data.map((item) => (
<li key={item.id} className="leaderboard-list-item">
<ListItemComponent {...item} />
</li>
))}
</ul>
</div>
}
args:
leaderBoardID,
leaderBoardName,
return
ListItem[]
type UseLeaderBoardProps = {
leaderBoardID: string;
};
type ReturnType = {
data: ListItem[] | null;
isError: boolean;
error: Error | null;
isLoading: boolean;
}
/**
*
* @param param leaderBoardID
* @returns ReturnType
*/
const useLeaderBoard = ( leaderBoardID : string) : ReturnType => {
const [data, setData] = useState<ListItem[]| null>(null);
const [error, setError] = useState<Error | null>(null);
const [isError, setIsError] = useState<boolean>(false);
const [isPending, startTransition] = useTransition();
useEffect(() => {
const fetchData = async () => {
startTransition(async () => {
try {
const result = await sdk.getTopScores(leaderBoardID) ?? [];
setData(result);
} catch (error) {
setError(error as Error);
setIsError(true);
setData([])
}
});
};
void fetchData();
}, [leaderBoardID]);
return{
data,
isError,
error,
isLoading: isPending,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment