diff --git a/src/app/(loading-group)/setup/page.tsx b/src/app/(loading-group)/setup/page.tsx index eb5dd6a77..5c518f96b 100644 --- a/src/app/(loading-group)/setup/page.tsx +++ b/src/app/(loading-group)/setup/page.tsx @@ -19,6 +19,7 @@ import Page from "@/components/Page"; import { useSession } from "../../../context/SessionContext"; import { redirect } from "next/navigation"; import dynamic from "next/dynamic"; +import { useInstanceSettings } from "@/hooks/useInstanceSettings"; const Lanyard = dynamic( () => import("@/components/misc/Lanyard").then((mod) => mod.default), @@ -30,6 +31,12 @@ export default function SetupOrg() { if (session.session === null) { redirect("/login"); } + + const instanceSettings = useInstanceSettings(); + if (instanceSettings?.singleOrganizationMode) { + redirect("/join"); + } + return (
diff --git a/src/components/OrganizationDropDown.tsx b/src/components/OrganizationDropDown.tsx index d31736b0c..105762c7d 100644 --- a/src/components/OrganizationDropDown.tsx +++ b/src/components/OrganizationDropDown.tsx @@ -35,6 +35,7 @@ import { } from "./ui/dropdown-menu"; import { useSession, useUpdateSession } from "../context/SessionContext"; import { useActiveOrg } from "../hooks/useActiveOrg"; +import { useInstanceSettings } from "../hooks/useInstanceSettings"; const activeOrgName = (name: string, slug: string) => { if (slug === "@opencode") { @@ -52,6 +53,7 @@ export const OrganizationDropDown = () => { const user = useCurrentUser(); const router = useRouter(); + const instanceSettings = useInstanceSettings(); let activeOrg = useActiveOrg() as OrganizationDTO | null; if (!activeOrg && orgs.length > 0) { activeOrg = orgs[0]; @@ -134,7 +136,7 @@ export const OrganizationDropDown = () => { - + Organizations @@ -169,13 +171,17 @@ export const OrganizationDropDown = () => { )} - - -
- -
- Create Organization -
+ {!instanceSettings?.singleOrganizationMode && ( + <> + + +
+ +
+ Create Organization +
+ + )}
diff --git a/src/components/common/RootHeader.tsx b/src/components/common/RootHeader.tsx index 5afcbd23f..b0a2b5c39 100644 --- a/src/components/common/RootHeader.tsx +++ b/src/components/common/RootHeader.tsx @@ -7,30 +7,33 @@ import { CogIcon, PlusIcon, } from "@heroicons/react/24/outline"; +import { useInstanceSettings } from "@/hooks/useInstanceSettings"; import DynamicHeader from "./DynamicHeader"; export default function RootHeader() { - return ( - - ); + const instanceSettings = useInstanceSettings(); + + const menu = [ + ...(!instanceSettings?.singleOrganizationMode + ? [ + { + title: "Create Organization", + href: "/setup", + Icon: PlusIcon, + }, + ] + : []), + { + title: "Join Organization", + href: "/join", + Icon: ArrowRightEndOnRectangleIcon, + }, + { + title: "User-Settings", + href: "/user-settings", + Icon: CogIcon, + }, + ]; + + return ; } diff --git a/src/hooks/useInstanceSettings.ts b/src/hooks/useInstanceSettings.ts new file mode 100644 index 000000000..2fee3139e --- /dev/null +++ b/src/hooks/useInstanceSettings.ts @@ -0,0 +1,11 @@ +import useSWR from "swr"; +import { browserApiClient } from "../services/devGuardApi"; +import type { InstanceSettings } from "@/types/api/api"; + +const fetcher = (url: string) => + browserApiClient(url).then((res) => (res.ok ? res.json() : null)); + +export const useInstanceSettings = () => { + const { data } = useSWR("/instance-settings/", fetcher); + return data ?? null; +}; diff --git a/src/types/api/api.ts b/src/types/api/api.ts index 6110af71a..3e67d4199 100644 --- a/src/types/api/api.ts +++ b/src/types/api/api.ts @@ -221,6 +221,9 @@ export interface Paged { pageSize: number; } +export type InstanceSettings = { + singleOrganizationMode: boolean; +}; export interface MinimalDependencyTree { nodes: string[]; dependencies: { [key: string]: string[] };