diff --git a/package.json b/package.json index 2caeae6..bb648bb 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", + "sharp": "^0.35.1", "swr": "^2.4.1", "tailwindcss": "^4.3.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac14458..7245875 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: remark-gfm: specifier: ^4.0.1 version: 4.0.1 + sharp: + specifier: ^0.35.1 + version: 0.35.1 swr: specifier: ^2.4.1 version: 2.4.1(react@18.3.1) @@ -98,6 +101,9 @@ packages: '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -132,6 +138,168 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.35.1': + resolution: {integrity: sha512-T15JRWOubQ3f5+GxnWeIvo47u5qV0M9HBgJhT+f2gE1e9e6OhR6K73Re52Hm80qWcu1DNb3GweKmpr/MnuP2Ow==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.35.1': + resolution: {integrity: sha512-t1CPD0cr7XCHjwUj6tQ5MC0pCi866I+gUW6zbUX4aFPnKd1DFBtk0M+gWcjX8VeEzgfCNiSiNTVFZ6b7kvdbnQ==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [darwin] + + '@img/sharp-freebsd-wasm32@0.35.1': + resolution: {integrity: sha512-MBSQXqNPThW9EcZ905H6N4sEdX5EwZEYzGx5EBq9ncDCGJALMiY1xPFJxNdzuB1iBjLOpIfxajM6YxdvwmQSLA==} + engines: {node: '>=20.9.0'} + os: [freebsd] + + '@img/sharp-libvips-darwin-arm64@1.3.0': + resolution: {integrity: sha512-EKbmBKtyTH+GPFDRw2TgK2oV6hyxxlJVIar4hoTYSNmIwipgMFdxPQqR392GmfdsPGWga0mCFN1cCKjRb9cljw==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.3.0': + resolution: {integrity: sha512-Pl2OmOvrJ42adUllESxBsG54PfXLo1OYg9i3c5/5Ln/qJ0gZuTM9YMhQJPIbXqwidLRc/c2zuHt4RsrymmNv7A==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.3.0': + resolution: {integrity: sha512-C0SqjoFKnszqa44EQ7xoaT48nnO0lOyXEULfXMWi8krrjOPGYkeK30Okzla6ATbBYsyZ0ySinK0FVkpv3DwzfQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.3.0': + resolution: {integrity: sha512-A8UpHoUDW4DwnXoV6+q3C1s7QLRAHtPDEjWuNZjwHMyoCNZnm0GeNN8ls9f/bsEYTRQRW96C/n34XJQHJ2fT7A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.3.0': + resolution: {integrity: sha512-WOpkVxAjFd369iaIzEgNRreFD+gWdUMIGD5zplhNKNeqS6mm5dac3q2AFyCBmzYoAdouzZvRBgxy4z8QHZb4/A==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.3.0': + resolution: {integrity: sha512-DRWw0mOHusrCCuw2rqP87oLg6PGlkomVDFqw2hIwsSfwWpu4k3XLcBPaKKl6ct/GtL/cwNkgwjV/tc0Mqht3VA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.3.0': + resolution: {integrity: sha512-9APy+nFWhHS+kzLgWZfLcyrUd7YqnAQVa4BPOo4xkoHpdoktOAPG4cEr9+Jpl0TtqfVmcMJimNL5qNTyyOHZNA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.3.0': + resolution: {integrity: sha512-y9RNUYDe2A1UAdhLyfeOodGRszQdaEoe4nfOpp/sNVPl2CWIcUyFaDoCh4vPLPxu19803j2naLqZup2WxDXCLA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.3.0': + resolution: {integrity: sha512-cC1wkC0Mlucd0KSiGrLkJnB/ZqPvZCntc/Lk7ZnYO5ZSbF2euNek4Xvxafojq+wN1q/W0eprdpUIjUr/EV2PBg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.3.0': + resolution: {integrity: sha512-LiYMhUZicB1QG//+RvmYZpXJO8fYRENfp+MZUCnG9aw+AKvGAy9gPaCnuwsPcBFs8EV66M0NNxj9VHcNklE8zw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.35.1': + resolution: {integrity: sha512-ErCRyGU7LeoaFBZ0xW8hhLlXzhAg80sc4vxePB86qvtEvW1jEhhmbiNBP4oEzZfPMnu6HwHXfzD2W2kBU+RnCw==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.35.1': + resolution: {integrity: sha512-jygmR02PpCYypt7xB7nst1vqjZp/BpRA/Kf9nK7qRponJ/KrLPaZWEG4G15z1d2FZ6XqI+T0350ha3RSnKx24A==} + engines: {node: '>=20.9.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.35.1': + resolution: {integrity: sha512-LUWZ2+r2UoLCd8j0RLCwQ4gL6w47+Y7igxtVnPIDXOOEjV86LpBkAHq5VpJeg+GHbw0KN/JWlPJOdZjyZnFqFQ==} + engines: {node: '>=20.9.0'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.35.1': + resolution: {integrity: sha512-i7x6J3mwF4JgT0sM4V4WlAWdJ0bucPtA9rzO1bTji1n5qgBq/W5nn87RvOQPleuuxahNoLdTngByD8/vDDLArw==} + engines: {node: '>=20.9.0'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.35.1': + resolution: {integrity: sha512-0zSaTUjTF0kIWTSYxD4EG/nvCU4jez53+3RdURtoY3HvbXtIQ98W90JnrGz/oLRFuEnfIy9+7xeq883euc0ZWw==} + engines: {node: '>=20.9.0'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.35.1': + resolution: {integrity: sha512-NbJD4mWdeyrNQKluO/tR/wBDOelcowSVGNBWxI0e3ZtlXc6F/UOVKDj1MLD4zl3oHTuvKW3s+MA9N54YTldAYw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.35.1': + resolution: {integrity: sha512-VoW2sQCWI+0YIKQEmWJ8vzaQjTg9wIyfkFpvEfAS2h43X6iHu7GTk1hhOgB4IpSzCHe8UwQZIcx7b81VTaOrJA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.35.1': + resolution: {integrity: sha512-LjBoSd/c5JU0/K5MwzDMlgsSRP2bPn98JQGFFQAOLQ0bU/1z4ekxUdSKY9BmlwSh/cA+OrvpgsWqfZyYfVHBRw==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.35.1': + resolution: {integrity: sha512-PCQUoQdZyE8tp3HpbevuihfUmgSP4qWI0FGEPWoeXqaS+cUrFfemabHQiebUmUmlUhCuNnQMxGrQ+CPqK4hnxg==} + engines: {node: '>=20.9.0'} + + '@img/sharp-webcontainers-wasm32@0.35.1': + resolution: {integrity: sha512-xU2ml2bU2OPxYVvW2A6ae4M1g5QKyhKG06P4FAt+YEaFQQO0919Qx+XxIZEUuWTMoDViLpMws2/dQwoe/VcA6A==} + engines: {node: '>=20.9.0'} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.35.1': + resolution: {integrity: sha512-IkmHwuFhYpd3bTsN5SAahjwhiAcyXPooBt8vEUgxY3T0IP70sSJ0nU1xiPzZY8AH/OB1XpV3j8aZSVSOSfTbdA==} + engines: {node: '>=20.9.0'} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.35.1': + resolution: {integrity: sha512-wQahqCi9MD8Yxzg4gVM4fNrZxh+r6vD55PyIg+WJPaM5ZRUyF35iQpwJCuma3r6viU9/8Pxlc+XHV+woVa6nCQ==} + engines: {node: ^20.9.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.35.1': + resolution: {integrity: sha512-WzBtkYtZHATLPe8XRharxZXxQ9cdLrQWHiwxt+BJ5rBsisQrKeeV86ErxPSVhcG6xCEuNhs0SqLpWr7XDa2k6w==} + engines: {node: '>=20.9.0'} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2140,6 +2308,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.4: + resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} + engines: {node: '>=10'} + hasBin: true + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2152,6 +2325,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + sharp@0.35.1: + resolution: {integrity: sha512-lW979AMi+ESidzMv/Lnv+F9bknzLyxLqFI05Sm433vOeRcltgxQmXpnfOOFIAlKtwXU/ksupm2srQoFCkR214g==} + engines: {node: '>=20.9.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2463,6 +2640,11 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -2503,6 +2685,112 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@img/colour@1.1.0': {} + + '@img/sharp-darwin-arm64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.3.0 + optional: true + + '@img/sharp-darwin-x64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.3.0 + optional: true + + '@img/sharp-freebsd-wasm32@0.35.1': + dependencies: + '@img/sharp-wasm32': 0.35.1 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.3.0': + optional: true + + '@img/sharp-libvips-darwin-x64@1.3.0': + optional: true + + '@img/sharp-libvips-linux-arm64@1.3.0': + optional: true + + '@img/sharp-libvips-linux-arm@1.3.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.3.0': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.3.0': + optional: true + + '@img/sharp-libvips-linux-s390x@1.3.0': + optional: true + + '@img/sharp-libvips-linux-x64@1.3.0': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.3.0': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.3.0': + optional: true + + '@img/sharp-linux-arm64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.3.0 + optional: true + + '@img/sharp-linux-arm@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.3.0 + optional: true + + '@img/sharp-linux-ppc64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.3.0 + optional: true + + '@img/sharp-linux-riscv64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.3.0 + optional: true + + '@img/sharp-linux-s390x@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.3.0 + optional: true + + '@img/sharp-linux-x64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.3.0 + optional: true + + '@img/sharp-linuxmusl-arm64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.3.0 + optional: true + + '@img/sharp-linuxmusl-x64@0.35.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.3.0 + optional: true + + '@img/sharp-wasm32@0.35.1': + dependencies: + '@emnapi/runtime': 1.11.1 + optional: true + + '@img/sharp-webcontainers-wasm32@0.35.1': + dependencies: + '@img/sharp-wasm32': 0.35.1 + optional: true + + '@img/sharp-win32-arm64@0.35.1': + optional: true + + '@img/sharp-win32-ia32@0.35.1': + optional: true + + '@img/sharp-win32-x64@0.35.1': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4861,6 +5149,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.4: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -4883,6 +5173,38 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + sharp@0.35.1: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.35.1 + '@img/sharp-darwin-x64': 0.35.1 + '@img/sharp-freebsd-wasm32': 0.35.1 + '@img/sharp-libvips-darwin-arm64': 1.3.0 + '@img/sharp-libvips-darwin-x64': 1.3.0 + '@img/sharp-libvips-linux-arm': 1.3.0 + '@img/sharp-libvips-linux-arm64': 1.3.0 + '@img/sharp-libvips-linux-ppc64': 1.3.0 + '@img/sharp-libvips-linux-riscv64': 1.3.0 + '@img/sharp-libvips-linux-s390x': 1.3.0 + '@img/sharp-libvips-linux-x64': 1.3.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.3.0 + '@img/sharp-libvips-linuxmusl-x64': 1.3.0 + '@img/sharp-linux-arm': 0.35.1 + '@img/sharp-linux-arm64': 0.35.1 + '@img/sharp-linux-ppc64': 0.35.1 + '@img/sharp-linux-riscv64': 0.35.1 + '@img/sharp-linux-s390x': 0.35.1 + '@img/sharp-linux-x64': 0.35.1 + '@img/sharp-linuxmusl-arm64': 0.35.1 + '@img/sharp-linuxmusl-x64': 0.35.1 + '@img/sharp-webcontainers-wasm32': 0.35.1 + '@img/sharp-win32-arm64': 0.35.1 + '@img/sharp-win32-ia32': 0.35.1 + '@img/sharp-win32-x64': 0.35.1 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 diff --git a/src/app/dashboard/dev/page.tsx b/src/app/dashboard/dev/page.tsx index 3837dd2..daecbf3 100644 --- a/src/app/dashboard/dev/page.tsx +++ b/src/app/dashboard/dev/page.tsx @@ -89,8 +89,8 @@ export default function DevDashboardPage() { useEffect(() => { if (!initialFetchDone.current) return; if (sessionStatus !== "authenticated") return; - fetchRepos(1, selectedOrg, debouncedSearch); - }, [debouncedSearch]); + fetchRepos(1, selectedOrg, debouncedSearch, filter); + }, [debouncedSearch, filter]); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { @@ -141,6 +141,7 @@ export default function DevDashboardPage() { pageNumber: number = 1, org: string | null = selectedOrg, searchQuery: string = debouncedSearch, + currentFilter: string = filter, ) => { if (pageNumber === 1) setLoading(true); else setIsFetchingMore(true); @@ -179,8 +180,11 @@ export default function DevDashboardPage() { const searchParam = searchQuery ? `&search=${encodeURIComponent(searchQuery)}` : ""; + const filterParam = currentFilter !== "all" + ? `&filter=${encodeURIComponent(currentFilter)}` + : ""; const res = await fetch( - `${apiUrl}/api/v1/github/repos?page=${pageNumber}&per_page=10${orgParam}${searchParam}`, + `${apiUrl}/api/v1/github/repos?page=${pageNumber}&per_page=10${orgParam}${searchParam}${filterParam}`, { headers: token ? { Authorization: `Bearer ${token}` } : {}, }, @@ -221,7 +225,7 @@ export default function DevDashboardPage() { const handleOrgChange = (orgLogin: string | null) => { setSelectedOrg(orgLogin); setOrgDropdownOpen(false); - fetchRepos(1, orgLogin, debouncedSearch); + fetchRepos(1, orgLogin, debouncedSearch, filter); }; const toggleCI = async (repo: Repo) => { @@ -285,7 +289,7 @@ export default function DevDashboardPage() { } // Refresh current repos by reloading page 1 - await fetchRepos(1, selectedOrg, debouncedSearch); + await fetchRepos(1, selectedOrg, debouncedSearch, filter); } catch (err: any) { alert(`An error occurred while toggling CI: ${err.message}`); } finally { @@ -293,13 +297,7 @@ export default function DevDashboardPage() { } }; - const filteredRepos = repos.filter((r) => { - if (filter === "enabled" && !r.ciEnabled) return false; - if (filter === "disabled" && r.ciEnabled) return false; - if (search && !r.name.toLowerCase().includes(search.toLowerCase())) - return false; - return true; - }); + const filteredRepos = repos; const enabledCount = repos.filter((r) => r.ciEnabled).length; const disabledCount = repos.filter((r) => !r.ciEnabled).length; diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx index 351cb5c..83f13ea 100644 --- a/src/app/dashboard/page.tsx +++ b/src/app/dashboard/page.tsx @@ -11,7 +11,7 @@ import { import Link from "next/link"; import PluginImage from "@/components/PluginImage"; -import { fetchApi } from "@/lib/api"; +import { fetchGraphQL } from "@/lib/api"; import { getServerSession } from "next-auth/next"; import { authOptions } from "@/lib/auth"; import { redirect } from "next/navigation"; @@ -23,15 +23,48 @@ export default async function DashboardPage() { redirect("/api/auth/signin"); } - // Fetch real data from backend - const [pluginsRes, statsRes, statusRes] = await Promise.all([ - fetchApi("/api/v1/dashboard/plugins"), - fetchApi("/api/v1/dashboard/stats"), - fetchApi("/api/v1/dashboard/status"), - ]); + const GET_DASHBOARD_DATA = ` + query GetDashboardData { + dashboardStatus { + hasAppInstalled + githubTokenExpired + } + myStats { + totalPlugins + totalDownloads + totalVersions + pendingReviews + } + myPlugins { + id + slug + displayName + iconUrl + repoUrl + pluginType + downloads + status + latestVersion + } + } + `; - const hasAppInstalled = statusRes.data?.data?.hasAppInstalled || false; - const githubTokenExpired = statusRes.data?.data?.githubTokenExpired || false; + let hasAppInstalled = false; + let githubTokenExpired = false; + let stats = { totalPlugins: 0, totalDownloads: 0, totalVersions: 0, pendingReviews: 0 }; + let myPlugins: any[] = []; + + try { + const { data } = await fetchGraphQL(GET_DASHBOARD_DATA, {}, { cache: "no-store" }); + if (data) { + hasAppInstalled = data.dashboardStatus?.hasAppInstalled || false; + githubTokenExpired = data.dashboardStatus?.githubTokenExpired || false; + stats = data.myStats || stats; + myPlugins = data.myPlugins || []; + } + } catch (err) { + console.error("Failed to load dashboard data:", err); + } const installUrl = process.env.NEXT_PUBLIC_GITHUB_APP_INSTALL_URL || "https://github.com/apps/endgit-app/installations/new"; @@ -88,14 +121,7 @@ export default async function DashboardPage() { ); } - const stats = statsRes.data?.data || { - totalPlugins: 0, - totalDownloads: 0, - totalVersions: 0, - pendingReviews: 0, - }; - const myPlugins: any[] = pluginsRes.data?.data || []; return (
diff --git a/src/components/PluginAnalyticsChart.tsx b/src/components/PluginAnalyticsChart.tsx
index f19201f..3e824e9 100644
--- a/src/components/PluginAnalyticsChart.tsx
+++ b/src/components/PluginAnalyticsChart.tsx
@@ -122,6 +122,7 @@ export default function PluginAnalyticsChart({ slug }: { slug: string }) {
interval="preserveStartEnd"
/>