"use client";
import { useEnvContext } from "@app/hooks/useEnvContext";
import { useUserContext } from "@app/hooks/useUserContext";
import { build } from "@server/build";
import {
BellRing,
Building2,
Globe,
GlobeLock,
KeyRound,
MonitorUp,
Plus,
SunMoon,
UserPlus
} from "lucide-react";
import { useTheme } from "next-themes";
import { usePathname } from "next/navigation";
import type { ReactNode } from "react";
import { useMemo } from "react";
import { useTranslations } from "next-intl";
import { ListUserOrgsResponse } from "@server/routers/org";
export type CommandPaletteAction = {
id: string;
label: string;
icon: ReactNode;
href?: string;
onSelect?: () => void;
};
export function useCommandPaletteActions(
orgId?: string,
orgs?: ListUserOrgsResponse["orgs"]
): CommandPaletteAction[] {
const t = useTranslations();
const pathname = usePathname();
const { env } = useEnvContext();
const { user } = useUserContext();
const { setTheme, theme } = useTheme();
const isAdminPage = pathname?.startsWith("/admin");
return useMemo(() => {
const actions: CommandPaletteAction[] = [];
function cycleTheme() {
const currentTheme = theme || "system";
if (currentTheme === "light") {
setTheme("dark");
} else if (currentTheme === "dark") {
setTheme("system");
} else {
setTheme("light");
}
}
if (isAdminPage) {
actions.push({
id: "create-admin-api-key",
label: t("commandPaletteCreateApiKey"),
icon: ,
href: "/admin/api-keys/create"
});
if (
build === "oss" ||
env?.app.identityProviderMode === "global" ||
env?.app.identityProviderMode === undefined
) {
actions.push({
id: "create-admin-idp",
label: t("commandPaletteCreateIdentityProvider"),
icon: ,
href: "/admin/idp/create"
});
}
} else if (orgId) {
actions.push({
id: "create-site",
label: t("commandPaletteCreateSite"),
icon: ,
href: `/${orgId}/settings/sites/create`
});
actions.push({
id: "create-proxy-resource",
label: t("commandPaletteCreateProxyResource"),
icon: ,
href: `/${orgId}/settings/resources/proxy/create`
});
actions.push({
id: "create-private-resource",
label: t("commandPaletteCreatePrivateResource"),
icon: ,
href: `/${orgId}/settings/resources/private/create`
});
actions.push({
id: "create-machine-client",
label: t("commandPaletteCreateMachineClient"),
icon: ,
href: `/${orgId}/settings/clients/machine/create`
});
actions.push({
id: "create-user",
label: t("commandPaletteCreateUser"),
icon: ,
href: `/${orgId}/settings/access/users/create`
});
actions.push({
id: "create-api-key",
label: t("commandPaletteCreateApiKey"),
icon: ,
href: `/${orgId}/settings/api-keys/create`
});
if (!env?.flags.disableEnterpriseFeatures) {
actions.push({
id: "create-alert-rule",
label: t("commandPaletteCreateAlertRule"),
icon: ,
href: `/${orgId}/settings/alerting/create`
});
}
if (
(build === "oss" && !env?.flags.disableEnterpriseFeatures) ||
build === "saas" ||
env?.app.identityProviderMode === "org" ||
(env?.app.identityProviderMode === undefined && build !== "oss")
) {
actions.push({
id: "create-idp",
label: t("commandPaletteCreateIdentityProvider"),
icon: ,
href: `/${orgId}/settings/idp/create`
});
}
}
actions.push({
id: "toggle-theme",
label: t("commandPaletteToggleTheme"),
icon: ,
onSelect: cycleTheme
});
if (user.serverAdmin && !isAdminPage) {
actions.push({
id: "go-admin",
label: t("serverAdmin"),
icon: ,
href: "/admin/users"
});
}
return actions;
}, [isAdminPage, orgId, orgs, env, user.serverAdmin, theme, setTheme, t]);
}