diff --git a/apps/desktop/src/lib/trpc/routers/device.ts b/apps/desktop/src/lib/trpc/routers/device.ts new file mode 100644 index 00000000000..d44be13f707 --- /dev/null +++ b/apps/desktop/src/lib/trpc/routers/device.ts @@ -0,0 +1,10 @@ +import { getHostId } from "@superset/shared/host-info"; +import { publicProcedure, router } from ".."; + +export const createDeviceRouter = () => { + return router({ + getMachineId: publicProcedure.query((): { machineId: string } => { + return { machineId: getHostId() }; + }), + }); +}; diff --git a/apps/desktop/src/lib/trpc/routers/index.ts b/apps/desktop/src/lib/trpc/routers/index.ts index d66c6b82385..485db2acd35 100644 --- a/apps/desktop/src/lib/trpc/routers/index.ts +++ b/apps/desktop/src/lib/trpc/routers/index.ts @@ -18,6 +18,7 @@ import { createChatRuntimeServiceRouter } from "./chat-runtime-service"; import { createChatServiceRouter } from "./chat-service"; import { createConfigRouter } from "./config"; import { createDatabasesRouter } from "./databases"; +import { createDeviceRouter } from "./device"; import { createDiagnosticsRouter } from "./diagnostics"; import { createDockerRouter } from "./docker"; import { createExtensionsRouter } from "./extensions"; @@ -82,6 +83,7 @@ export const createAppRouter = ( settings: createSettingsRouter(), config: createConfigRouter(), databases: createDatabasesRouter(), + device: createDeviceRouter(), diagnostics: createDiagnosticsRouter(), docker: createDockerRouter(), uiState: createUiStateRouter(), diff --git a/apps/desktop/src/renderer/hooks/useIsV2CloudEnabled.ts b/apps/desktop/src/renderer/hooks/useIsV2CloudEnabled.ts index a951d5d7e5e..19742f6c014 100644 --- a/apps/desktop/src/renderer/hooks/useIsV2CloudEnabled.ts +++ b/apps/desktop/src/renderer/hooks/useIsV2CloudEnabled.ts @@ -2,6 +2,8 @@ import { FEATURE_FLAGS } from "@superset/shared/constants"; import { useFeatureFlagEnabled } from "posthog-js/react"; import { useV2LocalOverrideStore } from "renderer/stores/v2-local-override"; +const IS_DEV = process.env.NODE_ENV === "development"; + /** * Returns effective v2 state: remote PostHog flag AND local opt-in. * Also returns the raw remote flag so the toggle can be shown conditionally. @@ -11,6 +13,13 @@ export function useIsV2CloudEnabled() { useFeatureFlagEnabled(FEATURE_FLAGS.V2_CLOUD) ?? false; const optInV2 = useV2LocalOverrideStore((s) => s.optInV2); + if (IS_DEV) { + return { + isV2CloudEnabled: true, + isRemoteV2Enabled: true, + }; + } + return { /** The effective value — use this wherever you previously checked the flag directly. */ isV2CloudEnabled: remoteV2Enabled && optInV2, diff --git a/apps/desktop/src/renderer/lib/host-service-client.ts b/apps/desktop/src/renderer/lib/host-service-client.ts index f4e12cb57cd..737b79c4032 100644 --- a/apps/desktop/src/renderer/lib/host-service-client.ts +++ b/apps/desktop/src/renderer/lib/host-service-client.ts @@ -1,5 +1,5 @@ import type { AppRouter } from "@superset/host-service"; -import { createTRPCClient, httpBatchLink } from "@trpc/client"; +import { createTRPCClient, httpLink } from "@trpc/client"; import superjson from "superjson"; import { getHostServiceHeaders } from "./host-service-auth"; @@ -20,7 +20,7 @@ export function getHostServiceClientByUrl(hostUrl: string): HostServiceClient { const client = createTRPCClient({ links: [ - httpBatchLink({ + httpLink({ url: `${hostUrl}/trpc`, transformer: superjson, headers: () => getHostServiceHeaders(hostUrl), diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx index d918461f319..df88826a400 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/components/TopBar/components/OrganizationDropdown/OrganizationDropdown.tsx @@ -1,5 +1,6 @@ import { COMPANY } from "@superset/shared/constants"; import { Avatar } from "@superset/ui/atoms/Avatar"; +import { Badge } from "@superset/ui/badge"; import { DropdownMenu, DropdownMenuContent, @@ -27,6 +28,7 @@ import { } from "react-icons/hi2"; import { IoBugOutline } from "react-icons/io5"; import { LuKeyboard } from "react-icons/lu"; +import { useCurrentPlan } from "renderer/hooks/useCurrentPlan"; import { useHotkeyDisplay } from "renderer/hotkeys"; import { authClient } from "renderer/lib/auth-client"; import { electronTrpc } from "renderer/lib/electron-trpc"; @@ -69,6 +71,18 @@ export function OrganizationDropdown({ const userName = session?.user?.name; const displayName = activeOrganization?.name ?? userName ?? "Organization"; + const currentPlan = useCurrentPlan(); + const isPaid = currentPlan !== "free"; + const planLabel = currentPlan.charAt(0).toUpperCase() + currentPlan.slice(1); + const planBadge = isPaid ? ( + + {planLabel} + + ) : null; + const triggerButton = variant === "collapsed" ? ( ) : ( @@ -113,6 +128,7 @@ export function OrganizationDropdown({ {displayName} + {planBadge} ); diff --git a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/SessionSelector/SessionSelector.tsx b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/SessionSelector/SessionSelector.tsx index eeccd16f790..cbccee3a151 100644 --- a/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/SessionSelector/SessionSelector.tsx +++ b/apps/desktop/src/renderer/routes/_authenticated/_dashboard/v2-workspace/$workspaceId/hooks/usePaneRegistry/components/ChatPane/components/SessionSelector/SessionSelector.tsx @@ -116,7 +116,7 @@ export function SessionSelector({