"use client"; import React from "react"; import { Group, Progress, ScrollArea, SimpleGrid, Stack, Text } from "@mantine/core"; import { IconDatabase, IconPhoto, IconUsers, IconVideo } from "@tabler/icons-react"; import { clientApi } from "@homarr/api/client"; import { formatBytes } from "@homarr/common"; import { useI18n } from "@homarr/translation/client"; import { WidgetEmptyState } from "../../common/empty-state"; import type { WidgetComponentProps } from "../../definition"; import { setWidgetRuntimeQueries } from "../../definition"; import classes from "./component.module.css"; const MAX_ADVANCED_ALBUMS = 50; export default function ImmichServerStatsWidget({ integrationIds, options, displayMode = "compact", width, widgetStateRef, }: WidgetComponentProps<"immich-serverStats">) { const t = useI18n(); const input = { integrationId: integrationIds[0] ?? "" }; const albumsInput = { ...input, limit: MAX_ADVANCED_ALBUMS }; const isAdvanced = displayMode === "advanced"; const albumsEnabled = isAdvanced && integrationIds.length > 0; const { data: stats } = clientApi.widget.immich.getServerStats.useQuery(input); const { data: albums = [] } = clientApi.widget.immich.getAlbums.useQuery(albumsInput, { enabled: albumsEnabled, staleTime: 15 * 60 * 1000, }); setWidgetRuntimeQueries(widgetStateRef, [ { path: ["widget", "immich", "getServerStats"], input }, ...(albumsEnabled ? [{ path: ["widget", "immich", "getAlbums"], input: albumsInput }] : []), ]); if (!stats) return ; const statsContent = ( = 720 ? 4 : width >= 360 ? 2 : 1) : width >= 320 ? 2 : 1} spacing="sm"> {options.showUsers && ( } label={t("widget.immich-serverStats.users")} value={stats.userCount} /> )} {options.showPhotos && ( } label={t("widget.immich-serverStats.photos")} value={stats.photoCount} /> )} {options.showVideos && ( } label={t("widget.immich-serverStats.videos")} value={stats.videoCount} /> )} {options.showStorage && ( } label={t("widget.immich-serverStats.storage")} value={formatBytes(stats.totalLibraryUsageInBytes)} /> )} ); if (!isAdvanced) { return ( {statsContent} ); } const sortedAlbums = albums; const maxAssets = sortedAlbums[0]?.assetCount ?? 1; return ( {statsContent} = 900 ? 2 : 1} spacing="xs"> {sortedAlbums.map((album) => ( {album.albumName} {album.assetCount.toLocaleString()} ))} ); } interface StatItemProps { icon: React.ReactNode; label: string; value: string | number; } function StatItem({ icon, label, value }: StatItemProps) { return ( {icon} {label} {value} ); }