import FullPageLoader from "@/components/fullPageLoader";
import { Badge } from "@/components/ui/badge";
import { setSelectedPlugin, useAppDispatch, useGetPluginsQuery } from "@/lib/store";
import { cn } from "@/lib/utils";
import { useTheme } from "next-themes";
import { useQueryState } from "nuqs";
import { useEffect, useMemo } from "react";
import BigQueryView from "./plugins/bigqueryView";
import DatadogView from "./plugins/datadogView";
import MaximView from "./plugins/maximView";
import NewrelicView from "./plugins/newRelicView";
import OtelView from "./plugins/otelView";
import PrometheusView from "./plugins/prometheusView";
type SupportedPlatform = {
id: string;
name: string;
icon: React.ReactNode;
tag?: string;
disabled?: boolean;
};
const supportedPlatformsList = (resolvedTheme: string): SupportedPlatform[] => [
{
id: "otel",
name: "Open Telemetry",
icon: (
),
},
{
id: "prometheus",
name: "Prometheus",
icon: ,
},
{
id: "maxim",
name: "Maxim",
icon:
,
},
{
id: "datadog",
name: "Datadog",
icon:
,
},
{
id: "bigquery",
name: "BigQuery",
icon: ,
},
{
id: "newrelic",
name: "New Relic",
icon: (
),
disabled: true,
},
];
export default function ObservabilityView() {
const dispatch = useAppDispatch();
const { data: plugins, isLoading } = useGetPluginsQuery();
const [selectedPluginId, setSelectedPluginId] = useQueryState("plugin");
const { resolvedTheme } = useTheme();
const supportedPlatforms = useMemo(() => supportedPlatformsList(resolvedTheme || "light"), [resolvedTheme]);
// Map UI tab IDs to actual plugin names (prometheus tab uses telemetry plugin)
const getPluginNameForTab = (tabId: string) => (tabId === "prometheus" ? "telemetry" : tabId);
useEffect(() => {
if (!plugins || plugins.length === 0) return;
if (!selectedPluginId) {
setSelectedPluginId(supportedPlatforms[0].id);
} else {
const pluginName = getPluginNameForTab(selectedPluginId);
const plugin = plugins.find((plugin) => plugin.name === pluginName) ?? {
name: selectedPluginId,
enabled: false,
config: {},
isCustom: false,
path: "",
};
dispatch(setSelectedPlugin(plugin));
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [plugins]);
useEffect(() => {
if (selectedPluginId) {
const pluginName = getPluginNameForTab(selectedPluginId);
const plugin = plugins?.find((plugin) => plugin.name === pluginName) ?? {
name: selectedPluginId,
enabled: false,
config: {},
isCustom: false,
path: "",
};
dispatch(setSelectedPlugin(plugin));
} else {
setSelectedPluginId(supportedPlatforms[0].id);
}
}, [selectedPluginId]);
if (isLoading) {
return