"use client"; import type { PropsWithChildren } from "react"; import { Fragment, Suspense } from "react"; import { Flex, rem, Stack, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { IconMinus } from "@tabler/icons-react"; import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; import { useRequiredBoard } from "@homarr/boards/context"; import { useSettings } from "@homarr/settings"; import { useRegisterSpotlightContextResults } from "@homarr/spotlight"; import { useI18n } from "@homarr/translation/client"; import { MaskedOrNormalImage } from "@homarr/ui"; import { WidgetEmptyState } from "../common/empty-state"; import type { WidgetComponentProps } from "../definition"; import classes from "./app.module.css"; import { PingDot } from "./ping/ping-dot"; import { PingIndicator } from "./ping/ping-indicator"; export default function AppWidget({ options, isEditMode, height, width }: WidgetComponentProps<"app">) { const t = useI18n(); const settings = useSettings(); const board = useRequiredBoard(); const { data: app } = clientApi.app.byId.useQuery( { id: options.appId, }, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, retry: false, }, ); useRegisterSpotlightContextResults( `app-${app?.id ?? options.appId}`, app?.href ? [ { id: app.id, name: app.name, icon: app.iconUrl, interaction() { return { type: "link", // eslint-disable-next-line @typescript-eslint/no-non-null-assertion href: app.href!, newTab: options.openInNewTab, }; }, }, ] : [], [app, options.openInNewTab], ); if (!app) return ; const isTiny = height < 100 || width < 100; const isColumnLayout = options.layout.startsWith("column"); return ( ( {line}
))} position="right-start" multiline disabled={options.descriptionDisplayMode !== "tooltip" || !app.description || isEditMode} styles={{ tooltip: { maxWidth: 300 } }} > {options.showTitle && ( {app.name} )} {options.descriptionDisplayMode === "normal" && ( {app.description?.split("\n").map((line, index) => ( {line}
))}
)}
{options.pingEnabled && !settings.forceDisableStatus && !board.disableStatus && app.href ? ( }> ) : null}
); } interface AppLinkProps { href: string | undefined; openInNewTab: boolean; enabled: boolean; } const AppLink = ({ href, openInNewTab, enabled, children }: PropsWithChildren) => enabled ? ( {children} ) : ( children );