import { Divider, IconButton, Tooltip } from "@mui/joy"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { showCommonDialog } from "@/components/Dialog/CommonDialog"; import Empty from "@/components/Empty"; import Icon from "@/components/Icon"; import MobileHeader from "@/components/MobileHeader"; import ResourceIcon from "@/components/ResourceIcon"; import { resourceServiceClient } from "@/grpcweb"; import useLoading from "@/hooks/useLoading"; import i18n from "@/i18n"; import { Resource } from "@/types/proto/api/v2/resource_service"; import { useTranslate } from "@/utils/i18n"; const fetchAllResources = async () => { const { resources } = await resourceServiceClient.listResources({}); return resources; }; function groupResourcesByDate(resources: Resource[]) { const grouped = new Map(); resources.forEach((item) => { const date = new Date(item.createdTs as any); const year = date.getFullYear(); const month = date.getMonth() + 1; const timestamp = Date.UTC(year, month - 1, 1); if (!grouped.has(timestamp)) { grouped.set(timestamp, []); } grouped.get(timestamp)?.push(item); }); return grouped; } const Resources = () => { const t = useTranslate(); const loadingState = useLoading(); const [resources, setResources] = useState([]); const groupedResources = groupResourcesByDate(resources.filter((resoure) => resoure.memoId)); const unusedResources = resources.filter((resoure) => !resoure.memoId); useEffect(() => { fetchAllResources().then((resources) => { setResources(resources); loadingState.setFinish(); }); }, []); const handleDeleteUnusedResources = () => { showCommonDialog({ title: "Delete all unused resources", content: "Are you sure to delete all unused resources? This action cannot be undone.", style: "warning", dialogName: "delete-unused-resources-dialog", onConfirm: async () => { for (const resource of unusedResources) { await resourceServiceClient.deleteResource({ id: resource.id }); } setResources(resources.filter((resoure) => resoure.memoId)); }, }); }; return (

{t("common.resources")}

{loadingState.isLoading ? (

{t("resource.fetching-data")}

) : ( <> {resources.length === 0 ? (

{t("message.no-data")}

) : (
{Array.from(groupedResources.entries()).map(([timestamp, resources]) => { const date = new Date(timestamp); return (
{date.getFullYear()} {date.toLocaleString(i18n.language, { month: "short" })}
{resources.map((resource) => { return (

{resource.filename}

#{resource.memoId}
); })}
); })} {unusedResources.length > 0 && ( <>
Unused resources ({unusedResources.length})
{unusedResources.map((resource) => { return (

{resource.filename}

); })}
)}
)} )}
); }; export default Resources;