Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/app/(loading-group)/setup/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand All @@ -30,6 +31,12 @@ export default function SetupOrg() {
if (session.session === null) {
redirect("/login");
}

const instanceSettings = useInstanceSettings();
if (instanceSettings?.singleOrganizationMode) {
Comment thread
refoo0 marked this conversation as resolved.
redirect("/join");
}

return (
<Page title="Setup Your Organization">
<div className="">
Expand Down
22 changes: 14 additions & 8 deletions src/components/OrganizationDropDown.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand All @@ -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];
Expand Down Expand Up @@ -134,7 +136,7 @@ export const OrganizationDropDown = () => {
<DropdownMenuTrigger className="rounded-lg focus:ring py-2 px-1 text-header-foreground transition-all hover:bg-white/10">
<ChevronUpDownIcon className="block h-7 w-7 p-1" />
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuContent align="end" className="min-w-48">
<DropdownMenuGroup>
<DropdownMenuLabel className="text-xs text-muted-foreground">
Organizations
Expand Down Expand Up @@ -169,13 +171,17 @@ export const OrganizationDropDown = () => {
</>
)}
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleNavigateToSetupOrg}>
<div className="mr-2 flex items-center justify-center rounded-md border bg-background p-1">
<PlusIcon className="h-4 w-4 text-muted-foreground" />
</div>
Create Organization
</DropdownMenuItem>
{!instanceSettings?.singleOrganizationMode && (
<>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={handleNavigateToSetupOrg}>
<div className="mr-2 flex items-center justify-center rounded-md border bg-background p-1">
<PlusIcon className="h-4 w-4 text-muted-foreground" />
</div>
Create Organization
</DropdownMenuItem>
</>
)}
Comment thread
refoo0 marked this conversation as resolved.
</DropdownMenuContent>
</DropdownMenu>
</div>
Expand Down
49 changes: 26 additions & 23 deletions src/components/common/RootHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
<DynamicHeader
z={1}
Title={null}
menu={[
{
title: "Create Organization",
href: "/setup",
Icon: PlusIcon,
},
{
title: "Join Organization",
href: "/join",
Icon: ArrowRightEndOnRectangleIcon,
},
{
title: "User-Settings",
href: "/user-settings",
Icon: CogIcon,
},
]}
/>
);
const instanceSettings = useInstanceSettings();

const menu = [
...(!instanceSettings?.singleOrganizationMode
? [
{
title: "Create Organization",
href: "/setup",
Icon: PlusIcon,
},
]
: []),
Comment thread
refoo0 marked this conversation as resolved.
{
title: "Join Organization",
href: "/join",
Icon: ArrowRightEndOnRectangleIcon,
},
{
title: "User-Settings",
href: "/user-settings",
Icon: CogIcon,
},
];

return <DynamicHeader z={1} Title={null} menu={menu} />;
}
20 changes: 20 additions & 0 deletions src/hooks/useInstanceSettings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { useEffect, useState } from "react";
import { browserApiClient } from "../services/devGuardApi";
import type { InstanceSettings } from "@/types/api/api";

export const useInstanceSettings = () => {
const [instanceSettings, setInstanceSettings] =
useState<InstanceSettings | null>(null);

useEffect(() => {
browserApiClient("/instance-settings/")
.then((res) => {
if (res.ok) return res.json();
})
.then((data: InstanceSettings) => {
Comment thread
refoo0 marked this conversation as resolved.
Outdated
if (data) setInstanceSettings(data);
});
}, []);

return instanceSettings;
Comment thread
refoo0 marked this conversation as resolved.
Outdated
};
Comment thread
refoo0 marked this conversation as resolved.
Outdated
3 changes: 3 additions & 0 deletions src/types/api/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,9 @@ export interface Paged<T> {
pageSize: number;
}

export type InstanceSettings = {
singleOrganizationMode: boolean;
};
export interface MinimalDependencyTree {
nodes: string[];
dependencies: { [key: string]: string[] };
Expand Down
Loading