"use client"; import { ActionIcon, Avatar, Card, Grid, Group, Space, Stack, Text, Tooltip } from "@mantine/core"; import { useElementSize } from "@mantine/hooks"; import type { Icon } from "@tabler/icons-react"; import { IconDeviceTv, IconExternalLink, IconHourglass, IconLoaderQuarter, IconMovie, IconPlayerPlay, IconReceipt, IconThumbDown, IconThumbUp, } from "@tabler/icons-react"; import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; import { useRequiredBoard } from "@homarr/boards/context"; import type { RequestStats } from "@homarr/integrations/types"; import { useScopedI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../../definition"; import { NoIntegrationDataError } from "../../errors/no-data-integration"; import classes from "./component.module.css"; export default function MediaServerWidget({ integrationIds, isEditMode, }: WidgetComponentProps<"mediaRequests-requestStats">) { const t = useScopedI18n("widget.mediaRequests-requestStats"); const [requestStats] = clientApi.widget.mediaRequests.getStats.useSuspenseQuery( { integrationIds, }, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, }, ); const { width, height, ref } = useElementSize(); const board = useRequiredBoard(); if (requestStats.users.length === 0 && requestStats.stats.length === 0) throw new NoIntegrationDataError(); const data = [ { name: "approved", icon: IconThumbUp, number: requestStats.stats.reduce((count, { approved }) => count + approved, 0), }, { name: "pending", icon: IconHourglass, number: requestStats.stats.reduce((count, { pending }) => count + pending, 0), }, { name: "processing", icon: IconLoaderQuarter, number: requestStats.stats.reduce((count, { processing }) => count + processing, 0), }, { name: "declined", icon: IconThumbDown, number: requestStats.stats.reduce((count, { declined }) => count + declined, 0), }, { name: "available", icon: IconPlayerPlay, number: requestStats.stats.reduce((count, { available }) => count + available, 0), }, { name: "tv", icon: IconDeviceTv, number: requestStats.stats.reduce((count, { tv }) => count + tv, 0), }, { name: "movie", icon: IconMovie, number: requestStats.stats.reduce((count, { movie }) => count + movie, 0), }, { name: "total", icon: IconReceipt, number: requestStats.stats.reduce((count, { total }) => count + total, 0), }, ] satisfies { name: keyof RequestStats; icon: Icon; number: number }[]; return ( {t("titles.stats.main")} {data.map((stat) => ( {stat.number} ))} {t("titles.users.main")} {requestStats.users.slice(0, Math.max(Math.floor((height / width) * 5), 1)).map((user) => ( {user.displayName} {`${t("titles.users.requests")}: ${user.requestCount}`} ))} ); }