"use client"; import type { PropsWithChildren } from "react"; import { Suspense } from "react"; import { Flex, Text, Tooltip, UnstyledButton } from "@mantine/core"; import { IconLoader } from "@tabler/icons-react"; import combineClasses from "clsx"; import { clientApi } from "@homarr/api/client"; import { parseAppHrefWithVariablesClient } from "@homarr/common/client"; import { useRegisterSpotlightContextResults } from "@homarr/spotlight"; import { useI18n } from "@homarr/translation/client"; 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 }: WidgetComponentProps<"app">) { const t = useI18n(); const [app] = clientApi.app.byId.useSuspenseQuery( { id: options.appId, }, { refetchOnMount: false, refetchOnWindowFocus: false, refetchOnReconnect: false, retry: false, }, ); useRegisterSpotlightContextResults( `app-${app.id}`, [ { id: app.id, name: app.name, icon: app.iconUrl, interaction() { return { type: "link", href: parseAppHrefWithVariablesClient(app.href ?? ""), newTab: options.openInNewTab, }; }, }, ], [app, options.openInNewTab], ); return ( {options.showTitle && ( {app.name} )} {app.name} {options.pingEnabled && app.href ? ( }> ) : null} ); } interface AppLinkProps { href: string; openInNewTab: boolean; enabled: boolean; } const AppLink = ({ href, openInNewTab, enabled, children }: PropsWithChildren) => enabled ? ( {children} ) : ( children );