import { SkipForwardIcon, Trash2Icon, TriangleAlertIcon } from "lucide-react"; import React from "react"; import AppHeader from "src/components/AppHeader"; import AppCard from "src/components/connections/AppCard"; import Loading from "src/components/Loading"; import { Alert, AlertDescription, AlertTitle } from "src/components/ui/alert"; import { Button } from "src/components/ui/button"; import { Card, CardDescription, CardFooter, CardHeader, CardTitle, } from "src/components/ui/card"; import { LinkButton } from "src/components/ui/custom/link-button"; import { Progress } from "src/components/ui/progress"; import { useDeleteApp } from "src/hooks/useDeleteApp"; import { useUnusedApps } from "src/hooks/useUnusedApps"; import { App } from "src/types"; export function AppsCleanup() { const unusedApps = useUnusedApps(100_000); // assume never more than 100k apps const [appIndex, setAppIndex] = React.useState(); const [skippedCount, setSkippedCount] = React.useState(0); const [deletedCount, setDeletedCount] = React.useState(0); const [appsToReview, setAppsToReview] = React.useState(); React.useEffect(() => { if (!unusedApps) { return; } // only allow initializing once if (appIndex === undefined) { setAppIndex(0); const _appsToReview = [...unusedApps]; _appsToReview.sort((a, b) => { return ( (a.lastUsedAt ? new Date(a.lastUsedAt).getTime() : 0) - (b.lastUsedAt ? new Date(b.lastUsedAt).getTime() : 0) ); }); setAppsToReview(_appsToReview); } }, [appIndex, unusedApps]); if (!appsToReview || appIndex === undefined) { return ; } const currentApp = appsToReview[appIndex]; return ( <> {currentApp && ( Warning Review the app carefully before deleting it, deleted apps cannot be recovered. )}
{currentApp && ( <>
{ setAppIndex(appIndex + 1); setDeletedCount((current) => current + 1); }} /> } readonly />
)} {!currentApp && ( <>
No more unused apps to review.
Back to overview
)}
Progress {appIndex} of {appsToReview.length} unused apps reviewed ( {skippedCount} skipped, {deletedCount} deleted)
); } function DeleteAppButton({ app, onDelete, }: { app: App; onDelete: () => void; }) { const { deleteApp } = useDeleteApp(app); return ( ); }