From a12c4a67f1d06414866f79b508c9ba1a2d5da7c8 Mon Sep 17 00:00:00 2001 From: Ephraim Atta-Duncan Date: Tue, 25 Feb 2025 11:12:15 +0000 Subject: [PATCH] chore: wip --- .../admin/leaderboard/download-button.tsx | 67 +++++++++++++++++++ .../leaderboard/fetch-leaderboard.actions.ts | 19 ++++++ .../(dashboard)/admin/leaderboard/page.tsx | 11 ++- 3 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 apps/web/src/app/(dashboard)/admin/leaderboard/download-button.tsx diff --git a/apps/web/src/app/(dashboard)/admin/leaderboard/download-button.tsx b/apps/web/src/app/(dashboard)/admin/leaderboard/download-button.tsx new file mode 100644 index 000000000..164f21159 --- /dev/null +++ b/apps/web/src/app/(dashboard)/admin/leaderboard/download-button.tsx @@ -0,0 +1,67 @@ +'use client'; + +// delete +import { useState } from 'react'; + +import { Trans } from '@lingui/macro'; +import { Download } from 'lucide-react'; + +import { Button } from '@documenso/ui/primitives/button'; + +import { downloadLeaderboardData } from './fetch-leaderboard.actions'; + +export const DownloadButton = () => { + const [isLoading, setIsLoading] = useState(false); + + const handleDownload = async () => { + try { + setIsLoading(true); + + const data = await downloadLeaderboardData(); + + // Create a blob with the data + const blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' }); + + // Create a URL for the blob + const url = URL.createObjectURL(blob); + + // Create a temporary anchor element + const a = document.createElement('a'); + a.href = url; + a.download = `leaderboard-data-${new Date().toISOString().split('T')[0]}.json`; + + // Trigger the download + document.body.appendChild(a); + a.click(); + + // Clean up + document.body.removeChild(a); + URL.revokeObjectURL(url); + } catch (error) { + console.error('Error downloading data:', error); + } finally { + setIsLoading(false); + } + }; + + return ( + + ); +}; diff --git a/apps/web/src/app/(dashboard)/admin/leaderboard/fetch-leaderboard.actions.ts b/apps/web/src/app/(dashboard)/admin/leaderboard/fetch-leaderboard.actions.ts index 42fc20c97..c01341edf 100644 --- a/apps/web/src/app/(dashboard)/admin/leaderboard/fetch-leaderboard.actions.ts +++ b/apps/web/src/app/(dashboard)/admin/leaderboard/fetch-leaderboard.actions.ts @@ -23,3 +23,22 @@ export async function search({ search, page, perPage, sortBy, sortOrder }: Searc return results; } + +// delete +export async function downloadLeaderboardData() { + const { user } = await getRequiredServerComponentSession(); + + if (!isAdmin(user)) { + throw new Error('Unauthorized'); + } + + const results = await getSigningVolume({ + search: '', + page: 1, + perPage: 1000, + sortBy: 'signingVolume', + sortOrder: 'desc', + }); + + return results.leaderboard; +} diff --git a/apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx b/apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx index cd809a921..b008ed454 100644 --- a/apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx +++ b/apps/web/src/app/(dashboard)/admin/leaderboard/page.tsx @@ -5,6 +5,7 @@ import { getRequiredServerComponentSession } from '@documenso/lib/next-auth/get- import { isAdmin } from '@documenso/lib/next-auth/guards/is-admin'; import { LeaderboardTable, type SigningVolume } from './data-table-leaderboard'; +import { DownloadButton } from './download-button'; import { search } from './fetch-leaderboard.actions'; type AdminLeaderboardProps = { @@ -48,9 +49,13 @@ export default async function Leaderboard({ searchParams = {} }: AdminLeaderboar return (
-

- Signing Volume -

+
+

+ Signing Volume +

+ {/* TODO: remove */} + +