diff --git a/src/lib/cards/index.ts b/src/lib/cards/index.ts index 708d743..7e3b663 100644 --- a/src/lib/cards/index.ts +++ b/src/lib/cards/index.ts @@ -41,6 +41,7 @@ import { GitHubContributorsCardDefinition } from './social/GitHubContributorsCar import { ProductHuntCardDefinition } from './social/ProductHuntCard'; import { KickstarterCardDefinition } from './social/KickstarterCard'; import { NpmxLikesCardDefinition } from './social/NpmxLikesCard'; +import { NpmxLikesLeaderboardCardDefinition } from './social/NpmxLikesLeaderboardCard'; // import { Model3DCardDefinition } from './visual/Model3DCard'; export const AllCardDefinitions = [ @@ -86,7 +87,8 @@ export const AllCardDefinitions = [ GitHubContributorsCardDefinition, ProductHuntCardDefinition, KickstarterCardDefinition, - NpmxLikesCardDefinition + NpmxLikesCardDefinition, + NpmxLikesLeaderboardCardDefinition ] as const; export const CardDefinitionsByType = AllCardDefinitions.reduce( diff --git a/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte b/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte new file mode 100644 index 0000000..c7e3b6e --- /dev/null +++ b/src/lib/cards/social/NpmxLikesLeaderboardCard/NpmxLikesLeaderboardCard.svelte @@ -0,0 +1,116 @@ + + +{#snippet leaderboardRow(entry: LeaderboardEntry, index: number)} +
+
+ #{index + 1} +
+
+
+
+ {getPackageName(entry)} +
+
+ + + + {entry.totalLikes} +
+
+
+
+{/snippet} + +
+ {#if leaderboard && leaderboard.leaderBoard.length > 0} +
+ {#each leaderboard.leaderBoard as entry, index (entry.subjectRef)} + + {@render leaderboardRow(entry, index)} + + {/each} +
+
+
+ {leaderboard.totalLikes} likes + · + {leaderboard.totalUniqueLikers} unique likers +
+ {:else if leaderboard} +
+ No leaderboard data. +
+ {:else} +
+ Loading leaderboard... +
+ {/if} +
diff --git a/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts b/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts new file mode 100644 index 0000000..167ab1f --- /dev/null +++ b/src/lib/cards/social/NpmxLikesLeaderboardCard/index.ts @@ -0,0 +1,26 @@ +import type { CardDefinition } from '../../types'; +import NpmxLikesLeaderboardCard from './NpmxLikesLeaderboardCard.svelte'; + +export const NpmxLikesLeaderboardCardDefinition = { + type: 'npmxLikesLeaderboard', + contentComponent: NpmxLikesLeaderboardCard, + createNew: (card) => { + card.w = 4; + card.mobileW = 8; + card.h = 4; + card.mobileH = 6; + }, + loadData: async () => { + const res = await fetch('https://blento.app/api/npmx-leaderboard'); + const data = await res.json(); + return data; + }, + minW: 3, + canHaveLabel: true, + + keywords: ['npm', 'package', 'npmx', 'likes', 'leaderboard', 'ranking'], + name: 'npmx Likes Leaderboard', + + //groups: ['Social'], + icon: `` +} as CardDefinition & { type: 'npmxLikesLeaderboard' }; diff --git a/src/routes/api/npmx-leaderboard/+server.ts b/src/routes/api/npmx-leaderboard/+server.ts index 52456a6..068e80c 100644 --- a/src/routes/api/npmx-leaderboard/+server.ts +++ b/src/routes/api/npmx-leaderboard/+server.ts @@ -2,7 +2,7 @@ import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; const LEADERBOARD_API_URL = - 'https://npmx-likes-leaderboard-api-production.up.railway.app/api/leaderboard/likes'; + 'https://npmx-likes-leaderboard-api-production.up.railway.app/api/leaderboard/likes?limit=20'; export const GET: RequestHandler = async ({ platform }) => { const cacheKey = '#npmx-leaderboard:likes';